前由
我有全區的電話資料,問題在於我要依不同里別來製作出電話簿。結果如下圖:
單純採用合併列印無法達成我的需求。解決方法係用「功能變數」儲存上一個里別,與現在里別進行比較:若不同,則換頁。不過,這樣功能變數還蠻長的。最後,我還是採用 C# 來解決。
解決方案
用 C# 控制 WORD 中合併列印的「資料來源 Data Source」,給予不同里別的「sqlstatement」。迴圈處理不同的里別即可。但可預見其處理過程會很慢,不過還好,我可以不用在意它,有跑出結果即可。
程式碼
IList<string> areas = new List<string>() { "後壁", "侯伯", "嘉苳", "土溝", "嘉田", "嘉民", "菁豊", "崁頂", "後廍", "墨林", "菁寮", "新嘉", "頂長", "平安", "仕安", "竹新", "新東", "長安", "頂安", "福安", "烏樹" }; string root = @"D:\"; // 根目錄 string data = root + @"\data.docm"; // 資料檔(即資料來源) string template = root + @"\template.docx"; // 已設定好格式與合併欄位的 Word 檔 string output = @"d:\Final"; // 輸出之資料夾 object oMissing = System.Reflection.Missing.Value; Word._Application oWord; Word._Document oDoc; oWord = new Word.Application(); oWord.Visible = true; oDoc = oWord.Documents.Open(template); // 開啟 Word 檔 Word.MailMerge mm = oDoc.MailMerge; for (int i = 0; i < areas.Count; i++) { string sql1 = @"select * from " + data + " where ((里別='" + areas[i] + "'))"; // 開啟資料來源,採用 SqlStatement mm.OpenDataSource(data, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, sql1, oMissing, oMissing, oMissing); mm.Execute(); Word.Document oMM = mm.Application.ActiveDocument; // 合併後的新 Word 檔 oMM.SaveAs(output + @"\" + areas[i] + ".docx"); oMM.Close(oMissing, oMissing, oMissing); } oDoc.Close();
注意事項
- 加入參考:COM -> Microsoft Word 12.0 Object Library
- 在頂端加入引用:
- using Word = Microsoft.Office.Interop.Word;
- using System.Reflection;
留言
張貼留言