前言

对于使用C#程序生成Excel文件,我经历了以下几个阶段,强烈推荐使用Spire.XLS:

  1. Microsoft.Office.Interop.Excel.dll
  2. EPPlus.dll
  3. Spire.XLS.dll

对于Spire.XLS的免费版本,Free Spire.XLS有以下限制,但一般够用了,其官网说明如下

免费 Spire.XLS 感兴趣。它是完全免费的,没有任何警告消息供您商业和个人使用。
免费版限于每个工作簿5张和每张200行。在读取或写入XLS或PDF文件期间会强制执行此限制。
从Free Spire.XLS v7.8开始,加载和保存.xlsx文件格式没有任何限制。
将Excel文件转换为PDF文件时,只能获取PDF文件的前3页。

DLL引用

使用NuGet搜索FreeSpire.XLS安装到项目即可

我们用下图的一个表格,来做示例代码操作

代码如下

using Spire.Xls;
using Spire.Xls.Charts;
using System;
using System.Data;
using System.Drawing;namespace Spire_XLS_Demo
{class Program{static void Main(string[] args){//定义Excel保存路径,在临时目录中string strFileName = System.IO.Path.GetTempPath() + "DEMO_" + DateTime.Now.ToString("yyyyMMdd_hhmmss") + ".xlsx";//实例化ExcelWorkbook book = new Workbook();book.DefaultFontName = "Arial";Worksheet sheet1 = book.Worksheets[0];Worksheet sheet2 = book.Worksheets[1];//删除自动创建的Sheet3book.Worksheets[2].Remove();//加载数据DataTable dtMyData = GetMyData();//保存数据sheet1.Range[2, 2].Value2 = "我的销售额 2019";sheet1.Range[3, 2].Value2 = "月份";sheet1.Range[3, 3].Value2 = "销售额";sheet1.Range[3, 4].Value2 = "利润率";for (int i = 0; i < dtMyData.Rows.Count; i++){sheet1.Range[4 + i, 2].Value2 = dtMyData.Rows[i]["月份"];sheet1.Range[4 + i, 2].NumberFormat = "yyyy年mm月";       //设置文本格式为日期sheet1.Range[4 + i, 3].Value2 = dtMyData.Rows[i]["销售额"];sheet1.Range[4 + i, 3].NumberFormat = "0,0";            //设置文本格式为金额(千分位)sheet1.Range[4 + i, 4].Value2 = dtMyData.Rows[i]["利润率"];sheet1.Range[4 + i, 4].NumberFormat = "0.00%";          //设置文本格式为百分比}//Style设置sheet1.Range[2, 2, 2, 4].Merge();sheet1.Range[2, 2, 2, 4].Style.Font.Size = 16;sheet1.Range[2, 2, 2, 4].Style.Font.IsBold = true;sheet1.Range[2, 2, 2, 4].Style.Font.IsItalic = true;sheet1.Range[2, 2, 2, 4].Style.Color = Color.FromArgb(255, 192, 0);sheet1.Range[3, 2, 3, 4].Style.Color = Color.GreenYellow;sheet1.Range[3, 2, 3, 4].HorizontalAlignment = HorizontalAlignType.Center;//边框设置for (int iRow = 3; iRow <= dtMyData.Rows.Count + 3; iRow++){for (int iCol = 2; iCol <= 4; iCol++){sheet1.Range[iRow, iCol].Style.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;sheet1.Range[iRow, iCol].Style.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;sheet1.Range[iRow, iCol].Style.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;sheet1.Range[iRow, iCol].Style.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;}}//自适应列for (int i = 2; i <= 4; i++){sheet1.AutoFitColumn(i);}//自适应行sheet1.AutoFitRow(2);//产生ChartChart chart1 = sheet1.Charts.Add();chart1.DataRange = sheet1.Range[3, 2, dtMyData.Rows.Count + 3, 4];chart1.SeriesDataFromRange = false;chart1.LeftColumn = 6;chart1.RightColumn = 15;chart1.TopRow = 2;chart1.BottomRow = 20;ChartSerie cs1 = chart1.Series[0];ChartSerie cs2 = chart1.Series[1];cs1.SerieType = ExcelChartType.ColumnClustered; //柱形图cs2.SerieType = ExcelChartType.LineMarkers; //折线图chart1.SecondaryCategoryAxis.IsMaxCross = true;//使用副坐标轴cs2.UsePrimaryAxis = false;//图表标题chart1.ChartTitle = "我的销售额 2019";//透视表PivotCache pivotCache = book.PivotCaches.Add(sheet1.Range[3, 2, dtMyData.Rows.Count + 3, 4]);PivotTable pivotTable = sheet2.PivotTables.Add("2019Summry", sheet2.Range["A1"], pivotCache);//设置行列值pivotTable.PivotFields[0].Axis = AxisTypes.Row;pivotTable.PivotFields[1].Axis = AxisTypes.Column;pivotTable.PivotFields[2].Axis = AxisTypes.Data;//添加汇总pivotTable.DataFields.Add(pivotTable.PivotFields[2], "Demo Pivot", SubtotalTypes.Sum);//设置标题pivotTable.Options.RowHeaderCaption = "日期";pivotTable.Options.ColumnHeaderCaption = "销售额";//设置透视表样式pivotTable.Options.RowLayout = PivotTableLayoutType.Tabular;//保存Excel,主要要选择相应的Excel版本book.SaveToFile(strFileName, ExcelVersion.Version2013);//打开生成的Excel文件System.Diagnostics.Process.Start(strFileName);}//模拟数据static DataTable GetMyData(){DataTable dt = new DataTable("我的销售额");dt.Columns.Add("月份", typeof(DateTime));dt.Columns.Add("主打产品", typeof(string));dt.Columns.Add("销售额", typeof(double));dt.Columns.Add("利润率", typeof(double));DataRow dr;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 1, 1); dr["主打产品"] = "手机"; dr["销售额"] = 21469; dr["利润率"] = 0.32;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 2, 1); dr["主打产品"] = "电脑"; dr["销售额"] = 36224; dr["利润率"] = 0.45;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 3, 1); dr["主打产品"] = "电视"; dr["销售额"] = 24619; dr["利润率"] = 0.35;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 4, 1); dr["主打产品"] = "手机"; dr["销售额"] = 35478; dr["利润率"] = 0.36;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 5, 1); dr["主打产品"] = "电视"; dr["销售额"] = 37168; dr["利润率"] = 0.48;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 6, 1); dr["主打产品"] = "电脑"; dr["销售额"] = 37034; dr["利润率"] = 0.36;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 7, 1); dr["主打产品"] = "手机"; dr["销售额"] = 43200; dr["利润率"] = 0.29;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 8, 1); dr["主打产品"] = "电脑"; dr["销售额"] = 19159; dr["利润率"] = 0.36;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 9, 1); dr["主打产品"] = "电视"; dr["销售额"] = 30971; dr["利润率"] = 0.34;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 10, 1); dr["主打产品"] = "手机"; dr["销售额"] = 29757; dr["利润率"] = 0.64;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 11, 1); dr["主打产品"] = "电脑"; dr["销售额"] = 13180; dr["利润率"] = 0.45;dr = dt.Rows.Add(); dr["月份"] = new DateTime(2019, 12, 1); dr["主打产品"] = "电视"; dr["销售额"] = 15730; dr["利润率"] = 0.25;return dt;}}
}

重要说明:

引用Spire.XLS时,必须同时引用Spire.Pdf和Spire.License,或将dll文件放在同一目录

解决方案源代码可到资源区下载

其他关于Spire.Xls的操作:

跨列居中:(显示效果类似合并单元格,但是实际并没有合并)

sheet1.Range[2, 3, 2, 6].HorizontalAlignment = HorizontalAlignType.CenterAcrossSelection;

设置折叠分组:

sheet1.GroupByRows(iStartRow, iEndRow, true);

设置冻结窗口:

//冻结首行
sheet1.FreezePanes(2, 1);//冻结首列
sheet1.FreezePanes(1, 2);

透视表刷新:

//手动刷新数据
pt.CalculateData();
//设置打开时自动刷新数据
pt.Cache.IsRefreshOnLoad = true;

设置文档属性:

//设置摘要
book.DocumentProperties.Company = "凯神科技";
book.DocumentProperties.Author = "凯神Jump";
book.DocumentProperties.Title = "财务报表";
//设置自定义属性
book.CustomDocumentProperties.Add("联系电话", "12345678");

搜索替换

if (sheet.FindString("#LotNo#", false, false) != null)
{sheet.Replace("#LotNo#","AA00001");
}

查找单元格

CellRange[] mycells = sheet.FindAllString("mydemostring", False, False);

插入图片

sheet.Pictures.Add(1, 1, bitmap);

隐藏行

sheet.HideRow(1);

插入行

sheet.InsertRow(3, 100, Spire.Xls.InsertOptionsType.FormatAsAfter);
//3:在第3行后面插入,100:插入100行,FormatAsAfter:格式同后面的行,不填此参数则默认样式

设置外边框

sheet.Range[2,2,8,8].BorderAround(LineStyleType.Thin);

激活单元格

sheet.Range["A1"].Activate();

激活Worksheet

sheet.Activate();

隐藏网格线

sheet.GridLinesVisible = false;

有时候如果读取的模板文件中有公式,但是更新数据后,公式字段显示不更新,使用以下代码

foreach( Worksheet sheet in book.Worksheets)
{sheet.ReparseFormula();//在有一次使用上面的方法时,出现了将公式清除的情况,后来使用了下面的方法以刷新公式,生效了sheet.CalculateAllValue();//使用book.CalculateAllValue();也是无效
}

Excel根据列号转string,如:sheet.Range[28,1] --> sheet.Range["C1"]

public string ChangeColumnNoToStr(int num)
{if (num <= 26){return Convert.ToChar(num + 65 - 1).ToString();}else{int x, y;x = 0;y = 0;x = num / 26;y = num % 26;if (y == 0){return Convert.ToChar(x + 65 - 2).ToString() + "Z";}else{return Convert.ToChar(x + 65 - 1).ToString() + Convert.ToChar(y + 65 - 1).ToString();}}
}

源码下载

C#使用FreeSpire.XLS创建Excel相关推荐

  1. .net core 使用 FreeSpire.XLS 实现 excel 转 png - docker 部署

    背景 前后端分离项目, 后端需返回大量数据, 由于样式复杂,导致前端操作卡顿.通过返回图片解决. 踩坑日记 FreeSpire.XLS && Aspose.Cells包都可以实现.实现 ...

  2. Spire.XLS 图表系列教程:C# 如何不使用工作数据创建Excel图表以及Excel雷达图

    更多资源查看:Spire.XLS工作表教程 | Spire.Doc系列教程 | Spire.PDF系列教程 [下载Spire.XLS最新试用版] Spire.XLS for .NET 是一款专业的 . ...

  3. 如何在不安装Microsoft Office的情况下用C#创建Excel(.XLS和.XLSX)文件?

    如何在不使用运行代码的计算机上安装Excel的情况下使用C#创建Excel电子表格? #1楼 我成功地使用了以下开源项目: OOXML格式的ExcelPackage(Office 2007) .XLS ...

  4. 五行代码python 创建Excel(xls)文件以及数据写入

    五行代码python 创建Excel(xls)文件以及数据写入 今天我们采用xlwt来快速创建Excel的文件,一起来看一下代码. import xlwt new_workbook=xlwt.Work ...

  5. java创建excel(不用设置样式,支持xlsx、xls格式, 不支持合并单元格)

    推荐:java 读取excel(支持xlsx.xls格式, 支持合并单元格) java写excel 实现效果 实现思路 基本概念 依赖 对外提供的方法 内部方法 代码实现 测试代码 ExcelWrit ...

  6. 使用Spire.XLS来创建Excel 工作簿

    概要 最近在研究 .NET 控件,使用这些控件能在程序中可以快速低成本实现开发功能.前面提到了如何使用Spire.XLS来制作报表,在这一篇中我 将讲到的是如何用用它来创建一个简单的Excel工作簿. ...

  7. C# 如何创建Excel多级分组

    在Excel中如果能够将具有多级明细的数据进行分组显示,可以清晰地展示数据表格的整体结构,使整个文档具有一定层次感.根据需要设置显示或者隐藏分类数据下的详细信息,在便于数据查看.管理的同时也使文档更具 ...

  8. 使用XML创建Excel文档

    使用XML创建Excel文档            原例子使用VB.Net写的,以下的用C#改写的代码 原文代码: http://www.gotdotnet.com/Community/UserSam ...

  9. Java根据模板创建excel文件

    1.首先导入xml文件,src下建包xml,将student.xml文件放入此文件夹中 [html] view plain copy <excel id="student"  ...

最新文章

  1. 一个研发团队是如何坚持7年技术分享的?
  2. kafka的安装与启动运行
  3. spring-boot-mybatis
  4. make 学习体会(一)
  5. Node.js小白开路(一)-- fs篇
  6. 四位共阳极数码管显示函数_新手求助四位共阳数码管显示函数
  7. html5引擎笔试题,最新!HTML5经典面试题型(附答案)
  8. 第二阶段个人总结1(5.25)
  9. mysql 数据库异常_Mysql连接数据库异常汇总【必收藏】
  10. 关于使用墙外安卓应用
  11. 资源描述框架RDF-阮一峰
  12. SQL Server行列转换
  13. 拓嘉辰丰:拼多多店铺DSR动态评分的更新周期?
  14. mysql 收入_mysql 收支统计问题
  15. WebBrowser 显示Html内容3点细节技巧
  16. 跳转谷歌相册选择图片及视频
  17. Bert超长文本分类、文本摘要
  18. 我的Python学习之路(5)
  19. 还活着哈。 ..:D
  20. 支付系统流程以及防止订单重复提交

热门文章

  1. 金升阳 | 更轻更小的R3系列金属导轨电源 ——LI75/120-23BxxR3
  2. 解决app在没有上传app store前大规模安装测试问题的一些办法与思路
  3. 基于卡尔曼滤波的微电网调度(Matlab代码实现)
  4. android4.4.2 boot,nexus4 4.4.2完美root教程
  5. 使用idea开发时,在SSM框架下进行mapper的自动扫包sqlSessionFactoryBeanName标红,和遇到的错误
  6. 计算机的档案登记表,办公电脑档案登记表.docx
  7. python文件编译为so_Mac上把python源文件编译成so文件
  8. 【华为机试真题详解】数大雁【2022 Q2 | 100分】
  9. 基于规则与统计相结合的互联网突发事件识别研究
  10. java 所有事件类型以及事件实现的方法