如何在.NET中将Excel工作簿写入MemoryStream?

时间:2020-03-06 14:57:50  来源:igfitidea点击:

如何在不先将Excel工作簿保存到文件系统的情况下将其写入" MemoryStream"?

" Microsoft.Office.Interop.Excel.WorkBook"保存选项中的所有选项都使用文件名。

解决方案

我已经与PIA进行了广泛的工作,并将Excel文件存储在文档存储库中并将其流式传输到浏览器,并且在没有先将内容首先写入文件系统的情况下,我找不到使用PIA的解决方案。

我认为我们将不得不吞下子弹,以中介的身份处理文件系统。好消息是,我们可以为文件指定一个唯一的名称,如guid或者使用其他一些tempfilename方法(不确定.net中是否存在),并在完成后删除其中的内容。

如果仅需要Excel的基本功能,则可能需要将工作簿创建为HTML流。因此,还有另一个问题使这个问题变得毫无意义。

这也解决了一些有关解决方案可伸缩性的问题(我们可能还没有)。

另一个选择是使用此免费库导出工作簿。工作簿类上的save方法可以采用文件名或者流。

唯一可以执行此操作的方法是,如果准备好创建一个自定义对象,该对象允许我们存储要保留的所有各种数据/公式/ vba /链接/ ole对象的各个片段,然后将其从工作簿复制到对象,然后将该对象持久存储到内存流中。会影响使用代理对象作为中间对象。

正如其他人所说,没有办法直接将Excel文件写入内存。

使用Excel 2007 OpenXML格式,可以使用工作簿的BeforeSave事件具有一个自定义方法,该方法首先将BeforeSave事件的Cancel参数设置为True,然后将生成的xml包(代表文件)序列化为一个对象。在记忆中。

这可以使用Open XML SDK 2.0来完成。埃里克·怀特(Eric White)在《使用内存中的开放XML文档》中有一篇很棒的文章,介绍如何使用流中的OOXML文件。