使用可用版本的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(); } 

谢谢。