本篇要解決的問題
相信身為工程師的大家都有一個奇妙的經驗,就是朋友會認為「咦?你是工程師啊?那我有一個 Excel 的公式要問你……」。
身為工程師,不代表 Office 就很厲害啊!
真的沒想到主要寫前端筆記文的本站,會有寫 Office 功能的一天。
但,合併列印實在是太好用,也太容易因為沒注意到一些眉眉角角而犯錯。
這幾天有了實作合併列印的機會,就想先筆記下來,將來又要用到時可以回頭來看這些眉眉角角。
最後的範例檔案也會傳到 Github 上提供下載(職業病?)
August 用的是 Mac,因此在 Excel、Word 的截圖都是 Mac 的介面。
使用的 Office 的版本是 2019。
工程師角度介紹合併列印
合併列印就很像我們在做 EDM 時,可以針對不同人套不同姓名的功能。
我們做出一份 Excel 後,再建立一份 Word 檔,在 Word 上把要替換的地方(比如姓名)插入 Excel 上的欄位名稱(比如姓名),然後 Word 的合併列印就會生出一份套完 Excel 上所有資料的檔案出來。
用工程師的語言來說,就是我們在 Word 上姓名的地方寫 {{ name }}
,然後 Excel 是資料庫,合併列印就會跑回圈把 {{ name }}
全部替換成資料庫中的值。
用 Vue.js 寫出來就是:
<div id="app"> <p v-for="user in users"> <span>{{ user.name }} 您好:</span> <span>恭禧您 {{ user.age }} 歲了!</span> </p> </div> <script> new Vue({ el: '#app', data: { users: [ { name: 'a', age: 10 }, { name: 'b', age: 11 }, { name: 'c', age: 12 } ] } }) </script>
HTML 的部份就是 Word。
data 的部份就是 Excel。
所以這幾天在用合併列印的功能時,都在想這些研究的時間拿來用 Vue.js 寫,搞不好都寫完了……XD。
總之,要用到合併列印,需要的是一個 Excel 檔跟一個 Word 檔。
製作 Excel 檔
第一步要先建立我們的資料表,本篇的範例共會有四個欄位:時間、姓名、稱謂、地址。
因為是範例用,又為了可以看到順序是否正確,在資料的部份就是用數字一路排下去,最後建好的 Excel 會是這樣:
名字照數字一路往下排,最後合併列印時就可以檢查是不是每一筆資料都有出來。
製作 Word
第二步我們要來製作 Word 檔,合併列印的功能是在 Word 上。
直接選一份 Word 提供的樣本,為了可以示範一頁裡面要合併二筆資料,因此一頁中分成上、下二區塊,像這樣:
檔案裡面可以看見有預留要填上日期、姓名、地址的地方,下一步就是開始製作合併列印。
合併列印功能
啟用合併列印
Word 最上排的工具列,點擊「郵件 > 啟動合併列印」:
點擊後會出現小選單,選擇要合併列印的項目,本篇的示範是「信件」,就選擇信件:
啟動好合併列印的功能,接著就是最重要的一步:選擇要讀取的檔案。
選取收件者
這步就很像告訴 Word 說我們要讀取哪一個資料庫,點擊「選取收件者」:
點擊「使用現有清單」:
選擇我們在第一步中建立的 Excel 檔:
確認後會跳一個警告,大意就是小心資料來源有毒,但因為 Excel 本來就是我們自己建立好的,因此可以放心按「是」:
最後就是會詢問要抓 Excel 中的哪一個 Sheet,儲存格範圍如果不填就會是全部,我們就直接按「確定」:
按下確定後這步就完成了。
插入合併欄位
這一步就是開始塞哪邊要套什麼資料,就很像我們在寫 {{ name }}
或是 <?= name ?>
之類的。
首先先反白我們要替換的地方:
接著點擊上排選單中的「插入合併欄位」:
會出現我們 Excel 中我們有的欄位,就選擇我們想要替代的欄位就行:
選好後會看見剛剛反白的地方變成了我們的欄位,還是用 << >>
包了起來:
這樣就完成了,接下來就是把所有我們想替換的欄位都用「插入合併欄位」來替換,最後會像這樣:
因為我們是做一個頁面切成上、下二塊的,因此上下二塊我們想替換的地方都要替換。
都替換成我們想套資料的欄位後,我們先按一下「預覽結果」看一下有沒有成功:
我們會看到以下:
資料塞是塞了,但一頁裡面都是呈現我們 Excel 中的第一筆資料,而沒有自動跑出下一筆。
解決的方法很簡單,因為合併列印功能是換頁以後才會自動抓下一筆資料,如果一頁裡面我們要抓一筆以上,就要自己手動埋標籤,讓 Word 知道一遇到標籤就是要抓下一筆的意思。
我們先關掉「預覽」,然後在我們想要讓 Word 抓下一筆的地方,游標移到那個位置上點一下,接著點選單中的「規則」:
在「規則」裡,我們就會看到「Next Record(下一筆紀錄)」:
點下去後,就會看見標籤被加上去了:
當 Word 合併列印,看到 <<NEXT RECORD(下一筆紀錄)>>
的標籤時,就會自動抓下一筆的紀錄進來,我們再按一次「預覽」看一下結果:
關於自動抓下一筆紀錄,有二個注意事項:
<<NEXT RECORD(下一筆紀錄)>>
這個標籤不會被列印出來,因此可以將標籤的字級設成最小,以免干擾我們的排版。- 當頁面換頁時,Word 合併列印本身就會自動抓下一筆資料了,因此一個頁面中的最後一塊,不用再加上「下一筆紀錄」的標籤。
第二點最重要,是這幾天 August 在實作時踩到的坑。
比方我們是一頁裡面要塞二塊,我們剛在第一塊的後面加入了「下一筆紀錄」的標籤,那在第二塊的後面也要加嗎?不能加,因為當頁面換頁時,Word 就會自動抓下一筆。
如果我們在第二塊的後面也加了「下一筆紀錄」的標籤,會變成 Word 遇到這標籤,就去抓第三筆資料,但緊接著進到下一頁,Word 又自動再抓下一筆資料,也就是第四筆進來。這樣下一頁的第一塊顯示的不是第三筆資料,而是第四筆。會造成資料跳過了第三筆。
我們示範的欄位只有 15 列,手動檢查發現有漏還可以手動補,那如果今天的資料有 100 列、1000 列呢?
這點真的很重要。
完成合併
最後一步就是要完成我們的合併列印功能。
點擊「完成與合併」:
點擊「編輯個別文件」:
鏘鏘~會看到新開了一份 Word 檔,裡面都是套好 Excel 欄位中的資料。檔案很長,放到了 Github 上,可以下載來看。
篩選功能
這邊多記錄一段,我們在執行合併列印時,也會有一種狀況是 Excel 中的資料沒有全部要印,比方說我們要把「先生」、「小姐」分成二份文件來存。
Word 有篩選功能,可以在執行合併列印時就選好條件。
點擊「篩選收件者」:
接著會開始要輸入篩選的條件:
基本上,我們就把這邊當 if else
在寫就好(咦?)
比方我們只要合併稱謂是「小姐」的,那「欄位」就選小姐,「比較」就選等於,「比對值」就填小姐:
這樣是不是很像在寫:
if(欄位['稱謂'] == '小姐') { 執行合併列印() }
果然又是職業病 XD~
為了可以看到結果,多插入了稱謂這個合併欄位,按下預覽後可以看到以下:
篩選成功~
以上,就是篩選功能的示範,檔案一樣也整理在 Github 上。
範例檔案下載
示範的檔案放到 Github 上,下載開啟 Word 時會詢問要開啟哪個檔案當資料,選擇資料夾中的 Excel 檔就行。
Github:https://github.com/letswritetw/letswrite-mail-merge