如何从MemoryStream中移除以指定起始字符串开头的后续数据
问题解决思路
首先你踩了个核心坑:Word文档(不管是docx还是doc格式)不是纯文本文件,直接用StreamReader把它转成字符串肯定会乱码,自然找不到"EmployeeDetail"这个字符串。
- 如果你用的是docx格式:它本质是一个ZIP压缩包,里面包含各种XML文本文件。你得先解压这个流,找到存储目标内容的XML文件(比如
document.xml),在XML文本里定位并截断"EmployeeDetail"之后的内容,再重新打包成docx流。 - 如果你用的是旧版doc格式:这是二进制格式,必须用专门的Office处理库(比如OpenXML SDK、NPOI)来解析和修改内容,不能直接操作原始流。
另外给你提几个原代码的小问题:
Memorystream拼写错误,C#大小写敏感,正确写法是MemoryStream- 你定义了
toWrite但完全没用到,最后还是把原字符串st写回新流,等于没做截断操作
下面给你一个用OpenXML SDK处理docx的示例代码:
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; // 假设ms是原始的docx模板流 using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(ms, true)) { MainDocumentPart mainPart = wordDoc.MainDocumentPart; string docText = null; using (StreamReader reader = new StreamReader(mainPart.GetStream())) { docText = reader.ReadToEnd(); } // 定位并截断内容 int index = docText.IndexOf("EmployeeDetail"); if (index != -1) { docText = docText.Substring(0, index); } // 写回修改后的内容 using (StreamWriter writer = new StreamWriter(mainPart.GetStream(FileMode.Create))) { writer.Write(docText); } } // 重置流位置以便后续使用 ms.Position = 0; return ms;
注意:使用这段代码需要先安装DocumentFormat.OpenXml NuGet包。如果是doc格式,建议用NPOI库处理,逻辑类似——先解析文档内容,找到目标位置截断,再生成新流。
内容的提问来源于stack exchange,提问作者Tiger
相关产品推荐
相关产品推荐

