C# 从ASP.NET MVC创建打开的XML excel工作表时出错

C# 从ASP.NET MVC创建打开的XML excel工作表时出错,c#,asp.net,asp.net-mvc,asp.net-mvc-4,openxml-sdk,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Openxml Sdk,我正在尝试使用OpenXMLSDK2.5从ASP.NETMVC4导出Excel工作表。我尝试使用MSDN中的标准示例 extention = "xlsx"; response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; response.AddHeader("Content-Disposition",String.Format("attachment; filename={0

我正在尝试使用OpenXMLSDK2.5从ASP.NETMVC4导出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);
 }
extention=“xlsx”;
response.ContentType=“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”;
AddHeader(“内容处置”,String.Format(“附件;文件名={0}.{1}”,文件名,扩展名));
使用(MemoryStream mem=new MemoryStream())
{
//通过提供文件路径创建电子表格文档。
//默认情况下,AutoSave=true、Editable=true和Type=xlsx。
SpreadsheetDocument SpreadsheetDocument=SpreadsheetDocument.Create(mem,SpreadsheetDocumentType.工作簿);
//将工作簿部件添加到文档中。
WorkbookPart WorkbookPart=电子表格文档.AddWorkbookPart();
workbookpart.工作簿=新工作簿();
//将工作表部件添加到工作簿部件。
WorksheetPart WorksheetPart=workbookpart.AddNewPart();
worksheetPart.Worksheet=新工作表(new SheetData());
//将工作表添加到工作簿中。
Sheets Sheets=spreadsheetDocument.WorkbookPart.Workbook.AppendChild(新工作表());
//附加新工作表并将其与工作簿关联。
图纸=新图纸()
{
Id=电子表格文档.WorkbookPart.GetIdOfPart(工作表部分),
SheetId=1,
Name=“mySheet”
};
附页(页);
workbookpart.Workbook.Save();
//关闭文档。
电子表格文档。关闭();
mem.CopyTo(response.OutputStream);
}
我的文件正在下载,但当我试图打开它时,excel弹出的一个错误表明该文件已损坏。当我用记事本或记事本++打开文件时,文件是完全空的,里面没有xml数据

我遗漏了什么,需要做什么


提前感谢。

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

// 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;
}

之后你在调用response.Flush()吗?是的,我在调用Flush。就像trailmax提到的,问题在于寻找。