#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.
Все еще ищете более простой готовый инструмент из коробки.