前言
最近有个任务是把数据导出,保存成 Excel 文件。研究了一下,大概有三种方式:
1,使用 COM 组件(使用机器需要安装有 Office 软件)
2,使用 OleDb
3,使用第三方控件
我选择了第一种,效果还是很不错的,下面整理一下,方便以后失忆了查看。
一、添加 Microsoft.Office.Core.dll 和 Microsoft.Office.Interop.Excel.dll
1,解决方案资源管理器 -> 引用-> 添加引用 -> COM -> Microsoft Office 16.0 Object Library -> 确定。
2,解决方案资源管理器 -> 引用-> 添加引用 -> COM -> Microsoft.Office.Interop.Excel -> 确定。
3,调整添加进来的 dll 的 “嵌入互操作类型” 属性为”true”。
注意:
1,操作前提是电脑安装了 Office 软件,否择找不到这个 COM 组件。
2,Office 的版本不同,COM 组件的版本也不同,根据版本选择 Microsoft Office xx.x Object Library 即可。
二、添加命名空间
using Microsoft.Office.Interop.Excel;
当然不添加也可以,只不过实例化 Excel 对象的时候要写老大一长串。
三、基本操作
//实例化一个 Excel 应用 Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); //使界面不可见 app.Visible = false; //给 app 新建一个工作薄 Workbook book = app.Workbooks.Add(); //给工作薄新建一个表 Worksheet worksheet1 = (Worksheet)book.Sheets[1]; //填写单元格 worksheet1.Cells[1, 1] = "日期"; //导出 Excel book.SaveAs(savePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); //退出 app.Quit();
通过上面的代码就可以 新建、编辑、保存 一个 .xlsx 文件了。
SaveAs() 方法有很多参数,可以根据具体情况对输出文件进行配置,采用默认配置就 ” Missing.Value ” ,Missing 类需要命名空间 System.Reflection,注意引用。
如下图所示,
四、进阶操作
//合并单元格 Range range = worksheet1.Range["A1", "F1"]; range.Merge(0); //设置单元格字体 range.Font.Size = 11; //设置单元格背景颜色 range.Interior.Color = Color.Black; //设置单元格字体颜色 range.Font.Color = Color.White; //文本自动换行 range.WrapText = true; //单元格边框线类型(线型,虚线型) range.Borders.LineStyle = 1; //设置字体是否有下划线 range.Font.Underline = true; //设置单元格的宽度 range.ColumnWidth = 15; //设置单元格对齐方式 range.HorizontalAlignment = XlHAlign.xlHAlignRight; //自动调整列宽 worksheet1.Columns.AutoFit(); //单元格添加公式 worksheet1.Cells[3, 8].Formula = "=MAX(F3:F" + (rowCount + 2).ToString() + ")"; worksheet1.Cells[5, 8].Formula = "=SUM(H3+ABS(H4))"; //保存Excel的时候,不弹出是否保存的窗口直接进行保存 xlsApp.DisplayAlerts = false;
五,彻底退出 EXCEL 进程
程序几次后,会发现内存渐渐上涨,打开任务管理器可以看到好多个 Excel 进程再后台跑着,虽然我们在代码的最后写了 ” app.Quit(); ” ,但是好像进程并没有完全退出:
对于这个问题网上争议非常大,结果最有效的办法还是强制杀进程。添加代码:
[DllImport("User32.dll")] //命名空间 using System.Runtime.InteropServices; public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int Processid); public static void Kill(Microsoft.Office.Interop.Excel.Application theApp) { int iId = 0; IntPtr intptr = new IntPtr(theApp.Hwnd); System.Diagnostics.Process p = null; try { GetWindowThreadProcessId(intptr, out iId); p = System.Diagnostics.Process.GetProcessById(iId); if (p != null) { p.Kill(); p.Dispose(); } } catch (Exception e) { throw e; } }
然后在程序的最后,把 app 丢给粉碎机 Kill() 即可:Kill(app);