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

问题描述 投票:-1回答:1

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

        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文件替换内容?

c# .net ms-word openxml
1个回答
0
投票

没有足够具体的答案,这是您通常解决此类问题的方式:

  1. 确保您了解Open XML规范和适当级别的有效Open XML标记。

  2. 了解大多数与Open XML相关的代码transforms

  3. 将某些源标记转换成目标标记。因此,您必须:
  • 首先了解源和目标标记
  • 定义从源创建目标所需的转换。

根据您需要执行的操作,Open XML生产率工具可以帮助创建转换代码。如果您有原始文档和目标文档,则可以使用“生产力工具”来比较那些文档。这显示了标记的差异,因此您可以看到创建,删除或更改了哪些标记。它甚至显示了实现更改所需的基于Open XML SDK的代码。

在我自己的用例中,我通常更喜欢写recursive, pure functional transformations。尽管您需要围绕这个概念进行思考,但这是一种非常强大的方法。

在您的情况下,您应该:

  • [获取一些代表性的,手动创建的源(A.docx仍替换“ Vetaran”)文档和目标(根据需要,A.docx替换为“ Veteran”)文档的样本;
  • 查看源和目标文档的Open XML标记;和
  • 编写创建目标标记的代码。
  • 一旦创建了至少尝试创建有效的目标Open XML标记的代码,如果您发现其他问题,您可能会再提出其他问题。

© www.soinside.com 2019 - 2024. All rights reserved.