Формат поля MS Word Mail Merge потерян при использовании FieldMergingCallback в aspose word

У меня есть шаблон, в котором есть несколько полей слияния, которые находятся внутри и вне таблицы. Значения для этих полей запрашиваются и кэшируются для сопоставления, а затем устанавливаются в поле с помощью пользовательского FieldMergingCallback, вот код Java:

// doc is a Document object
doc.getMailMerge().setFieldMergingCallback(new IFieldMergingCallback() {
    @Override
    public void fieldMerging(FieldMergingArgs arg0) throws Exception {
        if (fieldCache.containsKey(arg0.getFieldName())) {
            arg0.setText(fieldCache.get(arg0.getFieldName()));
        }
   }

   @Override
   public void imageFieldMerging(ImageFieldMergingArgs arg0) throws Exception {
       return;
   }
});

Проблема в том, что я потерял весь формат поля (\* Caps, \* Upper и т. д.) при использовании метода setText, я пытался вызвать doc.updateFields() после вызова executeWithRegions(), но формат все еще потерян.

Как я могу зарезервировать формат при обратном звонке?

Это устаревшая система, поэтому мы застряли в aspose word 14.5.0.


person Hai Hoang    schedule 24.12.2019    source источник


Ответы (2)


Вы можете использовать код поля для получения переключателей и соответствующего форматирования значения. См. следующий код:

        doc.getMailMerge().setFieldMergingCallback(new IFieldMergingCallback() {
            @Override
            public void fieldMerging(FieldMergingArgs args) throws Exception {

                // This is a dummy value.
                String value = args.getFieldName();
                // Get field code to check formatting switches.
                String fieldCode = args.getField().getFieldCode(false);

                // Format the value according to the switches in the field code.
                if (fieldCode.contains("\\* Upper"))
                    value = value.toUpperCase();
                if (fieldCode.contains("\\* Lower"))
                    value = value.toLowerCase();

                args.setText(value);
            }

            @Override
            public void imageFieldMerging(ImageFieldMergingArgs arg0) throws Exception {
                return;
            }
        });

Надеюсь это поможет.

Раскрытие информации: я работаю в команде Aspose.Words.

person Alexey Noskov    schedule 27.12.2019
comment
Я действительно не хочу форматировать значение самостоятельно, потому что в документе есть другие переключатели форматирования. Таким образом, я получаю более гибкую работу. Похоже, ваша команда пометила мою проблему как новую функцию для рассмотрения. Я надеюсь, что это будет реализовано в ближайшее время. forum.aspose. ком/т/ - person Hai Hoang; 28.12.2019

ОБНОВЛЕНИЕ 02-2020: эта функция реализована в Aspose word 20.2. https://forum.aspose.com/t/merge-field-format-lost-when-using-fieldmergingcallback/206900/5

Согласно ответам на тот же вопрос на форуме aspose, в настоящее время нет поддержки сохранения форматирования в FieldMergingCallback. Итак, я получаю обходной путь, идея заключается в каждом обратном вызове, я создаю поддельный документ и клонирую текущее поле в этот поддельный документ, выполняю его, чтобы получить окончательный результат, а затем возвращаю его в фактическое поле с помощью функция setText:

doc.getMailMerge().setFieldMergingCallback(new IFieldMergingCallback(){
    @Override
    public void fieldMerging(FieldMergingArgs e)throws Exception{
        if(cache.containsKey(e.getFieldName())){
            Document fakeDoc=new Document();
            DocumentBuilder builder=new DocumentBuilder(fakeDoc);
            builder.insertField(e.getField().getFieldCode());
            fakeDoc.getMailMerge().setFieldMergingCallback(new IFieldMergingCallback(){
                @Override
                public void fieldMerging(FieldMergingArgs arg)throws Exception{
                    DocumentBuilder innerBuilder=new DocumentBuilder(arg.getDocument());
                    innerBuilder.moveToMergeField(arg.getFieldName(),false,false);
                    innerBuilder.startBookmark(arg.getFieldName());
                    innerBuilder.moveToMergeField(arg.getFieldName(),true,false);
                    innerBuilder.endBookmark(arg.getFieldName());
                }

                @Override
                public void imageFieldMerging(ImageFieldMergingArgs arg){

                }
            });
            fakeDoc.getMailMerge().execute(new String[]{e.getFieldName()},new Object[]{cache.get(e.getFieldName())});
           // Set the formatted text to the actual field
            e.setText(fakeDoc.getRange().getBookmarks().get(0).getText());
        }
    }

    @Override
    public void imageFieldMerging(ImageFieldMergingArgs args){
    }
});
person Hai Hoang    schedule 28.12.2019