C#导出Excel那些事
Excel导出
Excel导出的意义
因为在项目中有些报表数据客户需要导出功能,那么导出为Excel就十分有必要了,可是有些客户的机器上并没有安装Excel或者安装的版本参差不一。那么我们在这样的情况下应该应该怎么做呢?最简单的方法就是引用Excel相关的Com组件就行了,可是这种情况只能在安装了Excel的用户适用,对于没有安装Excel的用户不能强制用户安装吧。那么我们只能将眼光瞄向第三方的类库了,能用的Excel操作导出类库大致有这么三个
- NPOI
- ExcelRepor
aspose.cells
好的,废话不多说,接下来就将这几种导出方法一一道来:首先我们模拟一个数据源
1 private DataTable dt = new DataTable(); 2 3 /// <summary> 4 /// 装载数据 5 /// </summary> 6 private void Inidata() 7 { 8 dt.TableName = "student"; 9 dt.Columns.Add("Name", typeof(string)); 10 dt.Columns.Add("Team", typeof(string)); 11 DataRow dr = dt.NewRow(); 12 DataRow dr1 = dt.NewRow(); 13 dr["Name"] = "科比"; 14 dr["Team"] = "湖人"; 15 dt.Rows.Add(dr); 16 dr1["Name"] = "詹姆斯"; 17 dr1["Team"] = "骑士"; 18 dt.Rows.Add(dr1); 19 list.Add(new Student { Name = "科比", Team = "湖人" }); 20 list.Add(new Student { Name = "詹姆斯", Team = "骑士" }); 21 }
View Code
使用NPOI导出
NPOI 是 POI 项目的 .NET 版本。具体的信息请自行百度。下边是我们公司用的一个NPOI到处的Helper中的片段
1 public class NPOIExportExclHelper 2 { 3 /// <summary> 4 /// 创建一个Excel 5 /// Yakecan 6 /// </summary> 7 /// <returns>返回一个空表格</returns> 8 public HSSFWorkbook InitializeWorkBook() 9 { 10 HSSFWorkbook workBook = new HSSFWorkbook(); 11 DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); 12 SummaryInformation si = PropertySetFactory.CreateSummaryInformation(); 13 14 dsi.Company = "河南xx软件科技有限公司"; 15 dsi.Manager = "Office Word 2003/2007"; 16 17 si.Author = "www.henanluheng.com"; 18 si.Subject = "信息导出"; 19 si.Title = "系统报表"; 20 21 workBook.DocumentSummaryInformation = dsi; 22 workBook.SummaryInformation = si; 23 24 return workBook; 25 } 26 27 28 /// <summary> 29 /// 把指定的DataTable导出Excel 30 /// Yakecan 31 /// </summary> 32 /// <param name="dt">数据源</param> 33 /// <param name="path">导出的路径(包含文件的名称及后缀名)</param> 34 /// <param name="tittle">Sheet的名称</param> 35 public void Export(DataTable dt, string path, string tittle) 36 { 37 HSSFWorkbook workbook = InitializeWorkBook(); 38 ISheet sheet1 = workbook.CreateSheet(tittle); 39 40 IRow titleRow = sheet1.CreateRow(0); 41 titleRow.Height = (short)20 * 25; 42 43 ICellStyle titleStyle = workbook.CreateCellStyle(); 44 titleStyle.Alignment = HorizontalAlignment.Center; 45 titleStyle.VerticalAlignment = VerticalAlignment.Center; 46 IFont font = workbook.CreateFont(); 47 font.FontName = "宋体"; 48 font.FontHeightInPoints = (short)16; 49 titleStyle.SetFont(font); 50 51 NPOI.SS.Util.CellRangeAddress region = new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dt.Columns.Count); 52 sheet1.AddMergedRegion(region); // 添加合并区域 53 54 ICell titleCell = titleRow.CreateCell(0); 55 titleCell.CellStyle = titleStyle; 56 titleCell.SetCellValue(tittle); 57 58 59 IRow headerRow = sheet1.CreateRow(1); 60 ICellStyle headerStyle = workbook.CreateCellStyle(); 61 headerStyle.Alignment = HorizontalAlignment.Center; 62 headerStyle.VerticalAlignment = VerticalAlignment.Center; 63 headerStyle.BorderBottom = BorderStyle.Thin; 64 headerStyle.BorderLeft = BorderStyle.Thin; 65 headerStyle.BorderRight = BorderStyle.Thin; 66 headerStyle.BorderTop = BorderStyle.Thin; 67 IFont titleFont = workbook.CreateFont(); 68 titleFont.FontHeightInPoints = (short)11; 69 titleFont.FontName = "宋体"; 70 headerStyle.SetFont(titleFont); 71 72 headerRow.CreateCell(0).SetCellValue("序号"); 73 headerRow.GetCell(0).CellStyle = headerStyle; 74 75 for (int i = 0; i < dt.Columns.Count; i++) 76 { 77 headerRow.CreateCell(i + 1).SetCellValue(dt.Columns[i].ColumnName); 78 headerRow.GetCell(i + 1).CellStyle = headerStyle; 79 sheet1.SetColumnWidth(i, 256 * 18); 80 } 81 82 ICellStyle bodyStyle = workbook.CreateCellStyle(); 83 bodyStyle.BorderBottom = BorderStyle.Thin; 84 bodyStyle.BorderLeft = BorderStyle.Thin; 85 bodyStyle.BorderRight = BorderStyle.Thin; 86 bodyStyle.BorderTop = BorderStyle.Thin; 87 for (int r = 0; r < dt.Rows.Count; r++) 88 { 89 IRow bodyRow = sheet1.CreateRow(r + 2); 90 bodyRow.CreateCell(0).SetCellValue(r + 1); 91 bodyRow.GetCell(0).CellStyle = bodyStyle; 92 bodyRow.GetCell(0).CellStyle.Alignment = HorizontalAlignment.Center; 93 94 for (int c = 0; c < dt.Columns.Count; c++) 95 { 96 bodyRow.CreateCell(c + 1).SetCellValue(dt.Rows[r][c].ToString()); 97 bodyRow.GetCell(c + 1).CellStyle = bodyStyle; 98 } 99 } 100 101 sheet1.CreateFreezePane(1, 2); 102 103 FileStream fs = new FileStream(path, FileMode.Create); 104 workbook.Write(fs); 105 fs.Flush(); 106 fs.Position = 0; 107 sheet1 = null; 108 headerRow = null; 109 workbook = null; 110 //OutPutExcelStreamOnClient(ms, xlsName); 111 fs.Dispose(); 112 } 113 114 115 }
View Code
好了,接下来让我们来使用一下这个导出的功能,导出代码如下,这些没什么技术含量,F5启动程序查看导出的效果
1 SaveFileDialog savedialog = ShowExportExcelDoalog(); 2 savedialog.FileName = "这是我的测试数据"; 3 if (savedialog.ShowDialog() == DialogResult.OK) 4 { 5 NPOIExportExclHelper excelHelper = new NPOIExportExclHelper(); 6 excelHelper.Export(dt, savedialog.FileName, "这是我的测试数据"); 7 }
OK,这是我们导出的效果图,自动为我们加上了序号这一列,不过整体来说导出的功能还是没有任何问题。不过还是有一点瑕疵,数据的列名还是英文,解决方法也很简单只要我们设置数据源的dt的列头名设置为中国文就行了,dt.Columns["Name"].ColumnName = "姓名"; 设置完成再导出就没问题了。对于我们直男程序员来说这样大致差不多也就完成了任务,可是这样的效果对于真正的生产环境来说还是不行的,因为有些客户还要求导出的Excel要有格式,比如标题高亮啊、数据行每行颜色的高亮。这些怎么办呢,这就用到接下来的方法了。
使用ExcelReport和模板导出
使用模板导出Excel可以实现Excel的数据和样式的分离,虽然NPOI也可以导出的时候设置样式但是代码比较繁琐。
ExcelReport是博客园的一个大神韩兆新捣鼓出来的一个小工具。在QQ群中作者对于使用者遇到的问题和意见还是反馈的很积极的,这点要给作者点个赞的。关于这个控件的具体详细方法还请大家参考作者的一系列博客,下面只是给你导出的最基本的代码。
首先是我们的模板格式
导出代码如下
1 SaveFileDialog saveFileDlg = new SaveFileDialog(); 2 saveFileDlg.Filter = "Excel 2003文件|*.xls|Excel 2007文件|*.xlsx"; 3 4 if (DialogResult.OK.Equals(saveFileDlg.ShowDialog())) 5 { 6 //实例化一个参数容器,并加载模板填充规则文件 7 8 ParameterCollection collection = new ParameterCollection(); 9 10 collection.Load(@"Templete\excelreport.xml"); 11 //实例化一个元素格式化器列表 12 13 List<ElementFormatter> formatters = new List<ElementFormatter>(); 14 15 formatters.Add(new CellFormatter(collection["Sheet1", "time"], "第一次")); //添加一个单元格格式化器 16 //添加一个Table格式化器 17 formatters.Add(new TableFormatter<Student>(collection["Sheet1", "Name"].X, list, 18 new TableColumnInfo<Student>(collection["Sheet1", "Name"].Y, t => t.Name), 19 new TableColumnInfo<Student>(collection["Sheet1", "Team"].Y, t => t.Team)) 20 ); 21 22 //导出文件到本地 23 ExportHelper.ExportToLocal(@"Templete\excelreport.xls", saveFileDlg.FileName, 24 new SheetFormatterContainer("Sheet1", formatters));
使用aspose.cells和模板导出
Aspose是一个非常强大的“收费控件”,我们要用到的是aspose.cells,这个控件的使用不需要引用其他别的控件,其次代码也非常简单。具体的使用方法参考Aspose.Cells 根据Excel模板导出数据统计
模板如下
1 WorkbookDesigner designer = new WorkbookDesigner(); 2 //Server.MapPath("./") 3 string path = System.AppDomain.CurrentDomain.BaseDirectory + "/Templete/aspose.xls"; 4 designer.Open(path); 5 designer.SetDataSource(dt); 6 designer.Process(); 7 //Save the excel file 8 string fileToSave = System.AppDomain.CurrentDomain.BaseDirectory + "Templete/JH_ManageExcel.xls"; 9 if (File.Exists(fileToSave)) 10 { 11 File.Delete(fileToSave); 12 } 13 14 designer.Save(fileToSave, FileFormatType.Excel2003); 15 //打开Excel文件 16 Process.Start(fileToSave);
总结
本文只是简单的介绍几种Excel的导出方法,并没有具体的深入研究。这三种方式各有各的特点,第一种方法比较通用,适合那些需要多种导出且对导出的样式没有要求的项目,后边两种适合那些对导出数据有样式需求的项目。第二种方式所用的类库开源、免费但是代码比较繁琐,且还需要生成Xml的配置文件使起来还是比较麻烦,第三种使用起来最好、最简便,不过需要收费。如果用在商业项目中还是需要斟酌的。
转载于:https://www.cnblogs.com/jswjia/p/4637553.html
C#导出Excel那些事相关推荐
- Java导出excel那些事
之前做的项目底层都已经封装好了,是以小编的导出做的很顺利,又一次做导出,感觉还是纪念一下占用我们这么多时间最后解决以及未解决的问题吧.实现思路相当简单,先从后台查询出数据,返回类型为list集合,然后 ...
- (转).NET导出Excel的四种方法及评测
.NET导出Excel的四种方法及评测 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspo ...
- .net npoi xssfclientanchor设置图片缩放大小_.NET导出Excel的四种方法及评测
前言 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspose.Cells四个市面上常见的库 ...
- EPPlus导出Excel感觉很不错~~~
前言 导出成为很多系统的必备功能,之前分享过导出PDF的功能,这里来分享一下Excel的导出: 提到Excel导出,NPOI肯定是很多小伙伴的首选,在以往的项目中也用其完成了很多导出需求:对于NPOI ...
- react 怎么获取表格_react学习之js-xlsx导入和导出excel表格
前记:最近真的挺忙的,一件事接着一件,都忘了我的React项目,尽管这是一个没写概率没写离散的夜晚,我决定还是先做做我的React 好了,进入正题 项目需求,需要导入和导出表单,发现前端已经强大到无所 ...
- c#后台如何导出excel到本地_C#导出EXCEL方法总结
下面介绍下我根据网上学习C#中导出EXCEL的几种方法: 一.asp.net导出Excel 1.将整个html全部输出到Excel 此方法会将html中所有的内容,如按钮.表格.图片等全部输出 Vie ...
- Java 导出Excel利用模版导出
Java导出Excel和word的方式大体相同 1.Excel模版导出到页面下载 首先,导入依赖在pom.xml中我选择的事1.03的版本 第二.在项目或是自己需要的地方建立个文件夹放导出文件的模版, ...
- Springboot 导入导出Excel ,一对多关系,复合表格、合并单元格数据
前言 学习是自己的事. 但是跟着我学习,也未尝不可. 这种一对多的导出需求,好像确实也是比较常见的: 表面拒绝,反手上演一手实战示例. 内容: ① 一对多关系数据 (合并单元格)数据的 导出 ②一对多 ...
- .NET导出Excel的四种方法及评测
前言 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspose.Cells四个市面上常见的库 ...
- 如何高效率的导出 Excel
阅读文本大概需要3分钟. 前言 公司项目最近有一个需要:报表导出.整个系统下来,起码超过一百张报表需要导出.这个时候如何优雅的实现报表导出,释放生产力就显得很重要了.下面主要给大家分享一下该工具类的使 ...
最新文章
- linux 本机内存型号,linux怎么看存储空间型号
- 全球科技大会鸿蒙,华为开发者大会:全球瞩目的“鸿蒙”面子和里子大格局
- 论逗逼的自我修养——BZOJ第一页计划
- SSDT Hook的妙用-对抗ring0 inline hook
- java的sql的like_[Java教程]SQL like 模糊查询, in
- [容易]在二叉查找树中插入节点
- 使用SQL数据库在Python中进行CRUD操作
- python和c语言全局变量,Python如何实现C/C++全局变量?
- IntelliJ IDEA 中使用 Lambok (注解无效问题的解决)
- 多功能PCIE交换机之七:单NT到双NT
- SVN统计一段时间的日志
- 如何开发自己的股票软件102
- hsqldb mysql 语法_hsqldb快速入门
- java 随机抽取数组内容_工具类:随机抽取数组或集合中的几个不重复元素
- ipad服务器响应超时,iPad Air连接iTunes设备超时
- Aurora使用技巧详解
- 【金明的预算方案】解题报告
- python入门---日常经验分享
- Xshell7下载、安装、连接linux系统教程(官网)
- 晶体三极管的三个工作区域及温度对特性的影响
热门文章
- Integer division by zero
- 只会增删改查的程序员出路在哪里?
- android 闪屏动态界面,Android实现闪屏欢迎界面
- a标签中的href=javascript
- java简单实现购物车添加,查询,修改,结算商品程序
- Android打字机动画,Android自定义View实现打字机效果
- 彻底搞清楚library cache lock的成因和解决方法(转)
- 自动化测试工程师,自动化测试项目老是误报?怎么解决?(详细总结)
- 拉勾网离职风波引人深思 互联网招聘网站还有未来吗?
- 80psi等于多少kpa_压力单位换算(如psi)