码迷,mamicode.com
首页 > 其他好文 > 详细

一款强大的Office插件,教你如何自动生成Excel图表

时间:2015-05-10 23:44:04      阅读:2450      评论:0      收藏:0      [点我收藏+]

标签:

项目背景:

 在项目里面需要根据数据进行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");

效果图

技术分享

总结

  1. 这款Spire.xls组件在变量的命名上面比NPOI的命名优化,能够直接根据英文名称得知该变量的作用是什么。
  2. 这款Spire.xls组件在拼写Excel上比较简单。几行代码就可以生成Excel。
  3. 当然这款软件也可以支持其他的图表类型,例如饼图、曲线图、柱状图等等。

结束语

    在这里感谢@asxinyu,没有这位的大神之前博客的分析,也就没有这篇博客的诞生,也感谢他对我的指导,让我在遇到问题的时候,多看看官网的帮助文档,谢谢你!也感谢博客园的平台,让每个人都能有接近大神的机会,也祝愿博客园越办越好!2015.05.10 22:00

【版权所有@落叶飞逝的恋博客地址http://www.cnblogs.com/strivelearn/可以转载,注明出处.

 

一款强大的Office插件,教你如何自动生成Excel图表

标签:

原文地址:http://www.cnblogs.com/strivelearn/p/4493210.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!