c# 导出数据到Excel模板

最近在做一个发邮件的功能,客户要求需要导出一个Excel附件,并给了附件的格式,

eg:

Last Name 姓 First Name 名
Chinese Characters
汉字书写(仅大陆人填写)

     

实现方式有两种:

一、使用Microsoft.Office.Interop.Excel组件的方式

二、使用NPOI的方式

下面讲一下这两种方式的具体实现:

一、使用Microsoft.Office.Interop.Excel组件的方式

该方式需要引入Microsoft.Office.Interop.Excel;System.Reflection

实现代码:

 1 /// <summary>
 2 /// 生成附件(使用Microsoft.Office.Interop.Excel组件的方式)
 3 /// </summary>
 4 /// <param name="DT"></param>
 5 /// <returns></returns>
 6 public static void GenerateAttachment(DataTable DT)
 7 {
 8     try
 9     {
10         //需要添加 Microsoft.Office.Interop.Excel引用
11         Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
12         if (app == null)//服务器上缺少Excel组件,需要安装Office软件
13         {
14             return;
15         }
16         app.Visible = false;
17         app.UserControl = true;
18         string strTempPath = Application.StartupPath + "\\EmailTemplate\\TE Enrollment Form.xls";
19         Microsoft.Office.Interop.Excel.Workbooks workbooks = app.Workbooks;
20         Microsoft.Office.Interop.Excel._Workbook workbook = workbooks.Add(strTempPath); //加载模板
21         Microsoft.Office.Interop.Excel.Sheets sheets = workbook.Sheets;
22         Microsoft.Office.Interop.Excel._Worksheet worksheet = (Microsoft.Office.Interop.Excel._Worksheet)sheets.get_Item(1); //第一个工作薄。
23         if (worksheet == null)//工作薄中没有工作表
24         {
25             return;
26         }
27
28         //1、获取数据
29         int rowCount = DT.Rows.Count;
30         if (rowCount < 1)//没有取到数据
31         {
32             return;
33         }
34
35         //2、写入数据,Excel索引从1开始
36         for (int i = 1; i <= rowCount; i++)
37         {
38             int row_ = 2 + i;  //Excel模板上表头占了1行
39             int dt_row = i - 1; //dataTable的行是从0开始的
40             worksheet.Cells[row_, 1] = DT.Rows[dt_row]["Lastname_EN"].ToString();
41             worksheet.Cells[row_, 2] = DT.Rows[dt_row]["Firstname_EN"].ToString();
42             worksheet.Cells[row_, 3] = DT.Rows[dt_row]["namechinese"].ToString();
43         }
44         //调整Excel的样式。
45         Microsoft.Office.Interop.Excel.Range rg = worksheet.Cells.get_Range("A3", worksheet.Cells[rowCount + 2, 32]);
46         rg.Borders.LineStyle = 1; //单元格加边框
47         worksheet.Columns.AutoFit(); //自动调整列宽
48
49         //隐藏某一行
50         //选中部分单元格,把选中的单元格所在的行的Hidden属性设为true
51         //worksheet.get_Range(app.Cells[2, 1], app.Cells[2, 32]).EntireRow.Hidden = true;
52
53         //删除某一行
54         worksheet.get_Range(app.Cells[2, 1], app.Cells[2, 32]).EntireRow.Delete(Microsoft.Office.Interop.Excel.XlDirection.xlUp);
55
56
57         //3、保存生成的Excel文件
58         //Missing在System.Reflection命名空间下
59         string savePath = Application.StartupPath + "\\Temp\\TEEnrollmentForm\\TE Enrollment Form.xls";
60         workbook.SaveAs(savePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
61
62         //4、按顺序释放资源
63         NAR(worksheet);
64         NAR(sheets);
65         NAR(workbook);
66         NAR(workbooks);
67         app.Quit();
68         NAR(app);
69     }
70     catch (Exception ex)
71     {
72         WriteLog(ex.ToString());
73     }
74 }
75 /// <summary>
76 /// 释放资源
77 /// </summary>
78 /// <param name="o"></param>
79 public static void NAR(object o)
80 {
81     try
82     {
83         System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
84     }
85     catch (Exception ex)
86     {
87         WriteLog(ex.ToString());
88     }
89     finally
90     {
91         o = null;
92     }
93 }

二、使用NPOI的方式

该方式需要引用NPOI.dll

实现代码:

 1 /// <summary>
 2 /// ExportExcel(使用NPOI的方式)
 3 /// </summary>
 4 /// <param name="DT"></param>
 5 public static void ExportExcel(DataTable DT)
 6 {
 7     try
 8     {
 9         HSSFWorkbook hssfworkbookDown;
10         string modelExlPath = Application.StartupPath + "\\EmailTemplate\\TE Enrollment Form.xls";
11         if (File.Exists(modelExlPath) == false)//模板不存在
12         {
13             return;
14         }
15         using (FileStream file = new FileStream(modelExlPath, FileMode.Open, FileAccess.Read))
16         {
17             hssfworkbookDown = new HSSFWorkbook(file);
18             file.Close();
19         }
20         if (DT.Rows.Count > 0)
21         {
22             WriterExcel(hssfworkbookDown, 0, DT);
23
24             string filename = "TE Enrollment Form.xls";
25             string strFilePath = Application.StartupPath + "\\Temp\\TEEnrollmentForm";
26             if (Directory.Exists(strFilePath) == false)
27             {
28                 Directory.CreateDirectory(strFilePath);
29             }
30             strFilePath = strFilePath + "\\" + filename;
31             FileStream files = new FileStream(strFilePath, FileMode.Create);
32             hssfworkbookDown.Write(files);
33             files.Close();
34             if (File.Exists(strFilePath) == false)//附件生成失败
35             {
36                 return;
37             }
38         }
39     }
40     catch (Exception ex)
41     {
42         WriteLog(ex.ToString());
43     }
44 }
45 /// <summary>
46 /// WriterExcel
47 /// </summary>
48 /// <param name="hssfworkbookDown"></param>
49 /// <param name="sheetIndex"></param>
50 /// <param name="DT"></param>
51 public static void WriterExcel(HSSFWorkbook hssfworkbookDown, int sheetIndex, DataTable DT)
52 {
53     try
54     {
55         #region 设置单元格样式
56         //字体
57         HSSFFont fontS9 = (HSSFFont)hssfworkbookDown.CreateFont();
58         fontS9.FontName = "Arial";
59         fontS9.FontHeightInPoints = 10;
60         fontS9.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.NORMAL;
61         //表格
62         ICellStyle TableS9 = (ICellStyle)hssfworkbookDown.CreateCellStyle();
63         TableS9.BorderLeft = NPOI.SS.UserModel.BorderStyle.THIN;
64         TableS9.BorderTop = NPOI.SS.UserModel.BorderStyle.THIN;
65         TableS9.BorderBottom = NPOI.SS.UserModel.BorderStyle.THIN;
66         TableS9.BorderRight = NPOI.SS.UserModel.BorderStyle.THIN;
67         TableS9.WrapText = true;
68         TableS9.SetFont(fontS9);
69         #endregion
70
71         HSSFSheet sheet = (HSSFSheet)hssfworkbookDown.GetSheetAt(sheetIndex);
72         hssfworkbookDown.SetSheetHidden(sheetIndex, false);
73         hssfworkbookDown.SetActiveSheet(sheetIndex);
74
75         int n = 1;//因为模板有表头,所以从第2行开始写
76         for (int j = 0; j < DT.Rows.Count; j++)
77         {
78             HSSFRow dataRow = (HSSFRow)sheet.CreateRow(j + n);
79             string strDepID = DT.Rows[j]["relationship"].ToString().Trim();
80             dataRow.CreateCell(0);
81             dataRow.Cells[0].SetCellValue(strDepID == "" ? DT.Rows[j]["Lastname_EN"].ToString() : "");
82             dataRow.CreateCell(1);
83             dataRow.Cells[1].SetCellValue(strDepID == "" ? DT.Rows[j]["Firstname_EN"].ToString() : "");
84             dataRow.CreateCell(2);
85             dataRow.Cells[2].SetCellValue(strDepID == "" ? DT.Rows[j]["namechinese"].ToString() : "");
86
87             for (int i = 0; i <= 2; i++)//循环列,添加样式
88             {
89                 dataRow.Cells[i].CellStyle = TableS9;
90             }
91         }
92         //设定第一行,第一列的单元格选中
93         sheet.SetActiveCell(0, 0);
94     }
95     catch (Exception ex)
96     {
97         WriteLog(ex.ToString());
98     }
99 }

最终效果展示:

时间: 2024-10-17 06:19:58

c# 导出数据到Excel模板的相关文章

C#导出数据至excel模板

开源分享最近一个客户要做一个将数据直接输出到指定格式的Excel模板中,略施小计,搞定 其中包含了对Excel的增行和删行,打印预览,表头,表体,表尾的控制 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using System.Reflection; using System

C# 导出数据到Excel模板中(转)

今天做报表的时候遇到了多表头的问题,而且相应的报表的格式都一样.所以就采用了报表模板的方式来进行. 第一步:在开发的当前项目中引入:Microsoft.Office.Interop.Excel:System.Reflection:命名空间. 第二步:获取要导出的数据: 第三步:创建一个Excel 应用程序: //需要添加 Microsoft.Office.Interop.Excel引用 Microsoft.Office.Interop.Excel.Application app = new Mi

实战基础技能(17)--------C#导出数据的EXCEL模板设计

一:将如下图中,查询出来的数据导出到EXCEL中 二:Excel的状态 三:设计的背后工作 四:最后一步,隐藏

asp.net使用MVC4框架基于NPOI做导出数据到Excel表

NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本

MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult

MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult 导出EXCEL方法总结:MVC导出数据到EXCEL的方法有很多种,常见的是: 1.采用EXCEL COM组件来动态生成XLS文件并保存到服务器上,然后转到该文件存放路径即可:优点:可设置丰富的EXCEL格式,缺点:需要依赖EXCEL组件,且EXCEL进程在服务器中无法及时关闭,以及服务器上会存留大量的不必要的XLS文件: 2.设置输出头为:application/ms-excel,再输出拼接的HTM

Dynamics CRM导出数据到Excel

原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM将数据导出到Excel的功能. (一)导出数据到Excel的三种类型 下图中点击红框内的按钮EXPORT TO EXCEL,会弹出三个选项 第一个是一个静态工作表,将当前页面内的数据导出到一张表内.该数据是静态的,也就是说CRM里的数据发生改变,工作表的数据不会发生相应修改.如果勾选了”Make t

php导出数据到excel,防止身份证等数字字符格式变成科学计数的方-------缺点,必须使用table tr td

php导出数据到excel,防止身份证等数字字符格式变成科学计数的方 时间:2012-08-17 13:50来源:未知 作者:硅峰网络-红豆 点击:219次 在网上查了很多资料知道解决办法大概有两个:一是在身份证字段前加个英文单引号,二是设置Excel的格式为文本格式. 我试用过第一种确实可以显示,但是有个'号在那里感觉确实不是很好,虽然听说不影响,但是需要用户点击那个单元格那个单引号才消失,并且在该 在网上查了很多资料知道解决办法大概有两个:一是在身份证字段前加个英文单引号,二是设置Excel

PHP导出数据到Excel

PHP导出数据到Excel 在Web开发中经常需要将一些数据导入到Excel表格中,比如需要导出符合条件的用户数据,导出项包括姓名.性别.***号.联系方式等等.那么问题来了,在导出的数据中如果出现比较长的数值类型的项时,默认按科学计数法表示,比如***号这显然不是我们需要的,那么我们怎么做才能让数据按我们要求的格式显示呢? 查到一些相关资料,摘抄如下: 首先,我们了解一下excel从web页面上导出的原理.当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取它,所

CodeIgniterCodeigniter+PHPExcel导出数据到Excel文件

解压压缩包里的Classes文件夹中的内容到application\libraries\目录下,目录结构如下:--application\libraries\PHPExcel.php--application\libraries\PHPExcel(文件夹)修改application\libraries\PHPExcel\IOFactory.php文件--将其类名从PHPExcel_IOFactory改为IOFactory,遵从CI类命名规则.--将其构造函数改为public $this->loa