You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:08:18