我通常使用ClosedXML来生成Excel文件。但一个核心项目强制我只能使用OpenXML。
生成的Excel文件将被下载。
我遇到了一个问题,即提供给SpreadsheetDocument的内存流为空。
我尝试过多种方法来生成流。下面的代码是创建最基本的版本,只保留必要内容。再次提醒,内存流的长度为0。
我知道应该使用using()
等语句。这只是为了让它工作而精简的代码。
用于生成Excel的代码;这是在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字节。使用的任何内存流都是如此。 有人能指引我正确的方向吗?
documentStream
。现在我将尝试处理该文档。 - Darren Wainwright