是否有一种优雅/直接的方式在C#应用程序中使用Microsoft Excel,而不受限于特定版本的Microsoft Excel?
...背景
我过去使用vbscript编写脚本,使用Microsoft Excel(如果已安装)自动生成excel电子表格的过程。 set xl = createObject("Excel.Application")
无论在我的经验/场景中安装了哪个excel版本,脚本都可以无缝工作(我的开发机器上安装了Office 365和Excel 2016,并且我的脚本在Microsoft Windows 2008 R2上运行服务器运行Excel 2010的独立副本
我希望稍微提高一点,并开始开发执行相同工作的C#应用程序(winforms或控制台)。我开发了一个测试应用程序,可以使用我的开发机器上安装的excel版本。我需要该应用程序才能在运行Excel 2010的Windows Server 2008 R2服务器上运行。
Project->Add Reference
COM
"Microsoft Excel 16.0 Object Library"
然后添加using语句... using Excel = Microsoft.Office.Interop.Excel;
然后是一些基本的winforms测试代码......
public Form1()
{
InitializeComponent();
SimpleExcelTest();
}
void SimpleExcelTest() {
Excel.Application xl = new Excel.Application();
Excel.Workbook wb = xl.Workbooks.Add();
Excel.Worksheet ws = wb.Worksheets[1];
ws.Cells[1, 1] = "Testing";
wb.SaveAs("C:\\temp\\test.xlsx");
wb.Close();
}
哪种方法正常。
但这引用了我机器上运行的特定版本的Excel。这不会在目标机器上运行。应用程序崩溃时出现以下错误...
问题签名:
问题事件名称:CLR20r3
问题签名01:AutomatedReportGenerator.exe
问题签名02:1.0.0.0
问题签名03:59552369
问题签名04:AutomatedReportGenerator
问题签名05:1.0.0.0
问题签名06:59552369
问题签名07:2
问题签名08:9c
问题签名09:PSZQOADHX1U5ZAHBHOHGHLDGIY4QIXHX
操作系统版本:6.1.7601.2.1.0.272.7
区域设置ID:2057
附加信息1:0a9e
其他资料2:0a9e372d3b4ad19135b953a78882e789
其他资料3:0a9e
其他资料4:0a9e372d3b4ad19135b953a78882e789
编辑:我会尝试捕获,看看是否可以捕获更有用的错误消息,并尝试两个答案建议的库然后接受最早的答案。今天晚些时候。
有没有替代/更好的方法在C#应用程序中使用Excel来生成电子表格,无论安装了哪个版本的excel(只要它最近足以与代码兼容)
也许是C#等同于vbscript' s set xl = createObject("Excel.Application")
答案 0 :(得分:3)
您是否尝试过不使用Excel Interop并使用可以读取/写入格式的库? EPPlus是我无数次使用过的,它有很多功能:https://www.nuget.org/packages/EPPlus
答案 1 :(得分:1)
尝试使用EPPLus,它非常易于使用,并提供许多有用的功能,例如它可以处理单元格中的特殊字符等。您可以从http://epplus.codeplex.com/下载EPPlus。 EPPlus的Nuget页面是https://www.nuget.org/packages/EPPlus
由于其复杂性,我不建议使用Microsoft Excel Interop。
一个代码示例
using (ExcelPackage pck = new ExcelPackage(new FileInfo(fileName)))
{
ExcelWorksheet ws = pck.Workbook.Worksheets[excelSheetName];
ws.Cells["A" + rowCnt].Value = firstName;
ws.Cells["B" + rowCnt].Value = lastName;
ws.Cells["C" + rowCnt].Value = occupation;
pck.Save();
}
感谢。