Необходимо создать файл .doc со списком элементов с помощью Aspose.

Я работаю над устаревшим приложением, где я использую Aspose.Words.jdk15.jar для печати файла .doc. У меня есть требование, когда я получаю список значений, затем нам нужно зациклить и распечатать его в файле документа.

И это значение мы заменяем в документе с помощью метода range.replace(). Этот документ уже существует в моей рабочей области, где мы сопоставили значение, подобное этому.

Название компонента:$COMPONENT_NAME Дата вступления в силу платежа:$EFFECTIVE_DATE Дата окончания платежа:$END_DATE

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

for(int i=0;i‹details.size();i++) {

doc.getRange().replace($COMPONENT_NAME , checkNull(details.get(i).getComponentName()) + «,», false, false); doc.getRange().replace($EFFECTIVE_DATE, checkNull(details.get(i).getBillEffectiveDate()) + ",", false, false); doc.getRange().replace($END_DATE , checkNull(details.get(i).getBillEndDate()) + «,», false, false); }


person Sumit Ranjan    schedule 22.09.2020    source источник


Ответы (1)


Лучший способ добиться того, что вам нужно, — это использовать функцию слияния почты. https://docs.aspose.com/words/java/about-mail-merge/ Но в этом случае вам нужно заменить заполнители на поля слияния в вашем шаблоне. Если вы не можете изменить шаблон, вы можете клонировать документ для каждого элемента в вашем списке, заменить значения в клонированном документе и объединить документы вместе, чтобы получить окончательный результат. Код будет выглядеть следующим образом:

// Open template
Document doc = new Document("C:\\Temp\\in.doc");

// Create document where result will be stored to.
// Simply clone the original template without children,
// In this case styles of the original document will be kept.
Document result = (Document)doc.deepClone(false);

for(int i=0; i<details.length; i++)
{
    Document component = doc.deepClone();

    component.getRange().replace("$COMPONENT_NAME", details[i].getComponentName());
    component.getRange().replace("$EFFECTIVE_DATE", details[i].getBillEffectiveDate().toString());
    component.getRange().replace("$END_DATE", details[i].getBillEndDate().toString());

    // Append the result to the final document.
    result.appendDocument(component, ImportFormatMode.USE_DESTINATION_STYLES);
}

result.save("C:\\Temp\\out.doc");

Но я бы предпочел подход Mail Merge.

person Alexey Noskov    schedule 22.09.2020
comment
Спасибо Алексей...попробую этот подход - person Sumit Ranjan; 22.09.2020
comment
Но проблема в том, что я не могу изменить шаблон, и я должен использовать тот же шаблон. Так что в этом случае я должен клонировать документ и объединить его. Как я могу объединить оба документа? - person Sumit Ranjan; 22.09.2020
comment
Спасибо @Alexey Noskov, здесь мое требование немного отличается. В том же документе у нас есть другие данные, которые мы не можем повторить и которые должны появиться в документе только один раз. Но несколько полей мы должны повторить, так как мы получаем список полей после вызова БД. - person Sumit Ranjan; 23.09.2020
comment
@SumitRanjan Техника такая же, но в вашем случае вы клонируете только необходимую часть своего шаблона. Трудно предоставить вам точный код без вашего шаблона. Как я упоминал ранее, было бы намного проще и правильнее использовать функцию слияния почты с регионами для достижения того, что вам нужно. - person Alexey Noskov; 24.09.2020
comment
Адрес Имя:$FN Фамилия:$LN Номер телефона:$PHN_NBR Название компонента начислений:$COMPONENT_NAME Дата вступления в силу:$EFFECTIVE_DATE Дата окончания:$END_DATE Курс:$RATE Валюта: $CURRENCY В моем шаблоне есть поля, в которых указан адрес будет только один раз и сборы будут несколько раз. Было бы очень хорошо, если бы вы могли дать мне какой-нибудь пример кода для этого. - person Sumit Ranjan; 25.09.2020
comment
@SumitRanjan Как я уже упоминал ранее, сложно/невозможно создать код без шаблона. Требуется знать структуру узлов вашего шаблона, а не просто текст. - person Alexey Noskov; 28.09.2020