问题 使用MemoryStream创建Open XML电子表格时的Excel和“不可读的内容”


使用Open XML SDK v2.0创建Excel电子表格时,我们的Excel输出最初成功运行了几个月。最近Excel(所有版本)开始抱怨“Excel在'zot.xlsx'中找到了不可读的内容。你想恢复这个工作簿的内容吗?”。我们使用MemoryStream作为存储在Web应用程序中创建文件,然后将其作为byte []发送到MIME响应类型为“application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”的HTTP响应中。错误文件的解压缩内容与没有错误的文件的解压缩内容相同。


4472
2018-04-30 14:06


起源

回答你自己的问题是非常好的形式。但是问题的答案是不好的形式:)你应该把答案放在答案表格中并将其标记为正确,所以你的问题不会出现在未答复的问题列表中。 - Ben Fulton


答案:


我们追了太久的时间,沿途捡起了几条红色的鲱鱼,但最后还是认为坏文件在一方面是不同的。文件长度不同。在返回MemoryStream并将byte []写入HTTP响应之前,请确保使用简单的“stream.Capacity = stream.Length;”截断MemoryStream以使其容量和长度相同。

看来Excel现在检测到文件中的额外内容作为“不可读内容”的安全风险并抛出恼人的错误,而在过去它会接受风险。

注意:答案取自原始海报,他之前在他的问题中得到了答案


10
2017-11-17 16:41



我的天啊!谢谢!它为我节省了很多时间。 - Json
这对我没有解决问题:( - Renan


请逐一检查以下内容,从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()

1
2017-12-18 10:44





使用Open XML SDK 2.5 Productivity Tool for Microsoft Office打开.xlsx文件并验证文档,这将为您提供导致不可读内容的任何验证错误


0
2017-08-30 06:49