編輯:關於Android編程
常常用office生成大量文檔的同志們肯定或多或少接觸過Mail merge。MailMerge中文翻譯過來是:郵件合並。
那麼它是干啥的?其實它的用途可大了。
如果你是文秘人員,那麼常常會遇到用一個模板生成多個多份文檔、郵件、通知的情況,文檔中除了個別關鍵字字段(如,名字、編號、或者日期等),其余內容都是同樣的。這種情況下,如果單個生成文檔(打開,添加/修改關鍵字段,保存),則費時費力,而且容易出錯。
Mail Merge就是給上述情況帶來福音的。該功能允許一個文檔模板從一個數據源中提取關鍵字段,替換模板中的內容,生成多個文檔。特別適用於通知、群發郵件、證書的生成。這個數據源可以是Excel,可以是Access數據庫。
那麼問題來了,在Aspose.words裡是否也支持Mail Merge呢?答案是肯定的,但是!有一些功能沒有,也就是只支持絕大部分。不過它支持的功能夠我們用了就行。
Aspose裡的Mail Merge在android平台支持的功能是最少,其他平台都多一些,不過一般夠我們開發使用了。
它同office一樣,也需要一個模板,這個模板的格式不定,可以是doc、rtf、docx等等。
它的數據源就多了,可以是數據庫裡的,可以是文件裡的,可以是動態獲取的,等等等等。
在Android端執行一個Mail merge的步驟大致分為4步:
1.需要提供模板,這個模板你可以通過代碼去實現,也可以通過offce或者WPS去做好,格式可以隨你定。
2.在這些模板裡,把想插入數據的地方用Merge Field插入。
3.在代碼端加載你需要使用的模板,然後執行Mail Merge操作。它會把你指定的數據和指定的Merge field進行替換。
4.保存文檔,格式隨你定。
在寫代碼之前,需要先講下這個接口。從字面上的意思可以猜到,這個接口是用來給Mail merge提供數據的。
事實上也是如此,你要實現一個稍微復雜一點的Mail Merge,一般是要涉及到這個接口。
當然,不用到它也是可以的,如下代碼展示了最簡單的情況:
// Open an existing document.
Document doc = new Document(getMyDir() + MailMerge.ExecuteArray.doc);
// Fill the fields in the document with user data.
doc.getMailMerge().execute(
new String[] {FullName, Company, Address, Address2, City},
new Object[] {James Bond, MI5 Headquarters, Milbank, , London});
doc.save(getMyDir() + MailMerge.ExecuteArray Out.doc);
如果你的需求只限於這樣,那用這個就夠了。但事實上,我們常常遇到的情況是,某些Merge field要插入的數據有多行,還有要插入一些圖片。這樣的話,這個方案就不行了。
好,我們繼續看IMailMergeDataSource。
我們實現這個接口之後,會發現有四個方法需要實現。我分別來講下:
getTableName()
Aspose使用這個name去和Mail Merge的Region name去匹配,一樣就用這個數據源。只有用到Mail merge的region時才需要設置。
getChildDataSource
這個,顧名思義是子數據源的意思,在嵌套mail merge裡要用到。
getValue
它是用來把merge field和數據關聯的。這個方法很重要,它有兩個參數String field和Object[] objects。第一個參數是Merge field的名稱,第二個參數是傳給這個merge field的數據。
moveNext
這個是用來決定需要重復幾次merge。
看到這裡,估計很多童鞋們還是有點不懂。沒事,接下去通過代碼再來講解一下。
我們首先需要一個模板,這裡,我自己隨便用WPS編輯了個模板,上圖:
從圖中可以看到一些帶尖括號的字段,這些就是Merge field,中文翻譯一下就是合並域。
我可以通過alt+f9查看它的詳細代碼:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20150914/20150914110727108.png" title="\" />
如果Merge field這塊不是很了解的朋友,可以網上去找些相關資料補補。
接著,開始寫代碼了。
public class MailMergeActivity extends FragmentActivity {
......
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mail_merge);
new Thread(new MailMergeTask()).start();
}
private class MailMergeTask implements Runnable {
@Override
public void run() {
try {
Document doc = new Document(MyApplication.filePath
+ File.separator + TestMailMerge.doc);
doc.getMailMerge().execute(new MyMailMergeDataSource());
doc.save(MyApplication.filePath + File.separator
+ MailMergeActivity.doc);
} catch (Exception e) {
e.printStackTrace();
}
}
}
先是加載一個模板,我傳的是一個字符串,指向的是sd卡某個文件夾裡的TestMailMerge.doc。
然後通過doc.getMailMerge().execute()這個方法來執行Mail merge。
我們接著看下MyMailMergeDataSource的實現:
public class MailMergeActivity extends FragmentActivity {
private static final String[] DATAS = new String[] {
職工, 身體不適,在住院, 10, 領導,
隔壁老王, 2015, 09, 09
};
......
class MyMailMergeDataSource implements IMailMergeDataSource {
int index = 0;
boolean once = true;
@Override
public String getTableName() throws Exception {
return null;
}
@Override
public boolean moveNext() throws Exception {
if (once) {
once = !once;
return true;
}
return false;
}
@Override
public boolean getValue(String field, Object[] objects) throws Exception {
if (field.equals(Image)) {
Bitmap bitmap = MyApplication.decodeSampleBitmapResource(
getResources(), R.drawable.a, 200, 300
);
objects[0] = bitmap;
}else {
objects[0] = DATAS[index++];
}
return true;
}
@Override
public IMailMergeDataSource getChildDataSource(String s) throws Exception {
return null;
}
}
}
稍微來分析下代碼。我偷懶創建了一個靜態的字符串數組。
然後在實現接口裡,配了兩個變量:index和once。一個是用來做靜態數組的游標,另一個是用來限制這次merge的重復次數。我這裡設置只merge一次。
這裡,不涉及regions mail merge和嵌套mail merge,所以getTableName和getChildDataSource都返回null就行了。
最後的結果如下:
這樣,Mail merge就完成了。這裡只是merge一次,如果是多次的話,就會有很多同樣內容的出現。
說好的圖片呢?別急,這只是給你看下直接附bitmap給object會發生什麼現象。下一篇Android Aspose.words Mail Merge之Region Mail merge將講解區域郵件合並,有興趣就點吧。
序言現在說是換膚框架還有點誇大其詞,因為目前只實現了顏色的替換,目前網上已有的換膚框架我都研究過,主要感覺給每個View設置樣式,還要保存每個需要換膚的View,實在是太
前言ScrollView可以說是android裡最簡單的滑動控件,但是其中也蘊含了很多的知識點。今天嘗試通過ScrollView的源碼來了解ScrollView內部的細節
不知道大家是否用過天天動聽,對於它界面上的半透明Menu效果,筆者感覺非常漂亮。下面是天天動聽半透明Menu的截圖,欣賞下吧: &nbs
生命周期流程圖: 注:Activity生命周期void onCreate()* Activity已經被創建完畢void onStart()* Activity已