Open XML:如何将已有的WordprocessingDocument保存至MemoryStream?
解决WordprocessingDocument获取/转存MemoryStream的方案
一、直接获取底层MemoryStream
如果你的WordprocessingDocument是基于MemoryStream创建的,可直接通过BaseStream属性获取底层流,但需注意两个关键点:
- 确保文档尚未被
Dispose或关闭,否则BaseStream可能无法正常访问 - 获取流后必须将其
Position重置为0,否则后续读取操作会从流的末尾开始
代码示例:
// 假设doc是你从其他方法获取到的WordprocessingDocument对象 MemoryStream underlyingStream = doc.BaseStream as MemoryStream; if (underlyingStream != null) { // 重置流的读取位置到起始点 underlyingStream.Position = 0; // 此时即可将该流传输至仓库 }
二、转存到新的MemoryStream(通用兼容方案)
如果无法直接获取底层流(比如不确定原流类型、原流已被处理),可以将文档内容复制到新的MemoryStream中,步骤如下:
- 若对原文档进行过编辑操作,先调用
doc.Save()提交更改 - 重置原流的读取位置,再将内容复制到新流中
代码示例:
// 创建用于存储的新MemoryStream MemoryStream newStream = new MemoryStream(); // 提交原文档的所有更改(如果有编辑操作必须执行此步) doc.Save(); // 将原流内容复制到新流 doc.BaseStream.Position = 0; doc.BaseStream.CopyTo(newStream); // 重置新流的读取位置到起始点 newStream.Position = 0; // 后续可使用newStream进行传输,使用完毕按需释放资源 // 原文档使用完成后记得释放资源 doc.Dispose();
额外注意事项
- 若对文档有修改操作,必须先调用
Save(),否则更改不会写入到流中 - 流和文档对象使用完毕后,务必调用
Dispose()释放资源,避免内存泄漏 - 如果原文档是通过
WordprocessingDocument.Open(Stream, bool)打开的,第二个参数isEditable需设为true才能保存更改
内容的提问来源于stack exchange,提问作者igorjrr
相关产品推荐
相关产品推荐

