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

vxf3dgd4  于 2023-05-30  发布在  其他
关注(0)|答案(4)|浏览(123)

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

2ledvvac

2ledvvac1#

我们花了太多的时间来追踪这个问题,一路上收集了一些红鲱鱼,但最终,解决了这个坏文件在一个方面是不同的。文件长度不同。在返回MemoryStream并将byte[]写入HTTP响应之前,请确保使用简单的stream.Capacity = (int)stream.Length;截断MemoryStream,使其容量和长度相同。
Excel现在似乎将文件中的额外内容检测为“不可读内容”的安全风险,并抛出恼人的错误,而在过去它会接受风险。

  • 注:答案取自原发帖者,他以前在他的问题中有答案 *
shyt4zoc

shyt4zoc2#

逐个检查以下内容,以从excel中删除“内容不可读错误”。
1.确保以正确的方式将正确的数据写入正确的单元格。对所有单元格都这样做。可能会发生在一个单元格中错误写入数据导致此问题。单元格索引使用正确。
2.尝试使用Cell.DataType = new EnumValue(CellValues.String)而不是共享字符串。这可能有助于删 debugging 误。
3.如果任何单元格包含#VALUE/#REF/#NAME?或#DIV错误,删除这些错误。
4.从服务器下载文件时出现此问题。在Web应用程序中创建Excel电子表格,使用MemoryStream并下载相同的内容。
使用以下代码: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()
hgtggwj0

hgtggwj03#

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

d7v8vwbk

d7v8vwbk4#

一些微妙的事情发生在我身上。我实际上调用了Flush()上的FileStream,没有它,我最终会得到一个损坏的文件,必须由Excel修复。它也通过调用Dispose()来工作,因为这在内部调用flush。

相关问题