在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.Write
,Response.End
代替Response.Close
,并设置Content-Length
和缓冲区的长度此外,这些都不是写给xls的问题。)
答案 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();