根据this article,当“MemoryStreams达到高水位线”并且必须切换到IsolatedStorage时,OpenXML不是线程安全的。
这种情况发生在小于1mb的工作簿上,因为UNCOMPRESSED数据的大小可能是10倍。
我真的需要同时创建xlsx文件,特别是具有并发性的异常大的文件。 MS解决方案是实现类似下面的内容(从C#转换),但我不知道如何处理它。
Public Class PackagePartStream
Private _stream As Stream
Private Shared _m As New Mutex(False)
Public Sub New(ByVal Stream As Stream)
_stream = Stream
End Sub
Public Function Read(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer) As Integer
Return _stream.Read(buffer, offset, count)
End Function
Public Sub Write(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer)
_m.WaitOne(Timeout.Infinite, False)
_stream.Write(buffer, offset, count)
_m.ReleaseMutex()
End Sub
Public Sub Flush()
_m.WaitOne(Timeout.Infinite, False)
_stream.Flush()
_m.ReleaseMutex()
End Sub
End Class
到目前为止,我最好的猜测是这样的,但我有一种感觉,我过度简化了这一点,互斥体需要更接近处理OpenXML的WriteElement的函数
Dim stream As New PackagePartStream()
Using document As SpreadsheetDocument = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook, True)
WriteExcelFile(ds, document)
End Using
我在.NET中没有做太多的线程,但希望我可以被某人指向正确的方向。
答案 0 :(得分:1)
我讨厌回答我自己的问题,但如果您要在网络服务器上构建动态报告,请不要使用OpenXML SDK。请改用EPplus。它使用不使用IsolagedStorage的替代打包库。很遗憾微软没有解决这个问题。