用另一个 docx 文件的内容替换 docx 文件中的文本

Replace text in docx file with content of another docx file

我正在尝试使用 OpenXml 将文件 A.docx 中的文本“Veteran”替换为 B.docx 中的内容。如果 B.docx 包含文本或段落,它工作正常并且我得到修改的 A.docx 文件。 但是,如果 B.docx 包含 table,则代码不起作用。

        static void Main(string[] args)
        {
            SearchAndReplace(@"C:\A.docx", @"C:\B.docx");
        }

        public static void SearchAndReplace(string docTo, string docFrom)
        {
            List<WordprocessingDocument> docList = new List<WordprocessingDocument>();
            using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(docTo, true))
            using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(docFrom, true))
            {
                var parts = wordDoc1.MainDocumentPart.Document.Descendants().FirstOrDefault();
                docList.Add(wordDoc);
                docList.Add(wordDoc1);

                if (parts != null)
                {
                    foreach (var node in parts.ChildElements)
                    {
                        if (node is Table)
                        {
                            ParseTable(docList, (Table)node, textBuilder);
                        }
                    }
                }
            }
        }

        public static void ParseText(List<WordprocessingDocument> wpd, Paragraph node, StringBuilder textBuilder)
        {
            Body body = wpd[0].MainDocumentPart.Document.Body;
            Body body1 = wpd[1].MainDocumentPart.Document.Body;

            string content = body1.InnerXml;
            var paras = body.Elements<Paragraph>();

            foreach (var para in paras)
            {
                foreach (var run in para.Elements<Run>())
                {
                    foreach (var text in run.Elements<Text>())
                    {
                        if (text.Text.Contains("Veteran"))
                        {
                            run.InnerXml.Replace(run.InnerXml, content);
                            break;
                        }
                    }
                }
            }
        }

        public static void ParseTable(List<WordprocessingDocument> wpd, Table node, StringBuilder textBuilder)
        {
            foreach (var row in node.Descendants<TableRow>())
            {
                textBuilder.Append("| ");
                foreach (var cell in row.Descendants<TableCell>())
                {
                    foreach (var para in cell.Descendants<Paragraph>())
                    {
                        ParseText(wpd, para, textBuilder);
                    }
                    textBuilder.Append(" | ");
                }
                textBuilder.AppendLine("");
            }
        }
    }
}

如何进行这项工作?有没有更好的方法用另一个 docx 文件替换内容?

具体答案不够详细,以下是解决此类问题的一般方法:

  1. 确保您了解 Open XML 规范和适当详细程度的有效 Open XML 标记。

  2. 了解大多数 Open XML-related 代码 将一些源标记 转换为一些目标标记。因此,您必须:

    • 先了解源标记和目标标记,然后再
    • 定义从源创建目标所需的转换。

根据您需要执行的操作,Open XML 生产力工具可以帮助创建转换代码。如果您有源文件和目标文件,您可以使用快捷会议工具比较这些文件。这显示了标记的差异,因此您可以看到创建、删除或更改了哪些标记。它甚至会向您显示实现更改所需的 Open XML SDK-based 代码。

在我自己的用例中,我通常更喜欢写 recursive, pure functional transformations。虽然您需要全神贯注于这个概念,但这是一种非常强大的方法。

对于你的情况,你应该:

  • 取几个有代表性的 manually-created 源样本(A.docx 与 "Vetaran" 仍待替换)和目标(A.docx 与 "Veteran" 替换根据需要)文件;
  • 查看源文档和目标文档的 Open XML 标记;和
  • 编写创建目标标记的代码。

一旦您创建了至少尝试创建有效目标 Open XML 标记的代码,您可以回来提出更多问题,以防您发现更多问题。