最近在做一个发邮件的功能,客户要求需要导出一个Excel附件,并给了附件的格式,
eg:
Last Name 姓 | First Name 名 | Chinese Characters 汉字书写(仅大陆人填写) |
实现方式有两种:
一、使用Microsoft.Office.Interop.Excel组件的方式
二、使用NPOI的方式
下面讲一下这两种方式的具体实现:
该方式需要引入Microsoft.Office.Interop.Excel;System.Reflection
实现代码:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
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 }
View Code
该方式需要引用
NPOI.dll![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
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 }
最终效果展示:
如果您看了本篇博客,觉得对您有所收获,请点击右下角的
[推荐]如果您想转载本博客,
请注明出处如果您对本文有意见或者建议,欢迎留言
感谢您的阅读,请关注我的后续博客