C#导出Excel那些事

Excel导出

Excel导出的意义

因为在项目中有些报表数据客户需要导出功能,那么导出为Excel就十分有必要了,可是有些客户的机器上并没有安装Excel或者安装的版本参差不一。那么我们在这样的情况下应该应该怎么做呢?最简单的方法就是引用Excel相关的Com组件就行了,可是这种情况只能在安装了Excel的用户适用,对于没有安装Excel的用户不能强制用户安装吧。那么我们只能将眼光瞄向第三方的类库了,能用的Excel操作导出类库大致有这么三个
  1. NPOI
  2. ExcelRepor
  3. 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         }

使用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     }

好了,接下来让我们来使用一下这个导出的功能,导出代码如下,这些没什么技术含量,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的配置文件使起来还是比较麻烦,第三种使用起来最好、最简便,不过需要收费。如果用在商业项目中还是需要斟酌的。

时间: 2024-10-20 18:23:37

C#导出Excel那些事的相关文章

php,phpexcel插件导出excel使用

做了一个星期的导出excel,基本就是重复劳动,只需要完成一个,其它页面就是排版的问题了:比写静态页面还无聊: 网上excel插件应该蛮多的,之前发过一篇导出excel是以csv格式导出,这种方式导出excel有点事速度快,大批量导出数据效率高,跟导出txt文件差不多:缺点导出的文件数据没有格式,不能按照页面样式去导出数据: excel插件缺点就是导出的数据不能太多, 之前测试数据达到几千条基本上就跑不动了, 可能跟服务器性能有关, 但也能说明问题,就是插件对服务器资源消耗很大:我这边应该专门有

Java利用POI导入导出Excel中的数据

     首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地址http://poi.apache.org/download.html,有兴趣的朋友也可以去看看其中的API.      下面分享一下在对POI进行基本操作时觉得需要注意的两点:       1.POI中针对xlsx/xls是需要create different Workbook instance

JAVA POI XSSFWorkbook导出扩展名为xlsx的Excel,附带weblogic 项目导出Excel文件错误的解决方案

现在很多系统都有导出excel的功能,总结一下自己之前写的,希望能帮到其他人,这里我用的是XSSFWorkbook,我们项目在winsang 用的Tomcat,LInux上用的weblogic服务器,刚开始win开发完各种导出都没有问题,但到了linux上就不行了,后面才只知道weblogic会给response写入一些内容,需要response.reset();或者response.resetBuffer();一下代码是从前台到后台重点代码,希望可以帮到有需要的人,如果有问题,希望可以指出来

.NET导出Excel的四种方法及评测

.NET导出Excel的四种方法及评测 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspose.Cells四个市面上常见的库,各完成一个导出Excel示例.然后对其代码风格和性能做一个横向比较.最后我将说出我自己的感想. 文中所有的示例代码可以在这里下载: https://github.com/sdcb/blog-data/tree/master/2019/20190824-dotnet

通用导出excel(可控制内容)

实体类 package util; import java.sql.Timestamp; public class Book { private int bookId; private String name; private String author; private float price; private String isbn; private String pubName; private Timestamp date; public Book() { } public Book(i

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

利用poi导出Excel

import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.sql.Date;import java.util.ArrayList;import java.util.List; import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.

goalng导出excel(csv格式)

最近项目中有个小需求,需要将查询结果导出到excel.之间前java比较容易,使用POI很容易就能实现,查了下golang的文档,发现golang下边并没有导出excel的包,但是却有一个encoding/csv的包,看了下发现可以导出csv文件,大家都知道csv文件其实就是文本格式的excel文件,可以直接通过excel打开或是导入excel. 看起来挺好的,问题如愿解决,但是事实证明对已一个还不成熟的语言或是库最好还是先测一下的好.兴冲冲的卸了测试例子,成功导出了一个text.csv文件,一

java 操作 Excel,java导出excel

WritableWorkbook out = null; try { response.getServletResponse().reset(); ((HttpServletResponse) response.getServletResponse()).setHeader("Content-Disposition", "attachment;filename=export.xls"); response.getServletResponse().setConten