关于C# – Excel互操作的一点build议

下午好,费拉斯,

有一点小小的build议可以理解,我正在接近一个问题,我需要编写一个代理程序,它将进入一个特定的文件目录,打开一个Excel工作簿(已经存在),然后将改变两个单元格的值总是相同的单元格)是当前月份(在代理程序运行时)。

不幸的是,这是一个工作项目,所以VSTO是禁止的。 但是ExcelDNA,我以前用过。 我不是在寻找某个人“做我的工作”,但是对于在哪里寻找或者以前的例子,任何build议都会很棒。

我已经捅了我一个窟窿,如果有人能指点我一个好的方向,那就太棒了!

非常感激。

现在只要用excel大声思考xml支持的文件格式(压缩),通过parsing和重写xml或者使用xml转换[shudder]来做这个改变可能会更容易。

现在更支持的方式是使用VSTO,但是你说这是不可用的。 如果你进一步分析文件格式,请注意它是一个复杂的模式,你可能会发现那里的源代码对你有帮助。

$ 0.02

如果你想在.NET中创build一个Excel插件,用户定义的函数等, Excel-DNA是非常棒的。但是,听起来你只是想从外部可执行文件自动化Excel。

为此,最简单的方法是直接安装并参考您可以在这里find的主Interop程序集(PIA): http : //www.microsoft.com/download/en/details.aspx?id=3508 ,或者您可以使用辉煌NetOffice项目中与版本无关的互操作程序集。

在这两种情况下,您都可以创build一个VB.NET或C#控制台应用程序,然后添加对您select的互操作程序集的引用,然后离开。

在C#中,使用NetOffice的方法可能会像这样开始(我认为在C#4中它可能会更清洁一点):

static void Test() { // Initialize Api COMObject Support LateBindingApi.Core.Factory.Initialize(); // start excel and turn off msg boxes Excel.Application excelApplication = new Excel.Application(); excelApplication.DisplayAlerts = false; // add a new workbook Excel.Workbook workBook = excelApplication.Workbooks.Add(); Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Worksheets[1]; worksheet.get_Range("A1").Value = "XXX"; // save the book string fileExtension = GetDefaultExtension(excelApplication); string workbookFile = string.Format("{0}\\Example01{1}", Application.StartupPath, fileExtension); workBook.SaveAs(workbookFile, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlExclusive); // close excel and dispose reference excelApplication.Quit(); excelApplication.Dispose(); } 

如果您使用Excel 97或更高版本,我可以build议使用OpenXml Sdk

为什么不使用ExcelDNA? 这可以使Excel文件与正在运行的代理更加独立。 如果有一个DLL(甚至是一个DNA文件)将提供所需的值,这两个单元格可以用一个简单的函数来填充。 优点是,您不必首先启动代理,只需打开工作簿即可。 缺点是,ExcelDNA.xll和其他所有提供所需值的东西都必须部署在每个将打开工作簿的客户端计算机上。 或者,在发布之前,您必须将这2个单元格的公式转换为真实的值。 在这种情况下,互操作性解决scheme可能会更好。

希望这可以帮助。

欢呼洛西