C#中基于JSON替换Word文档字符串仅生效最后一项的问题
问题排查:循环替换Word文档内容仅最后一次生效
我一眼就看出问题所在了——你的替换逻辑犯了一个典型的"覆盖式更新"错误,咱们一步步拆解:
问题根源
你在循环里每次都是用**原始的docText**执行替换,然后把结果赋值给finalWordDocument:
finalWordDocument = docText.Replace(animals, humans);
举个具体的例子:
- 第一次循环:用原始文本把"Frog"换成"John",得到
finalWordDocument= 替换后的文本 - 第二次循环:又回到原始的
docText,把"Horse"换成"Alice",直接覆盖了之前的finalWordDocument结果
最终自然只有最后一次替换生效了!
修复方案
你需要让每次替换都基于上一次替换后的文本,而不是原始文本。只需要调整初始化和循环内的替换逻辑:
- 初始化
finalWordDocument为原始的docText - 循环里用
finalWordDocument自身来执行替换,持续更新它的值
修改后的核心代码片段:
// 初始化finalWordDocument为原始文档文本 string finalWordDocument = docText; foreach (JObject item in jsonStream) { String animals = item.GetValue("Animal")?.ToString() ?? string.Empty; String humans = item.GetValue("Human")?.ToString() ?? string.Empty; Console.WriteLine(animals); Console.WriteLine(humans); // 基于上一次的结果继续替换 finalWordDocument = finalWordDocument.Replace(animals, humans); }
额外优化建议
除了核心逻辑,你的代码还有几个可以改进的地方:
- using语句的正确嵌套:
WordprocessingDocument应该直接放在using里,避免资源泄漏 - 空值安全处理:
item.GetValue可能返回null,用?.ToString() ?? string.Empty避免空引用异常 - Stream操作的简化:可以直接用
MainDocumentPart的GetStream方法简化读写
完整的优化后代码:
private void ReplaceWords(Stream stream, JArray jsonStream, string filePath) { using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true)) { string docText; // 读取文档内容 using (StreamReader docxReader = new StreamReader(doc.MainDocumentPart.GetStream())) { docText = docxReader.ReadToEnd(); } // 初始化替换后的文本为原始内容 string finalWordDocument = docText; foreach (JObject item in jsonStream) { string animal = item.GetValue("Animal")?.ToString() ?? string.Empty; string human = item.GetValue("Human")?.ToString() ?? string.Empty; Console.WriteLine($"替换:{animal} → {human}"); // 累计替换结果 finalWordDocument = finalWordDocument.Replace(animal, human); } Console.WriteLine("最终替换后的文档内容:"); Console.WriteLine(finalWordDocument); // 写入替换后的内容 using (StreamWriter docxWriter = new StreamWriter(doc.MainDocumentPart.GetStream(FileMode.Create))) { docxWriter.Write(finalWordDocument); } } }
这样修改后,所有的替换都会依次生效,不会再被覆盖啦!
内容的提问来源于stack exchange,提问作者Sojimanatsu
相关产品推荐
相关产品推荐

