COM 组件导出 Excel

前言

最近有个任务是把数据导出,保存成 Excel 文件。研究了一下,大概有三种方式:

1,使用 COM 组件(使用机器需要安装有 Office 软件)

2,使用 OleDb

3,使用第三方控件

我选择了第一种,效果还是很不错的,下面整理一下,方便以后失忆了查看。

、添加 Microsoft.Office.Core.dllMicrosoft.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);

发表评论

Powered by WordPress | Theme Revised from Doo

苏ICP备18047621号

Copyright © 2017-2024 追光者博客