将其写入Response.OutputStream

时间:2016-12-01 21:24:59

标签: asp.net memorystream npoi

在ASP.Net中,我使用NPOI将保存写入Excel文档,我刚刚转到版本2+。它可以很好地写入xls,但切换到xlsx更具挑战性。我新增和改进的代码是在输出文件中添加了大量NUL字符。

结果是Excel抱怨“某些内容存在问题”,我是否希望他们尝试恢复?

这是从我的Hex编辑器创建的xlsx文件的图片: BadXlsxHexImage那些00继续几页。我确实删除了编辑器中的那些文件,直到文件打开没有错误。

为什么这段代码会在这个文件中添加如此多的NUL?

using (var exportData = new MemoryStream())
{
     workbook.Write(exportData);
     byte[] buf = exportData.GetBuffer();

     string saveAsFileName = sFileName + ".xlsx";

     Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
     Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}; size={1}", saveAsFileName, buf.Length.ToString()));
     Response.Clear();
     Response.OutputStream.Write(buf, 0, buf.Length);
     exportData.Close();
     Response.BufferOutput = true;
     Response.Flush();
     Response.Close();
}

(我已经尝试用BinaryWrite代替OutputStream.WriteResponse.End代替Response.Close,并设置Content-Length和缓冲区的长度此外,这些都不是写给xls的问题。)

1 个答案:

答案 0 :(得分:2)

您获得一堆空字节的原因是因为您在MemoryStream上使用GetBuffer。这将返回整个分配的内部缓冲区数组,如果缓冲区未完全填满,则将包括超出数据末尾的未使用字节。如果您只想获取缓冲区中的数据(您肯定会这样做),那么您应该使用ToArray代替。

话虽如此,你为什么要写MemoryStream?您已经有一个要写入的流:OutputStream。只需将工作簿直接写入。

试试这样:

Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", saveAsFileName));
workbook.Write(Response.OutputStream);
Response.Flush();
Response.Close();