c# 导出数据到Excel模板

简介: 最近在做一个发邮件的功能,客户要求需要导出一个Excel附件,并给了附件的格式, eg: Last Name 姓 First Name 名 Chinese Characters汉字书写(仅大陆人填写)               实现方式有两种: 一、使用Microsoft.

最近在做一个发邮件的功能,客户要求需要导出一个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 }
View Code

二、使用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 }
View Code

 

最终效果展示:

 

如果您看了本篇博客,觉得对您有所收获,请点击右下角的 [推荐]

如果您想转载本博客,请注明出处

如果您对本文有意见或者建议,欢迎留言

感谢您的阅读,请关注我的后续博客

目录
相关文章
|
1月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
113 10
|
9天前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
27 11
|
11天前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
41 10
|
11天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
2月前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
37 1
|
2月前
|
数据格式 UED
记录一次NPOI库导出Excel遇到的小问题解决方案
【11月更文挑战第16天】本文记录了使用 NPOI 库导出 Excel 过程中遇到的三个主要问题及其解决方案:单元格数据格式错误、日期格式不正确以及合并单元格边框缺失。通过自定义单元格样式、设置数据格式和手动添加边框,有效解决了这些问题,提升了导出文件的质量和用户体验。
226 3
|
3月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
165 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
2月前
|
Java API Apache
|
2月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
98 4
|
3月前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
143 6