在 aspose word 中使用 FieldMergingCallback 时,MS Word 邮件合并字段格式丢失

MS Word Mail Merge field format lost when using FieldMergingCallback in aspose word

我有一个模板,其中有一些合并字段位于 table 的内部和外部。这些字段的值被查询并缓存到映射,然后通过自定义 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;
   }
});

问题是我在使用 setText 方法时丢失了所有字段格式(\* Caps、\* Upper 等),我试图在调用 executeWithRegions() 之后调用 doc.updateFields() 但是格式仍然丢失。

如何在回调中保留格式?

这是一个遗留系统,所以我们被困在 aspose word 14.5.0

您可以使用字段代码来获取开关并相应地设置值的格式。请看以下代码:

        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 团队工作。

UPDATE 02-2020:Aspose word 20.2 已实现此功能。 https://forum.aspose.com/t/merge-field-format-lost-when-using-fieldmergingcallback/206900/5

根据我在aspose论坛上the same question的回复,目前FieldMergingCallback不支持保持格式化。所以,我最终解决了这个问题,这个想法是在每次回调中,我创建一个假文档并将当前字段克隆到这个假文档,执行它以获得最终结果,然后将它设置回实际字段设置文本函数:

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){
    }
});