我通常会使用 ClosedXML 生成 Excel 文件。核心项目迫使我只使用 OpenXML。
将下载生成的 Excel 文件。
我遇到一个问题,即提供给 SpreadsheetDocument 的内存流为空。
我尝试了多种方法来生成流。下面的代码代表了一个精简版本,仅创建最基本的功能。同样,内存流是0
长度。
我知道我应该使用using()
等等。这只是精简代码以尝试使其正常工作。
生成excel的代码;这是来自 a 上的构造函数File
目的。AsMemoryStream
是一个声明为的属性public MemoryStream AsMemoryStream { get; private set; }
public File(IList<T> items)
{
if (!items.Any())
throw new InvalidOperationException("items cannot be empty");
MemoryStream documentStream = new MemoryStream();
SpreadsheetDocument document = SpreadsheetDocument.Create(documentStream, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook);
WorkbookPart workbookPart = document.AddWorkbookPart();
workbookPart.Workbook = new Workbook();
WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet();
Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());
Sheet sheet = new Sheet { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Export" };
sheets.Append(sheet);
// have tried various Save() calls
// worksheetPart.Worksheet.Save();
// workbookPart.Workbook.Save();
AsMemoryStream = new MemoryStream();
documentStream.CopyTo(AsMemoryStream);
}
我在控制器中将文件下载为:
public IActionResult TransactionDetails(int transactionId)
{
IList<Partner> details = _dataService.GetTransactionPartners(transactionId).Result;
MemoryStream excelStream = _excelRepository.TransactionDetailExcel(details).AsMemoryStream;
ContentDisposition contentDisposition = new ContentDisposition
{
FileName = "transactionDetails.xlsx",
Inline = false
};
Response.Headers.Add("content-disposition", contentDisposition.ToString());
return File(excelStream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
文件已下载,但长度为 0 字节。与正在使用的任何内存流一样。
有人能指出我正确的方向吗?