使用Open XML SDK v2.0创建Excel电子表格时,我们的Excel输出最初成功运行了几个月。最近Excel(所有版本)开始抱怨“Excel在'zot.xlsx'中找到了不可读的内容。你想恢复这个工作簿的内容吗?”。我们使用MemoryStream作为存储在Web应用程序中创建文件,然后将其作为byte []发送到HTTP响应中,MIME类型为“application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”。坏文件的解压缩内容与没有错误的文件的解压缩内容相同。
答案 0 :(得分:10)
我们追了太久时间,沿途拾起了几条红色鲱鱼,但最后还是认为坏文件在某方面是不同的。文件长度不同。在返回MemoryStream并将byte []写入HTTP响应之前,请确保使用简单的" stream.Capacity = stream.Length;'截断MemoryStream以使其容量和长度相同。
Excel现在检测到文件中的额外内容是安全风险,因为“不可读的内容”并抛出恼人的错误,在过去它会接受风险。
注意:回答原始海报,他以前在他的问题中有答案
答案 1 :(得分:1)
逐一检查以下内容,从excel中删除“不可读的内容错误”。
1.确保正确的数据以正确的方式写入正确的单元格。 对所有细胞都这样做。可能会在一次单元格中错误地写入数据导致此问题。正确使用了细胞索引。
2.尝试使用Cell.DataType = new EnumValue(CellValues.String)而不是共享字符串。这可能有助于消除错误。
3.如果任何单元格包含#VALUE /#REF /#NAME?或#DIV错误,删除这些错误。
4.从服务器下载文件时出现此问题。 使用MemoryStream在Web应用程序中创建excel电子表格并下载它。
使用以下代码: HttpContext.Current.Response.Clear()
Response.ClearHeaders()
Response.Buffer = False
msReportStream = CType(controller.GetFromSession
(Constants.SESSION_REPORT), MemoryStream)
Response.ContentType = "application/vnd.openxmlformats-
officedocument.spreadsheetml.sheet"
Response.AddHeader("Connection", "Keep-Alive")
Response.AddHeader("Content-Disposition", String.Format("attachment;
filename={0}", strReportFileName))
Response.ContentEncoding = Encoding.UTF8
Response.BinaryWrite(msPNLReportStream.ToArray())
Response.Flush()
Response.Close()
Response.End()--use this when the code is deployed in server only not required in local.gives error in local.
msReportStream.Dispose()
msReportStream.Close()
如果您使用ASPOSE技术,请使用
Me.Response.Clear()
Me.Response.Buffer = False
Me.Response.AddHeader("Accept-Ranges", "bytes")
Response.ContentType = "application/octet-stream"
Response.AddHeader("Connection", "Keep-Alive")
Response.ContentEncoding = Encoding.UTF8
asposeReport.ShowSavePopUp(Me.Response, controller.GetFromSession(Constants.SESSION_REPORT), strReportFileName)
Me.Response.Flush()
Me.Response.Close()
Me.Response.End()
答案 2 :(得分:0)
使用适用于Microsoft Office的Open XML SDK 2.5生产力工具打开.xlsx文件并验证文档,这将为您提供导致不可读内容的任何验证错误