使用可用版本的Excel进行C#应用程序开发
有没有一个优雅/直接的方式来使用C#应用程序中的Microsoft Excel,而不被束缚到特定版本的Microsoft Excel?
背景…
我在过去使用VBScript编写脚本,使用Microsoft Excel(如果安装)来自动生成Excel电子表格的过程。 set xl = createObject("Excel.Application")
无论在我的体验/场景中安装了哪个excel版本(我的开发计算机上安装了Excel 365,我的脚本运行在运行Excel 2010的独立副本的Microsoft Windows 2008 R2服务器上)
我希望逐步做一些事情,并开始开发C#应用程序(winforms或控制台)来完成相同的工作。 我开发了一个testing应用程序,可以使用我的开发机器上安装的Excel版本。 我需要应用程序才能运行在运行Excel 2010的Windows Server 2008 R2服务器上。
Project->Add Reference
COM
"Microsoft Excel 16.0 Object Library"
然后添加使用语句… using Excel = Microsoft.Office.Interop.Excel;
然后一些基本的winformstesting代码…
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
OS版本:6.1.7601.2.1.0.272.7
区域设置ID:2057
附加信息1:0a9e
附加信息2:0a9e372d3b4ad19135b953a78882e789
附加信息3:0a9e
其他信息4:0a9e372d3b4ad19135b953a78882e789
编辑 :我会放在一个尝试赶上,看看我是否可以捕获一个更有用的错误消息,也尝试两个答案已经build议的库,然后接受最早的答案。 今天晚些时候。
在C#应用程序中使用Excel生成电子表格是否有其他更好的方式,无论安装了哪个版本的Excel(只要其最近足以与代码兼容)
也许一个C#等价于vbscript的set xl = createObject("Excel.Application")
您是否尝试过不使用Excel Interop并使用可读取/写入格式的库? EPPlus是我无数次使用的,它有很多function: https ://www.nuget.org/packages/EPPlus
尝试使用EPPLus,它使用起来非常简单,并且提供了许多有用的function,例如处理单元格中的特殊字符等。您可以从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(); }
谢谢。