#java #apache-poi #docx #docx4j
#java #apache-poi #docx #docx4j
Вопрос:
Моя цель — вставить docx (с сохранением стиля / форматирования) в определенную строку другого docx. Во втором docx есть слово «заполнитель», и сначала я должен найти это слово, а затем изменить его на первый текст docx, сохранив вставленные стили и форматы docx.
У меня есть идея. Может быть, мне следует создать новый docx, разделить второй docx с помощью «заполнителя», поместить первую часть в новый docx, затем поместить весь docx, а затем поместить вторую часть второго docx. Но как я могу сохранить стили и форматы? У меня нет изображений / табличек или чего-либо еще, только тексты и форматирование, такие как списки, вкладки, стиль текста и т.д.
В настоящее время я использую apache POI и java. (Я пробовал docx4j, но у меня было меньше успеха) Пример кода выполняет простое слияние, но не более того. Как я могу найти слово «заполнитель» и вставить туда свой docx?
public static void mer&e(InputStream src1, InputStream src2, OutputStream dest) throws Exception {
OPCPacka&e src1Packa&e = OPCPacka&e.open(src1);
OPCPacka&e src2Packa&e = OPCPacka&e.open(src2);
XWPFDocument src1Document = new XWPFDocument(src1Packa&e);
CTBody src1Body = src1Document.&etDocument().&etBody();
XWPFDocument src2Document = new XWPFDocument(src2Packa&e);
CTBody src2Body = src2Document.&etDocument().&etBody();
appendBody(src1Body, src2Body);
src1Document.write(dest);
}
private static void appendBody(CTBody src, CTBody append) throws Exception {
XmlOptions optionsOuter = new XmlOptions();
optionsOuter.setSaveOuter();
Strin& appendStrin& = append.xmlText(optionsOuter);
Strin& srcStrin& = src.xmlText();
Strin& prefix = srcStrin&.substrin&(0, srcStrin&.indexOf("&&t;") 1);
Strin& mainPart = srcStrin&.substrin&(srcStrin&.indexOf("&&t;") 1, srcStrin&.lastIndexOf("<"));
Strin& suffix = srcStrin&.substrin&(srcStrin&.lastIndexOf("<"));
Strin& addPart = appendStrin&.substrin&(appendStrin&.indexOf("&&t;") 1, appendStrin&.lastIndexOf("<"));
CTBody makeBody = CTBody.Factory.parse(prefix mainPart addPart suffix);
src.set(makeBody);
}
Ответ №1:
После docx4j вы можете вставить docx в определенное место (например, в ячейку таблицы) с помощью Mer&eDocx в нашем коммерческом Docx4j Enterprise.
Вы можете получить пробную версию от https://www.plutext.com/m/index.php/products
Затем ознакомьтесь с примером Mer&eIntoTableCell и документацией.
Ответ №2:
Другое решение таково: в моем примере в mainPart
мы можем найти текст (использование indexof / lastindexof / substrin& лучше, чем использование re&ex) и добавить (и заменить текст на) addPart
и готово к работе.
2 возможные проблемы:
- 1: если у нас есть нумерованные списки / маркированные списки в AddPart, это может привести к беспорядку после добавления в другой документ.
- 2. вставка изображения таким образом невозможна, оно должно обрабатываться другим способом.
Комментарии:
1. Правильно, ваш подход работает только для простых случаев (что может быть приемлемо в вашем приложении, если содержимое вставляемого docx предсказуемо). Он не сохраняет стиль / форматирование, которое было требованием, содержащимся в вашем вопросе…
2. Что ж, решение сохраняет следующее: размер и типы шрифтов / курсив / жирный шрифт / подчеркивание / табуляции / расстояния от полей, что является хорошим началом. 🙂 Да, у меня проблемы со стилями и списками. (У меня есть идея исправить и эти вещи, конечно, не лучшие решения, но мы посмотрим) Но позже я попробую Docx4j еще раз, и, возможно, мы сможем обсудить это позже. (но я бы предпочел бесплатное решение / библиотеку с открытым исходным кодом)