Заменить текст в файле docx содержимым другого файла docx - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь использовать Open Xml для замены текста " Veteran " в файле A.docx содержимым в 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?

1 Ответ

0 голосов
/ 22 марта 2020

Недостаточно подробностей для конкретного c ответа, вот как вы решаете такие проблемы в целом:

  1. Убедитесь, что вы понимаете спецификацию Open XML и действительный Open XML разметка на соответствующем уровне детализации.

    • Если вы не понимаете, что w:document, w:body, w:p, w:r, w:t, w:tbl и т. д. c. и как они связаны друг с другом, у вас нет шансов.
    • Вы должны посмотреть на фактическую разметку Open XML, например, с помощью Open XML Productivity Tool или Open XML Редактор пакетов для Modern Visual Stud ios для достижения необходимого уровня понимания и разработки решений на основе Open XML.
  2. Поймите, что большинство открытого XML связанного кода преобразует некоторой исходной разметки в некоторую целевую разметку. Поэтому вы должны:

    • сначала понять разметку источника и цели, а затем
    • определить преобразование, необходимое для создания цели из источника.

В зависимости от того, что вам нужно сделать, инструмент повышения производительности Open XML может помочь в создании преобразующего кода. Если у вас есть исходный и целевой документ, вы можете использовать инструмент повышения производительности для сравнения этих документов. Это показывает разницу в разметке, поэтому вы видите, какая разметка создана, удалена или изменена. Он даже показывает вам код Open XML SDK, необходимый для осуществления изменения.

В моих собственных случаях использования я обычно предпочитаю писать рекурсивные, чисто функциональные преобразования . Хотя вам нужно обдумать эту концепцию, это очень мощный подход.

В вашем случае вам следует:

  • взять несколько репрезентативных, созданных вручную образцов исходный (A.docx с «Ветераном», который еще предстоит заменить) и целевой (A.docx с «Ветераном», замененным по желанию) документов;
  • посмотрите на открытую XML разметку исходного и целевого документов; и
  • написать код, который создает целевую разметку.

После того, как вы создали код, который хотя бы пытается создать действительную целевую разметку Open XML, вы можете вернуться с дополнительными вопросами на случай, если вы выявите дальнейшие проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...