项目背景:
在项目里面需要根据数据进行Excel的导出,但有时候不仅仅需要导出数据,而且还需要根据数据进行生成图表进行展示。之前的做法是先在模板里面进行公式的设定如下图1.1。这样就会遇到一个问题,那就是有一天需要不断的增加部门,一个两个还好,若突然需要加十几个或者二十几个,或者不是以部门为纵轴,那么可想而知改动就比较麻烦了,需要不断的修改模板,并且上传,而且这样的改法也比较死板,不适合。1.1图
如何解决
第一步:先查阅目前项目中所使用的NPOI相关的文档,看这个能不能支持相关的操作。很遗憾,没有找到相关类似的解决方案(希望大伙给予指点)。
第二步:Google下看看能不能找到相关的之前解决的文章。查阅了一些论坛都没有这方面的都没有类似的解决方案,就在要放弃的时候突然发现了@asxinyu大神的文章,是"C#操作Excel组件Spire.XLS系列文章目录"。突然之间就如同发现新大陆一样,兴奋不已。于是请教@asxinyu,给我回答就是Spire.xls操作图标就是太容易了。由于大神的那篇如何自动生成图表的还没发表。只有按照大神给我的这个组件的官网,我去先研究了Spire.xls。
NPOI与Spire.xls的区别
关于这两者的区别,我就不在这里累赘叙述了,有兴趣的可以查阅.NET读写Excel工具Spire.Xls使用(1)入门介绍。这里详细的介绍了关于两者的区别。
生成Excel文件
//读取事先创建的模板,里面的可以创建空的行与列,这样的好处就是避免在代码里面写多余创建行与列的代码 FileStream stream = new FileStream(@"C:\Projects\SpirexlsDemo\SpirexlsDemo\Template\exportTempate.xls", FileMode.Open, FileAccess.Read); //引用spirexls组件创建excel Workbook workbook = new Workbook(); //将事先的模板的流载入excel中 workbook.LoadFromStream(stream); //根据需求获取所需要的sheet Worksheet sheet = workbook.Worksheets[0]; |
这边我读取的文档也是模板,只不过我这边的模板是里面的插入了多个空的行数的Excel,因为这样的好处就是避免在代码里面进行创建行与列了。
创建Excel内容
public class CompanyData { /// <summary> /// 公司名称 /// </summary> public string CompanyName { get; set; } } //模拟创建公司的集合 var companys = CreateCompanyData(); //月报的计算当月的实际天数 int days = DateTime.DaysInMonth(2015, 2); //读取事先创建的模板,里面的可以创建空的行与列,这样的好处就是避免在代码里面写多余创建行与列的代码 FileStream stream = new FileStream(@"C:\Projects\SpirexlsDemo\SpirexlsDemo\Template\exportTempate.xls", FileMode.Open, FileAccess.Read); //引用spirexls组件创建excel Workbook workbook = new Workbook(); //将事先的模板的流载入excel中 workbook.LoadFromStream(stream); //根据需求获取所需要的sheet Worksheet sheet = workbook.Worksheets[0]; //获取表格的title行 CellRange titleRow = sheet.Rows[0]; //设置标题 titleRow.Text = "HelloWorldExport"; //副标题 CellRange subtitleRow = sheet.Rows[1]; subtitleRow.Columns[0].Text = "公司名称"; int lastRow = companys.Count + 2; int lastColumns = days + 1; CellRange sumRow = sheet.Rows[lastRow]; sumRow.Columns[0].Text = "总和"; string sumFormula= string.Empty; //数据的最后一行 CellRange valueLastRow = sheet.Rows[lastRow - 1]; //数据的第一行 CellRange valueFirstRow = sheet.Rows[2]; Random myRandom = new Random(); for (int i = 0; i < companys.Count; i++) { //获取需要填写值得行 CellRange valueRow = sheet.Rows[i + 2]; //设置文本 valueRow.Columns[0].Text = companys[i].CompanyName; for (int j = 1; j <= days; j++) { subtitleRow.Columns[j].Text = string.Format("{0}天", j); valueRow.Columns[j].Value = string.Format("{0}", myRandom.Next(1, 500000)); } } |
根据数据源创建生成Excel内容,有不懂得可以看代码注释。这是遇到一个问题,总计的怎么算?如何获取到上面的具体坐标?于是查阅了官网文档,得知在代码里面配置Formula。这时第一个问题解决了。如何获取总计上面的一列所有单元格的具体坐标。这时在官网的没有查阅到,只好用F12进入源码查看,也终于找到了,代码在下:
//valueRow.RangeAddress "‘Sheet1‘!A3:AE3" //valueFirstRow.RangeAddressLocal A3:AE3 //valueFirstRow.Columns[1].RangeAddressLocal B3; var firstColumnsLocal = valueFirstRow.Columns[j].RangeAddressLocal; var lastColumnsLocal = valueLastRow.Columns[j].RangeAddressLocal; sumFormula = string.Format("=Sum({0}:{1})", firstColumnsLocal, lastColumnsLocal); subtitleRow.Columns[j].Text = string.Format("{0}天", j); valueRow.Columns[j].Value = string.Format("{0}", myRandom.Next(1, 500000)); sumRow.Columns[j].Formula = sumFormula; |
创建折线图
根据上面的,Excel的数据源也准备好了,下面就来获取数据源来装载图标。
//像excel中插入图形 Chart excelChart = sheet.Charts.Add(); //设置Excel的图形样式 excelChart.ChartType = ExcelChartType.Line; //Excel折线图的取值范围 excelChart.DataRange = sheet.Range[2, 1, lastRow, lastColumns]; //插入的Excel图标的顶部位置 excelChart.TopRow = lastRow + 2; workbook.SaveToFile("SpirexmlDemo.xls"); |
效果图
|
总结
- 这款Spire.xls组件在变量的命名上面比NPOI的命名优化,能够直接根据英文名称得知该变量的作用是什么。
- 这款Spire.xls组件在拼写Excel上比较简单。几行代码就可以生成Excel。
- 当然这款软件也可以支持其他的图表类型,例如饼图、曲线图、柱状图等等。
结束语
在这里感谢@asxinyu,没有这位的大神之前博客的分析,也就没有这篇博客的诞生,也感谢他对我的指导,让我在遇到问题的时候,多看看官网的帮助文档,谢谢你!也感谢博客园的平台,让每个人都能有接近大神的机会,也祝愿博客园越办越好!2015.05.10 22:00
【版权所有@落叶飞逝的恋博客地址http://www.cnblogs.com/strivelearn/】可以转载,注明出处.