1

我正在使用 PowerTools 以编程方式创建 Excel 电子表格。

我使用 Nuget 在我的 C#/ASP.Net Core 项目中安装了 PowerTools 4.5.3.2。该项目还使用 DocumentFormat.OpenXml v2.9.1。

我可以生成电子表格了。

但 ...

我想将完成的电子表格作为 .Net MemoryStream 传回给用户。

我仔细研究了https://github.com/OfficeDev/Open-Xml-PowerTools上的 PowerTools 文档和示例程序。

但在我的一生中,我还没有看到任何方法让 PowerTools 将生成的数据作为 MemoryStream 提供给我。或者,就此而言,让 PowerTools 使用我传递给它的 MemoryStream 的任何方式。

问:有什么建议吗?

笔记

我想做的就是:

  1. 我的 ASP.Net Web 控制器调用一个从头开始生成 .xlsx 电子表格的函数。

  2. 该函数使用 OpenXML PowerTools(因为这似乎是在 .xlsx 中包含数据透视表的最直接方式)

  3. 一旦函数返回,控制器需要将 .xlsx 作为 Asp.Net Core FileStreamResult 对象返回给 Web 客户端。

换句话说,我想做的就是从 2(工作)到 3(这就是我卡住的地方)。我似乎无法将成功创建的电子表格“转换”为与 MVC FileStreamResult 兼容的对象,以便控制器传回给调用者。

帮助!

4

1 回答 1

0

不,OpenXml PowerTools 似乎不会让您写入除实际磁盘文件之外的任何内容。

所以我使用了一个临时文件,然后将其转换为 byte[] 数组以传回给调用者:

using (OpenXmlMemoryStreamDocument streamDoc = OpenXmlMemoryStreamDocument.CreateSpreadsheetDocument())
{
    doc = streamDoc.GetSpreadsheetDocument();
    ms = new MemorySpreadsheet();
    ...
    string tmpFile = System.IO.Path.GetTempFileName();
    streamDoc.GetModifiedSmlDocument().SaveAs(tmpFile);
    byte[] fileBytes = System.IO.File.ReadAllBytes(tmpFile);
    return fileBytes;

PS:我从来没有解决过这个问题:OpenXML SpreadsheetDocument SaveAs()giving file-in-use error

我最终放弃了 PowerTools,转而使用全 OpenXml 解决方案。

于 2020-06-06T22:03:27.377 回答