Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Aspose.words Mail Merge初識

Android Aspose.words Mail Merge初識

編輯:關於Android編程

 

什麼是Mail merge

常常用office生成大量文檔的同志們肯定或多或少接觸過Mail merge。MailMerge中文翻譯過來是:郵件合並。

那麼它是干啥的?其實它的用途可大了。

如果你是文秘人員,那麼常常會遇到用一個模板生成多個多份文檔、郵件、通知的情況,文檔中除了個別關鍵字字段(如,名字、編號、或者日期等),其余內容都是同樣的。這種情況下,如果單個生成文檔(打開,添加/修改關鍵字段,保存),則費時費力,而且容易出錯。

Mail Merge就是給上述情況帶來福音的。該功能允許一個文檔模板從一個數據源中提取關鍵字段,替換模板中的內容,生成多個文檔。特別適用於通知、群發郵件、證書的生成。這個數據源可以是Excel,可以是Access數據庫。

那麼問題來了,在Aspose.words裡是否也支持Mail Merge呢?答案是肯定的,但是!有一些功能沒有,也就是只支持絕大部分。不過它支持的功能夠我們用了就行。

Aspose 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.保存文檔,格式隨你定。

IMailMergeDataSource

在寫代碼之前,需要先講下這個接口。從字面上的意思可以猜到,這個接口是用來給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將講解區域郵件合並,有興趣就點吧。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved