将.XLSX输出到响应时出现EPPlus错误

j00*_*00b 16 c# asp.net excel epplus

我在这里使用EPPlus创建一些.XLSX文件有一个奇怪的问题.我正在创建一个包,然后输出到响应.

我创建了一个包如下:

var file = new FileInfo(@"C:\Test.xlsx");
ExcelPackage package = new ExcelPackage(file);
//...code to output data...//
package.Save();
Run Code Online (Sandbox Code Playgroud)

这会将文件正确保存到我的本地C:驱动器,当我打开它时效果很好.没有错误或任何东西,格式是正确的等等.

但是,我现在希望将此文件输出到响应流,所以我修改了代码,我必须看起来像这样:

ExcelPackage package = new ExcelPackage();
//...code to output data...//
MemoryStream result = new MemoryStream();
package.SaveAs(result);
context.Response.Clear();
context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";                                                       
context.Response.AddHeader("Content-Disposition", "attachment;filename=MissionDetails.xlsx");
result.WriteTo(context.Response.OutputStream);
context.Response.End(); 
Run Code Online (Sandbox Code Playgroud)

但是,当我运行此代码时,我在尝试打开Excel文件时收到以下提示:

Excel在filename.xlsx中找到了不可读的内容.你想恢复这个工作簿的内容吗?如果您信任此工作簿的来源,请单击"是"

单击是然后显示以下提示:

使用Microsoft Excel无法打开此文件.是否要在Microsoft Office Online网站上搜索可以打开该文件的转换器?

我选择No此处然后打开Excel文件并显示以下错误:

Excel完成了文件级验证和修复.本工作簿的某些部分可能已被修复或丢弃.

该文件,然后加载罚款,似乎是正确的,一切都格式化.但每次我尝试打开文件时,它都会提供相同的提示和错误消息.

注意:输出数据的代码在这些方案中都不会更改.

有没有人见过这样的东西?或者知道什么可能导致这个在输出到响应时错误地保存文件?

j00*_*00b 16

我找到了解决这个问题的方法!正如预期的那样,它确实与响应有关,因为我能够在本地保存时打开文件,但不是通过响应.

这里的问题是我的代码被包装在try..catch块中,其中记录和显示异常.

它来到了我的注意,当你打电话到Response.End()System.Threading.ThreadAbortException上升.当引发此错误时,似乎错误的输出被附加到我的文件的末尾.

当我摆脱该特定异常的错误记录时,它工作得很好!

有关详细信息,请参阅此帖子http://epplus.codeplex.com/discussions/223843?ProjectName=epplus

//...output code...//
catch(Exception ex){
    if (!(ex is System.Threading.ThreadAbortException))
    {
        //Log other errors here
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 添加 `Response.End()` 解决了我的问题,谢谢 (2认同)

yed*_*txt 8

谢谢joob你的链接soved我的问题是它调用"GetAsByteArray()".如下所示,并在您给出的链接中,我gess保持不附加异常.一些majic.

你得到了投票!

mrxrsd
Editor

Aug 17, 2010 at 12:30 PM


Call response.clear before send stream back to client.

                    Response.Clear();
                     Response.AddHeader("content-disposition", "attachment;  filename=file.xlsx");
                     Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";                   
                     Response.BinaryWrite(pck.GetAsByteArray());
                     Response.End();
Run Code Online (Sandbox Code Playgroud)

http://epplus.codeplex.com/discussions/223843?ProjectName=epplus


Jus*_*lle 0

尝试使用以下方法代替WriteTo该方法:

context.Response.BinaryWrite(package.GetAsByteArray());
Run Code Online (Sandbox Code Playgroud)