【问题标题】:Error while creating open XML excel sheet from ASP.NET MVC从 ASP.NET MVC 创建打开的 XML excel 工作表时出错
【发布时间】:2014-02-18 17:37:48
【问题描述】:

我正在尝试使用 Open XML SDK 2.5 从 ASP.NET MVC4 导出 Excel 工作表。我正在尝试使用 MSDN 中的标准示例,

extention = "xlsx";
response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
response.AddHeader("Content-Disposition",String.Format("attachment; filename={0}.{1}", fileName, extention));
using (MemoryStream mem = new MemoryStream())
{
    // Create a spreadsheet document by supplying the filepath.
    // By default, AutoSave = true, Editable = true, and Type = xlsx.
    SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(mem, SpreadsheetDocumentType.Workbook);

     // Add a WorkbookPart to the document.
     WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
     workbookpart.Workbook = new Workbook();

     // Add a WorksheetPart to the WorkbookPart.
     WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
     worksheetPart.Worksheet = new Worksheet(new SheetData());

     // Add Sheets to the Workbook.
     Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

      // Append a new worksheet and associate it with the workbook.
      Sheet sheet = new Sheet()
      {
            Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
            SheetId = 1,
            Name = "mySheet"
       };
       sheets.Append(sheet);

       workbookpart.Workbook.Save();

       // Close the document.
       spreadsheetDocument.Close();

       mem.CopyTo(response.OutputStream);
 }

我的文件正在下载,但是当我尝试打开它时,excel 弹出错误提示文件已损坏。当我用记事本或记事本++打开文件时,文件完全是空的,里面没有xml数据。

我缺少什么以及需要做什么?

提前致谢。

【问题讨论】:

  • 你在调用 response.Flush() 吗?
  • 是的,我正在调用flush。就像 trailmax 提到的问题是 SEEK。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 openxml-sdk


【解决方案1】:

在复制到响应之前尝试将内存流位置重置为零:

// Close the document.
spreadsheetDocument.Close();
mem.Position = 0;
mem.CopyTo(response.OutputStream);

除了将内存流复制到响应之外,您还可以从 MVC 操作中返回 FileStreamResult

public ActionResult XlsDocument()
{
    // generating your document here...

    // very important to reset memory stream to a starting position, otherwise you would get 0 bytes returned
    memoryStream.Position = 0;

    var resultStream = new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";);
    resultStream.FileDownloadName = String.Format("{0}.{1}", fileName, extension);

    return resultStream;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多