Упрощение / очистка XML документа DOCX word

#c# #xml #ms-word #openxml #openxml-sdk

#c# #xml #ms-word #openxml #openxml-sdk

Вопрос:

У меня есть документ Microsoft Word (docx), и я использую Open XML SDK 2.0 Productivity Tool для генерации из него кода на C #.

Я хочу программно вставить некоторые значения базы данных в документ. Для этого я ввел простой текст, например [[заполнитель 1]] в тех местах, где моя программа должна заменить заполнители значениями своей базы данных.

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

[[хороший держатель места]]

 <w:tc xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:tcPr>
    <w:tcW w:w="1798" w:type="dxa" />
    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
  </w:tcPr>
  <w:p w:rsidRPr="008C2E16" w:rsidR="001F54BF" w:rsidP="000D7B67" w:rsidRDefault="0009453E">
    <w:pPr>
      <w:spacing w:after="0" w:line="240" w:lineRule="auto" />
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
    </w:pPr>
    <w:r w:rsidRPr="0009453E">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t>[[good place holder]]</w:t>
    </w:r>
  </w:p>
</w:tc>
  

против [[плохой держатель места]]

 <w:tc xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:tcPr>
    <w:tcW w:w="1799" w:type="dxa" />
    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
  </w:tcPr>
  <w:p w:rsidRPr="008C2E16" w:rsidR="001F54BF" w:rsidP="000D7B67" w:rsidRDefault="00EA211A">
    <w:pPr>
      <w:spacing w:after="0" w:line="240" w:lineRule="auto" />
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
    </w:pPr>
    <w:r w:rsidRPr="00EA211A">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t>[[</w:t>
    </w:r>
    <w:proofErr w:type="spellStart" />
    <w:r w:rsidRPr="00EA211A">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t>bad</w:t>
    </w:r>
    <w:proofErr w:type="spellEnd" />
    <w:r w:rsidRPr="00EA211A">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t xml:space="preserve"> place holder]]</w:t>
    </w:r>
  </w:p>
</w:tc>
  

Есть ли какая-либо возможность позволить Microsoft Word очистить мой документ, чтобы все заполнители были хорошо идентифицированы в сгенерированном XML?

Комментарии:

1. похоже, что ваш контент разделяется маркером «орфографическая ошибка»… Мне любопытно, почему слово «bad» было идентифицировано как проблема с правописанием (может быть, документ не настроен на английский?), Но не обращайте на это внимания; как указал амурра, вам нужно будет придумать заполнитель, которого нет в целевом тексте, но и нетсчитается, что это несколько слов.

Ответ №1:

Я нашел решение: упрощатель разметки Open XML PowerTools.

Я выполнил шаги, описанные в http://ericwhite.com/blog/2011/03/09/getting-started-with-open-xml-powertools-markup-simplifier /, но это не сработало 1: 1 (может быть, потому, что теперь это версия 2.2 Power Tools?). Итак, я скомпилировал PowerTools 2.2 в режиме «Release» и сделал ссылку на OpenXmlPowerTools.dll в моем TestMarkupSimplifier.csproj. В Program.cs я только изменил путь к своему файлу DOCX. Я запустил программу один раз, и теперь мой документ выглядит довольно чистым.

Код, цитируемый из блога Эрика по ссылке выше:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenXmlPowerTools;
using DocumentFormat.OpenXml.Packaging;

class Program
{
    static void Main(string[] args)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open("Test.docx", true))
        {
            SimplifyMarkupSettings settings = new SimplifyMarkupSettings
            {
                RemoveComments = true,
                RemoveContentControls = true,
                RemoveEndAndFootNotes = true,
                RemoveFieldCodes = false,
                RemoveLastRenderedPageBreak = true,
                RemovePermissions = true,
                RemoveProof = true,
                RemoveRsidInfo = true,
                RemoveSmartTags = true,
                RemoveSoftHyphens = true,
                ReplaceTabsWithSpaces = true,
            };
            MarkupSimplifier.SimplifyMarkup(doc, settings);
        }
    }
}
  

Ответ №2:

Вам нужно избавиться от информации Rsid. В соответствии с информацией об идентификаторе Rsid на этой странице

позволяет объединить два документа, которые разветвлялись.

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

 Install-Package OpenXmlPowerTools
  

Затем у вас все будет готово для запуска следующего кода. (Предполагая, что у вас уже есть «Test.docx » файл добавлен к вашему документу. Если вы используете Visual Studio, вам необходимо убедиться, что у вас есть копия файла в папке Debug или Release в зависимости от вашего режима сборки.)

 //Sample code to remove Rsid information from a "Test.docx" document

 using (WordprocessingDocument doc = WordprocessingDocument.Open("Test.docx", true))
        {
            SimplifyMarkupSettings settings = new SimplifyMarkupSettings
            {  
                RemoveRsidInfo = true 
            };
            MarkupSimplifier.SimplifyMarkup(doc, settings);
        }
  

Это позволит удалить информацию Rsid, которая может мешать в процессе работы с файлами Word.

Ответ №3:

Я не знаю способа очистки XML, но я всегда использовал #placeholder для своего текста-заполнителя, и, похоже, он остается в одном прогоне больше, чем любой другой текст-заполнитель, который я пробовал в прошлом. Кажется, чем длиннее текст-заполнитель, тем больше вероятность его разделения на несколько прогонов.

Комментарии:

1. У меня это не сработало. Он просто отменил мои ручные изменения… В любом случае спасибо.

Ответ №4:

Для тех, кто ищет ручное непрограммное решение:

http://www.translationtribulations.com/2010/06/cleaning-up-superfluous-tags-in-docx.html

Я проверил, что бесплатную пробную версию memoQ 2014 действительно можно использовать в качестве громоздкого обходного пути для очистки тегов Word spell.

Все еще ищете более простой готовый инструмент из коробки.