2015-12-29 1 views
1

Я работаю над приложением, которое должно создавать текстовые документы с использованием Office Open XML SDK 2.5. Идея, которую я имею сейчас, это то, что я начну с шаблона с пустым телом (так что я уже определил все пространства имен и т. Д.) И добавлю к нему Paragraphs. Если мне нужны изображения, я добавлю ImageParts и попытаюсь дать ImagePart идентификатор, присутствующий в предопределенной части абзаца, который будет содержать изображение. Я буду хранить абзацы как xml в базе данных, извлекать те, которые мне нужны, заполнять/изменять некоторые значения, если это необходимо, и вставлять их в документ Word. Но это сложная часть, как я могу легко вставить их таким образом, чтобы мне не приходилось запрашивать их содержимое, чтобы позже найти один из абзацев? Другими словами, мне нужен идентификатор. У меня есть некоторые варианты:Есть ли способ назначить идентификаторы абзацев в Open XML SDK 2.5?

  1. Для каждого возможного абзаца у меня есть вручную создать SdtBlock. Этот SdtBlock будет иметь идентификатор, который соответствует идентификатору каждого абзаца в базе данных. Это, похоже, много ручной работы, хотя, и я предпочел бы легче создавать будущие текстовые документы ... Я выбрал этот подход, но я вставляю Building Blocks, который может храниться в шаблонах с определенным тэгом.
  2. Создайте абзацы, скопируйте xml из инструмента разработчика и вручную добавьте ParagraphId. Хотя это кажется еще более кошмаром, потому что для каждого будущего нового абзаца мне придется создавать новые идентификаторы и т. Д. Также было бы невозможно вставлять таблицы, так как нет никакого способа (afaik) дать те Id.
  3. Работайте с закладками, чтобы узнать, куда вставлять данные. Мне это действительно не нравится, поскольку закладки видны для всех. Я знаю, что могу их заменить, но потом я не могу идентифицировать отдельные абзацы позже.
  4. **** моя база данных и просто добавьте все в шаблон: D Удалите абзацы, которые мне не нужны, удалив закладки с их контентом. Эта идея кажется худшей из всех, хотя, поскольку я не хочу зависеть от наличия файла шаблона со всем возможным содержимым в текстовом файле, который мне нужно создать.

Любой, у кого есть опыт работы в OpenXml, кто знает, какой из них был бы лучшим? Может быть, есть другой подход, который лучше, и я полностью забыл? Идеальным решением было бы то, что я могу добавить идентификаторы в Office Word, но это не так, как я еще ничего не нашел.

Заранее благодарен!

+0

У меня есть несколько идей об OpenXML, но я не совсем понимаю, как именно вы работаете с вашими шаблонами и документами, и мой ответ будет сильно зависеть от него. Вам нужно открыть документ в слове, имеющем эти идентификаторы? BTW, закладки могут быть скрыты - просто добавьте знак подчеркивания перед именем (вы можете сделать это только из кода) –

+0

Я хочу пустое тело (= пустой шаблон слова), и я добавляю абзацы, которые мне нужны. Пункты, которые я получил от базы данных. Но документ будет сделан в зависимости от того, какие параметры выбирает пользователь. Поэтому, если параметры меняются, я хочу, чтобы убрать некоторые абзацы, например, мне нужен Id –

+1

Почему вы не можете просто использовать его, как обычный xml, добавить свои собственные элементы с идентификатором и переопределить их из базы данных? В чем причина того, что вам нужно держать его в строгом OpenXML? Я вижу только одну причину этого - вам нужно открыть его в Word, и Word, безусловно, удалит все, что он не может понять. Если вам не нужно открывать в Word до того, как документ готов, просто используйте свои собственные элементы. –

ответ

1

управления содержимым (СТД) были разработаны для этого, хотя я не уверен, что дизайнеры никогда не предусматриваемые «ориентации» каждый и каждый абзац в документе ...

Еще в 2003/2007 году появилась возможность добавить пользовательскую надпись XML в документ Word, который был именно тем, что вы ищете. Но Microsoft потеряла дело патентного суда в 2009 году и вынуждена была вытащить функциональность. Таким образом, контент-контроль - это действительно ваш единственный хороший выбор.

Ваш подход может, возможно, быть объединен с концепцией BuildingBlocks.BuildingBlocks - это содержимое Word, хранящееся в файле шаблона Word, как действительный Word Open XML. Они могут быть отнесены к «галереям» и классифицированы. Существует элемент управления содержимым типа BuildingBlock, который может быть связан с определенной Галереей и категорией, которая может помочь вам в определенной степени и будет альтернативой хранению контента в базе данных.

+0

Спасибо, я загляну в это :) –

+0

Заглядывая в него, и хотя немного сложно работать, это было действительно то, что я ищу :) Теперь я смог скопировать 'docPartBody' в мой 'SdtContentBlock', но таким образом у меня нет изображений. Я могу, конечно, скопировать изображения, которые мне нужны из пакета шаблонов, в мой документ, но есть ли более простой способ? (Я видел 'defaultPlaceHolder' в xml и т. Д., Так что, возможно, есть более простой способ сделать это в open xml sdk?) –

1

Хорошо, я сделал небольшое исследование, вы можете сделать это в строгом OpenXML, но только перед тем, как открыть файл в Word. Word удалит все, что не может прочитать.

using (WordprocessingDocument document = WordprocessingDocument.Open(path, true)) { 
    document.MainDocumentPart.Document.Body.Ancestors().First() 
     .SetAttribute(new OpenXmlAttribute() { 
      LocalName = "someIdName", 
      Value = "111" }); 
} 

Вот, к примеру, я установил атрибут «someIdName», который не завершает работу в OpenXML, в какой-то случайный элемент. Вы можете установить его в любом месте и использовать его в качестве идентификатора

+0

Это то, что мне нужно сохранить 'id', поэтому я могу редактировать/удалять/все позже. Но +1 для идеи сборки документа за пределами Word, собираюсь поэкспериментировать с этим –

+0

Вот почему я спросил об этом. Это имеет большое значение. –