Упростите / Очистите XML документа Word DOCX - PullRequest
17 голосов
/ 13 октября 2011

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

Я хочу программно вставить некоторые значения базы данных в документ. Для этого я набрал простой текст, такой как [[placeholder 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?

Ответы [ 4 ]

14 голосов
/ 14 октября 2011

Я нашел решение: Упрощенный разметчик Open XML PowerTools.

Я выполнил шаги, описанные в http://ericwhite.com/blog/2011/03/09/getting-started-with-open-xml-powertools-markup-simplifier/,, но он не работал 1: 1 (возможно, потому что теперь это версия2.2 Электроинструмента?).Итак, я скомпилировал 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);
        }
    }
}
1 голос
/ 04 января 2016

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

включает объединение двух разветвленных документов.

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

Install-Package OpenXmlPowerTools

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

//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.

1 голос
/ 13 октября 2011

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

0 голосов
/ 06 октября 2014

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

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

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

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

...