Aspose.words Mail Merge之Nest Mail merge

转载请注明:
http://blog.csdn.net/sinat_30276961/article/details/48372981

上一篇Aspose.words Mail Merge之Region Mail merge讲了区域邮件合并方式,实现了不同区域的各自mail merge。本篇将讲解Nest Mail Merge,即嵌套的mail merge,并通过IMailMergeDataSourceRoot来做总数据源。

什么是Nest Mail Merge

上一篇,我讲了区域邮件合并的方式,并展示了实例,我想大家应该很清楚了吧。

本篇将讲解邮件合并中很容易出现的一个情况,那就是嵌套邮件合并。

对于我们猿来说,嵌套这个概念实在是太耳熟能详了,我在这里也不多说,就点到为止。

说到word文档里的嵌套邮件合并,我就拿结果图来说吧。

这里写图片描述

能看出上面这张图的嵌套吗?仔细看,要这样想,哪里能用嵌套就去用,这样就一定能看出,如果看不出也没事,你换个角度思考,该怎么实现这个文档。

看出的童鞋们请允许我再废话几句,给没看出的童鞋们讲讲。要实现这个文档,首先,区域邮件合并肯定是需要的。如下图,对吧。

这里写图片描述

上图有个地方有点欠妥,看出来了吧。对了,就是那个爱好的值:Fav。
为啥欠考虑呢?一般我们开发的时候,字段不可能还插入’\n’这玩意儿。这可不是个好想法。

那么问题来了,这个爱好该怎么弄呢?答案上篇就给出了,就是区域邮件合并。怎么写呢?呵呵,就按你上篇学的写:

这里写图片描述

ok,写出来了。那么,你再仔细看下上图,这个不就是嵌套了吗?也就是说,StoreDetails区域嵌套了FavDetails区域。

这就是Nest Mail Merge的可用之处,怎么样,应该会很常用吧。

遗留的IMailMergeDataSourceRoot

在上篇,我最后讲了下IMailMergeDataSourceRoot,但没细致的讲。这里,我就把这个讲下,然后在例子里直接使用它。

上篇,我说过,IMailMergeDataSourceRoot是提供一些区域邮件合并的数据源。也就是说,通过它,我们主体代码可以少写一些。

比方说,原先有5个区域要邮件合并,那么主体代码executeWithRegions就要写5次。通过它的话,executeWithRegions只要写一次就行了。

而它的实现接口也很简单,就一个:

    class NestMailMergeDataSourceRoot implements IMailMergeDataSourceRoot{

        @Override
        public IMailMergeDataSource getDataSource(String tableName) throws Exception {
            if (tableName.equals("StoreDetails")) {
                return new StoreDetailsDataSource();
            }else if (tableName.equals("NormalTable")) {
                return new NormalTableDataSource();
            }
            return null;
        }
    }

代码很简单,我就不讲了。接着,就直接上例子讲嵌套邮件合并。

创建模板

上面贴出了部分模板,在这里,我把所有的都贴出来:

这里写图片描述

细致的朋友应该会发现,我把TableStart:StoreDetails和TableEnd:StoreDetails紧紧的挨着分割线。

这是为啥呢?看下上面的结果图就知道了。因为这两个标识符圈起来的部分都会被重复构造,所以如果是像下面这样写:

这里写图片描述

那么每次重复时,分割线之间会多出两行空行。在上篇的第二个表格里就能看到。为什么呢?因为如果像上面这样写,上面和下面都多了个’\n’被圈进来了。所以,最后结果就多了两行。

ok,模板创建完~开始写代码。

写代码

代码不难,我就一段段贴。

首先是主题部分:

public class NestMailMergeActivity extends FragmentActivity{
    private static final String[][] DATAS = new String[][] {
        new String[] {
                "熊猫", "中国四川及一些动物园", "四川", "中国"
        },
        new String[] {
                "阎罗王", "冥界十殿之第五殿", "这个咋整", "冥界"
        },
        new String[] {
                "旺财", "我家就有一个", "地球人存在的地方就有汪星人存在", "汪星人国度"
        }
    };

    private static final String[][] FAVS = new String[][] {
        new String[] {
                "吃竹子","睡觉","打滚"
        },
        new String[] {
                "唱k","打麻将"
        },
        new String[] {
                "摇尾巴","旺旺叫","逛街"
        },
    };

    @Override
    protected void onCreate(@Nullable Bundle arg0) {
        super.onCreate(arg0);
        setContentView(R.layout.activity_region_mail_merge);
        new Thread(new NestMailMergeTask()).start();
    }

    class NestMailMergeTask implements Runnable{

        @Override
        public void run() {
            try {
                Document doc = new Document(MyApplication.filePath
                        + File.separator + "TestNestMailMerge.doc");
                doc.getMailMerge().executeWithRegions(new NestMailMergeDataSourceRoot());
                doc.save(MyApplication.filePath 
                        + File.separator + "NestMailMergeResult.doc");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    class NestMailMergeDataSourceRoot implements IMailMergeDataSourceRoot{

        @Override
        public IMailMergeDataSource getDataSource(String tableName) throws Exception {
            if (tableName.equals("StoreDetails")) {
                return new StoreDetailsDataSource();
            }else if (tableName.equals("NormalTable")) {
                return new NormalTableDataSource();
            }
            return null;
        }
    }

这里,用到了IMailMergeDataSourceRoot。可以看到,我复写了getDataSource,在里面,我只要返回两个数据源就行,一个是StoreDetails,另一个是NormalTable。至于FavDetails,因为它是嵌套在StoreDetails里,所以不需要在这里控制。

接着就是StoreDetails的数据源。

    class StoreDetailsDataSource implements IMailMergeDataSource {
        int repeatCount = 3;
        int i = -1, j = 0;
        int index = -1;

        @Override
        public IMailMergeDataSource getChildDataSource(String tableName)
                throws Exception {
            if (tableName.equals("FavDetails")) {
                return new FavDetailsDataSource(index);
            }
            return null;
        }

        @Override
        public String getTableName() throws Exception {
            return "StoreDetails";
        }

        @Override
        public boolean getValue(String field, Object[] objects) throws Exception {
            objects[0] = DATAS[i][j++];
            return true;
        }

        @Override
        public boolean moveNext() throws Exception {
            if (repeatCount > 0) {
                repeatCount--;
                i++;
                j = 0;
                index++;
                return true;
            }
            return false;
        }

    }

    class FavDetailsDataSource implements IMailMergeDataSource {
        int index;
        int count = 0;

        public FavDetailsDataSource(int index) {
            this.index = index;
        }

        @Override
        public IMailMergeDataSource getChildDataSource(String tableName)
                throws Exception {
            return null;
        }

        @Override
        public String getTableName() throws Exception {
            return "FavDetails";
        }

        @Override
        public boolean getValue(String field, Object[] objects) throws Exception {
            objects[0] = FAVS[index][count++];
            return true;
        }

        @Override
        public boolean moveNext() throws Exception {
            if (count < FAVS[index].length) {
                return true;
            }
            return false;
        }

    }

在StoreDetailsDataSource这个类里我复写了getChildDataSource,把嵌套数据源赋给它。赋给它的时候,把index也传给它。这个index用来控制当前是哪个人的FAVS。其余和上篇的区域邮件合并一样。

然后在FavDetailsDataSource里,MoveNext里的判断方式要根据当前是哪个人的FAVS,去判断其爱好的数量,即几个字符串。

ok,接着是NormalTableDataSource。

    class NormalTableDataSource implements IMailMergeDataSource {
        int repeatCount = 3;

        int i = -1, j = 0;

        @Override
        public IMailMergeDataSource getChildDataSource(String name)
                throws Exception {
            return null;
        }

        @Override
        public String getTableName() throws Exception {
            return "NormalTable";
        }

        @Override
        public boolean getValue(String field, Object[] objects) throws Exception {
            objects[0] = DATAS[i][j++];
            return true;
        }

        @Override
        public boolean moveNext() throws Exception {
            if (repeatCount > 0) {
                repeatCount--;
                i++;
                j = 0;
                return true;
            }
            return false;
        }
    }
}

这部分和上篇的代码一样,只是重复次数改了下。

最后给出执行的结果:

这里写图片描述

这里写图片描述

一张图截不全,所以用了两张。结果很清晰,第二张是换页导致的效果。

好了,嵌套邮件合并讲完了,并且把IMailMergeDataSourceRoot这个接口也讲了。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值