Excel文档可以加载到内存中,填充和返回为字节?

为了打开一个Excel文件,写入一些数据并保存,我使用过Excel Interop。 像这样的东西:

public void WriteAFile() { var xlApp = new Excel.ApplicationClass(); var xlWorkbook = xlApp.Workbooks.Add(Missing.Value); var xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.get_Item(1); xlWorksheet.Name = "Some Name"; // Write some contrived data for (var i = 0; i < 10; i++) { xlWorksheet.Cells[i + 1, 1] = i; xlWorksheet.Cells[i + 1, 2] = i + 1; //... and so on... } //... and so on... // Save the file xlWorkbook.SaveAs( @"", Excel.XlFileFormat.xlWorkbookNormal, Missing.Value, Missing.Value, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Excel.XlSaveConflictResolution.xlLocalSessionChanges, false, Missing.Value, Missing.Value, Missing.Value ); xlWorkbook.Close(true, Missing.Value, Missing.Value); xlApp.Quit(); // release other resources, etc. } 

这适用于写入本地工作站上的文件的应用程序。 但是,现在我正在开发一个需要将文件返回给用户的Web应用程序。 问题在于文件系统上的文件无法修改。 所以我需要做的是:

  1. 将一个已知的Excel文件加载到内存中(请注意,该文件是.xlsm并包含macros代码,这些macros代码将在用户的工作站上下载时运行)。
  2. 将已知数据写入文件中的一个已知位置(为了参数的缘故,表99中的前几个单元格有一些数字值)。
  3. 通过Web应用程序从内存中stream式传输该文件(stream式传输部分是微不足道的,它首先获取字节数组,这对我来说似乎更加棘手)。

我谷歌search,但没有发现什么东西。 基本上只是说明和例子,做我已经在我的代码上面做的。 当使用COM互操作时,我的代码(这是相当古老的)和我在网上find的其他代码都有点过时了。 我们正在使用.NET 4.0,所以任何可用的东西都适合我们。

我的COM经验的程度在上面的代码中已经完全显示出来了。 如果可能的话,我宁愿不要使用COM。 但现在我只是遇到了麻烦。 有人能指出我的方向吗? 也许可以引用一些在这里特别有用的类或方法? 谢谢。

PS另一件令我感到害怕的事情是在Web服务器上需要Excel,以及在Web服务器的控制台上打开Excel应用程序的可能性,以及某种用户不可见的错误。 所以,任何意见都非常感激。

我结束了使用ClosedXML库。 (OpenXML本身是…笨拙的)。作为打开文件,写入数据和返回字节数组的概念的简单certificate:

 public byte[] GetExcelApplication(Guid sessionKey) { // Input checking using (var workbook = new XLWorkbook(_excelFile)) { var worksheets = workbook.Worksheets.Where(w => w.Name == "Session Key"); if (worksheets.Count() < 1) throw new Exception("Excel file does not contain a worksheet called: Session Key"); if (worksheets.Count() > 1) throw new Exception("Excel file contains multiple worksheets called: Session Key"); var worksheet = worksheets.Single(); var cell = worksheet.Cell("A1").Value = sessionKey.ToString(); using (var ms = new MemoryStream()) { workbook.SaveAs(ms); return ms.ToArray(); } } } 

使用C#4.0 COM应该会更简单一些,因为你可以使用dynamic的。 但是现在还是COM。 我为这个叫做aspose的单元使用了一个派对产品。 我不为他们工作,但我真的喜欢这个产品(即使它不是免费的)。 这在处理excel时省了很多麻烦。

老派,但是我很久以前就写了这个东西 ,用来构build一个工作手册,然后导出它。 也许它可以让你在正确的轨道上?

做与COM类似的东西我使用保存生成的Excel工作簿到一个临时文件夹,发送它,然后删除它。 不使用COM不是我的select,因为工作簿也需要生成透视表和graphics。