【问题标题】:MS Word Mail Merge field format lost when using FieldMergingCallback in aspose word在 aspose word 中使用 FieldMergingCallback 时 MS Word 邮件合并字段格式丢失
【发布时间】:2019-12-24 16:27:18
【问题描述】:

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

【问题讨论】:

    标签: java aspose.words


    【解决方案1】:

    您可以使用域代码来获取开关并相应地格式化值。请看以下代码:

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

    【讨论】:

    • 我真的不想自己格式化值,因为文档中还有其他格式化开关。所以,我最终得到了一个更灵活的解决方法。您的团队似乎将我的问题标记为要考虑的新功能。我希望它会尽快实施。 forum.aspose.com/t/…
    【解决方案2】:

    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 中保持格式。所以,我最终得到了一个解决方法,这个想法是在每个回调中,我创建一个假文档并将当前字段克隆到这个假文档,执行它以获得最终结果,然后将其设置回实际字段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){
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多