Aspose.words Mail Merge之Nest Mail merge

2023-12-22 19:38
文章标签 mail merge words nest aspose

本文主要是介绍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{@Overridepublic 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[] {"摇尾巴","旺旺叫","逛街"},};@Overrideprotected void onCreate(@Nullable Bundle arg0) {super.onCreate(arg0);setContentView(R.layout.activity_region_mail_merge);new Thread(new NestMailMergeTask()).start();}class NestMailMergeTask implements Runnable{@Overridepublic 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{@Overridepublic 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;@Overridepublic IMailMergeDataSource getChildDataSource(String tableName)throws Exception {if (tableName.equals("FavDetails")) {return new FavDetailsDataSource(index);}return null;}@Overridepublic String getTableName() throws Exception {return "StoreDetails";}@Overridepublic boolean getValue(String field, Object[] objects) throws Exception {objects[0] = DATAS[i][j++];return true;}@Overridepublic 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;}@Overridepublic IMailMergeDataSource getChildDataSource(String tableName)throws Exception {return null;}@Overridepublic String getTableName() throws Exception {return "FavDetails";}@Overridepublic boolean getValue(String field, Object[] objects) throws Exception {objects[0] = FAVS[index][count++];return true;}@Overridepublic 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;@Overridepublic IMailMergeDataSource getChildDataSource(String name)throws Exception {return null;}@Overridepublic String getTableName() throws Exception {return "NormalTable";}@Overridepublic boolean getValue(String field, Object[] objects) throws Exception {objects[0] = DATAS[i][j++];return true;}@Overridepublic boolean moveNext() throws Exception {if (repeatCount > 0) {repeatCount--;i++;j = 0;return true;}return false;}}
}

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

最后给出执行的结果:

这里写图片描述

这里写图片描述

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

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

这篇关于Aspose.words Mail Merge之Nest Mail merge的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/525210

相关文章

HDUPlay on Words

1.定理:无向图G有欧拉通路的充分必要条件是G为连通图,并且G仅有两个奇度结点或者无奇度结点。 (1)当G是仅有两个奇度结点的连通图时,G的欧拉通路必以此两个结点为端点。 (2)当G是无奇度结点的连通图时,G必有欧拉回路。 2.一个有向图D具有欧拉通路,当且仅当D是连通的,且除了两个顶点外,其余顶点的入度均等于出度,这两个特殊的顶点中,一个顶点的入度比出度大1,另一个顶点的入度比出度小1

56. Merge Interval

题目: 解答: 常规的合并,根据前后interval是否有交集判定。 代码: /*** Definition for an interval.* struct Interval {* int start;* int end;* Interval() : start(0), end(0) {}* Interval(int s, int e) : start

多表连接的三种方式hash join,merge join,nested loop

多表之间的连接有三种方式:Nested Loops,Hash Join和 Sort Merge Join. 下面来介绍三种不同连接的不同:     一. NESTED LOOP: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(大于1 万不适合),要把返回

[LeetCode] 692. Top K Frequent Words

题:https://leetcode.com/problems/top-k-frequent-words/ 题目大意 对于 string[] words,输出 出现频率前k高的 word,顺序 为 word 出现的频率 由高到低 ,频率相同的 word 按 字符排序。 思路 其实是对words中的所有word进行一个排序。 排序有两个规则: 1.word 在 words中出现的次数。 2.

[LeetCode] 820. Short Encoding of Words

题:https://leetcode.com/problems/short-encoding-of-words/ 题目大意 参考题目 思路 set 集合 将所有word 放入set中,然后遍历所有set中的word,将word的从头的子串都从set中删除,最后统计 set中所有(word 的长度 + 1)(’#’) class Solution {public int minimumL

gitlab 上源码Merge后出现git gc的解决方案

问题: 远程主分支在merger其他分支的请求后,本地主分支pull 远程分支出现git gc * branch master -> FETCH_HEADAuto packing the repository for optimum performance. You may alsorun "git gc" manually. See "git help g

【HDU】4117 GRE Words AC自动机+线段树优化DP

传送门:【HDU】4117 GRE Words 题目分析:水不了啊狸的打字机就来水这题了= =。。。 首先建立ac自动机,然后用fail指针的反向关系建边,构造fail指针树。fail指针树中每个结点u表示的串都是其子节点v的后缀(同时该后缀是所有串中最长的)。对fail指针树dfs一次得到时间戳,当要求以串i结尾的最大价值,首先我们需要知道以串i的子串j结尾的最大价值val。因为在树中

JavaMail 发送邮件系列(一):发送基本邮件

使用JavaMail API发送邮件,大概分为三个类:MyAuthenticator---密码认证器,MailSendInfo--邮件发送消息集合,MailSendUtils--邮件发送消息注入执行 Maven依赖 <dependency ><groupId > javax.mail </ groupId ><artifactId > mail </ artifactId ><ver

LeetCode 30 Substring with Concatenation of All Words

题意: 给出字符串s和许多等长(len)单词w,找出所有s中的满足子串为w中所有单词的一种组合的位置。 思路: 因为w中的单词要满足的是组合而不是排列,因此用“区间[L,R]中包含单词的计数”来维护比较合适。 一是满足了组合对顺序的不要求,二是方便处理重复的单词。 首先可以统计一下,w中各种单词个数。如果s的长度为size(w) * len的子串单词计数与w相同,则找到一个答案。

SQL SERVER中使用Merge进行批量操作

在.net开发过程中,经常会和数据库打交道。微软的产品包里,SQL SERVER便是一个强大的数据库管理系统(DBS)。我们编写的.net程序怎么和DBS进行交互呢?笔者最常用的便是ado.net组件,其中包括了执行sql命令,执行存储过程等丰富的操作方法。在ERP(企业资源计划)系统中,最常见的场景便是单条数据的增、删、改,或者小批量的DML(数据操纵语言)操作。在这种场景下,应用程序和DBS