gpt4 book ai didi

c# - 可以将 Excel 文档加载到内存中、填充并以字节形式返回吗?

转载 作者:太空宇宙 更新时间:2023-11-03 22:03:46 25 4
gpt4 key购买 nike

我之前曾使用 Excel Interop 来打开 Excel 文件、向其中写入一些数据并保存它。像这样:

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 并且包含宏代码,当用户下载它时,这些代码将在用户的工作站上运行)。
  2. 将已知数据写入文件中的已知位置(为了论证,将一些数值写入工作表 99 的前几个单元格)。
  3. 通过 Web 应用程序从内存中流式传输该文件(流式传输部分很简单,首先获取字节数组对我来说似乎比较棘手)。

我用 Google 搜索了一下,但没有找到任何东西。基本上只是说明和示例,它们执行我在上面的代码中已经执行的操作。在使用 COM 互操作时,我上面的代码(非常旧)和我在网上找到的其他代码都有点过时也就不足为奇了。我们使用的是 .NET 4.0,因此那里可用的任何东西都适合我们。

我在 COM 方面的经验在上面的代码中得到了充分的体现。如果可能的话,我宁愿完全不使用 COM。但现在我只是难以起身。有人能指出我正确的方向吗?也许在这里引用一些特别有用的类或方法?谢谢。

P.S. 另一件让我感到害怕的事情是 Web 服务器上需要 Excel,以及 Excel 应用程序在 Web 服务器的控制台上打开并卡在用户身上的可能性- 某种看不见的错误。因此,非常感谢任何建议。

最佳答案

我最终使用了 ClosedXML图书馆。 (OpenXML 本身是……笨拙的。)作为打开文件、写入一段数据并返回字节数组的简单概念证明:

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# - 可以将 Excel 文档加载到内存中、填充并以字节形式返回吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9182551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com