Читать и писать документы MS Word, используя пользовательские свойства? - PullRequest
0 голосов
/ 04 октября 2018

Я использую приведенный ниже код для генерации текстового документа с содержанием HTML, используя docx4j, и могу успешно сгенерировать документ.

Мое требование - писать контент с некоторыми пользовательскими свойствами, чтобы было легко прочитать тот же документ после внесения пользователем изменений.

String finalData = "<h1> Heading One </h1>".aapend("<h2> Heading two </h2>");

String str1 = new StringBuffer()
                .append("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html;
                charset=UTF-8\" /><style type='text/css'> 
                * { font-family: 'Arial Unicode MS'; } </style></head>")
                .append(finalData).append("</html>").toString();


        str1 = fixWhitespaceIssue(str1);
        str1 = cleanHTML(str1);

        System.out.println(str1);
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
        XHTMLImporterImpl XHTMLImporter = new XHTMLImporterImpl(wordMLPackage);
        XHTMLImporter.setRunFormatting(FormattingOption.CLASS_PLUS_OTHER);
        NumberingDefinitionsPart ndp = new NumberingDefinitionsPart();
        wordMLPackage.getMainDocumentPart().addTargetPart(ndp);
        ndp.unmarshalDefaultNumbering();
        wordMLPackage.getMainDocumentPart().getContent().addAll(XHTMLImporter.convert(str1, null));
        File exportFile = new File("test.docx");
        wordMLPackage.save(exportFile);

, например,

<h1> Heading One </h1> // i'll bind custom property for first element as c_property1
<h2> Heading two </h2> // i'll use custom property for second element as c_property2

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

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

для c_property1 код должен возвращать Heading One или обновить значение, например Updated Heading One

для c_property2 код должен возвращать Heading two или обновлять значение, например Updated Heading two

Может кто-нибудь предложить мне какое-нибудь решение или альтернативы, которые помогут мне его завершить.Буду признателен за помощь Спасибо заранее.

1 Ответ

0 голосов
/ 12 октября 2018

TLDR : вы можете использовать FieldUpdater docx4j для обновления поверхности документа из ваших пользовательских свойств, но вам нужно будет написать некоторый код для помещения подходящих полей DOCPROPERTY в документ (т.е. в вашем случае послевы преобразовали свой XHTML в docx).

Элементы управления содержимым не помогают настраивать свойства

Чтобы настроить docx, в Word (последние версии)Сначала включите меню разработчика (если вы этого еще не сделали).

Нажмите «Панель отображения XML».Появляющаяся панель задач позволяет вам выбирать из «основных» или «расширенных» свойств.

Щелкните правой кнопкой мыши по интересующему вас свойству;"Вставить Content COntrol"> "PLain Text".

Вы увидите это в своем документе.

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

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

Java-код для создания элемента управления содержимым может быть сгенерирован из образца docx, либоиспользуя Docx4j Helper Word AddIn или веб-приложение docx4j.

Вы должны привязать свой элемент управления контентом к части CutomXML с помощью ItemID.Некоторые пользовательские части xml хорошо известны: https://msdn.microsoft.com/en-us/library/ff531265(v=office.12).aspx

И когда я связываю свойство ядра, оно использует w: storeItemID = "{6C3C8BC8-F283-45AE-878A-BAB7291924A1}"

Но не существует storeItemID для пользовательских свойств?

https://social.msdn.microsoft.com/Forums/office/en-US/c7e66714-3224-4298-8673-1ce095db092a/how-to-create-databinding-between-custom-property-value-and-content-control-such-as-text?forum=oxmlsdk

Вы можете попробовать добавить элемент itemProps к своей части пользовательских свойств, но я сомневаюсь, что это сработает!

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

Поле DOCPROPERTY для спасения

Но существует устаревший подходдоступно: вы можете использовать поле DOCPROPERTY, которое указывает на пользовательское свойство.

И DocPropertyResolver из docx4j знает, что с ними делать.Смотрите FieldUpdater: https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/model/fields/FieldUpdater.java.

...