如何在 C# 中查看 PowerPoint 文件
由團隊撰寫 Iron Software
從Excel合併郵件到Microsoft Word允許您快速建立個性化信函、標籤或電子郵件,而無需手動編輯每個文件。 這個想法很簡單:您只需維護一個包含所有收件人詳細資訊的excel試算表,將其連接到一個word郵件合併模板,將合併字段插入到需要顯示個人化資料的位置,然後讓Word為您資料中的每一行生成一個獨立的定制副本。 需要數小時手動編輯的工作在幾分鐘內完成,每個姓名、地址和細節都正確地從您的郵件列表中填充。
郵件合併過程涉及任何成功運行的三個文件:包含資料的excel文件,Word中主文件中信函或標籤所駐的主文件,以及最後生成的合併文件。 成功的郵件合併需要一個乾淨的試算表、正確格式化的資料,以及一個在正確位置放置合併字段的Word模板。 像郵政編碼、貨幣和日期這樣的特殊資料型別必須在開始郵件合併前在Excel中正確格式化,並且所有資料都必須位於Excel工作簿的第一張工作表上,以便Word正確讀取。
這篇文章解釋了過程的每一步:準備您的excel試算表、在郵件選項卡中將其作為資料源連接、插入合併字段、預覽結果、完成合併以及處理電子郵件訊息。 需要在運行合併前以程式方式構建或驗證Excel資料源的開發人員,將在最後找到一節,涵蓋如何在.NET中使用IronXL處理Excel文件建立和格式化,而無需安裝Microsoft Office。
步驟1:準備您的Excel試算表
乾淨、結構良好的excel試算表是可靠的word郵件合併的基礎。 在打開Word之前,您的資料與合併字段之間的試算表匹配完全取決於Excel文件的設置方式。
第一行的列標題。確保您的Excel試算表為您希望包含的每項物品都有一列,例如姓名、地址、城市、州和郵政編碼。 第一行中的列名變成了Word中可用的合併字段,因此它們應是唯一的、清晰標記的,並且上方沒有空白行。 確保第一行包含唯一的標題,並且上面沒有空白行,因為Word使用第一行識別可用的合併字段。
為每塊資料使用單獨的列。在單獨的列中儲存名字、姓氏和稱呼,而不是將它們合併。 這樣會給您在稍後構建問候語和地址塊時的完全控制。 在Word中運行郵件合併前,請確保您的Excel文件包含所有必要的資訊,例如名、姓、稱呼、郵政編碼和地址。
將郵政編碼和郵政編碼格式化為文字。在準備郵件合併的Excel資料時,必須確保ZIP碼或郵政編碼的列格式設置為文字以避免丟失任何前導零。 像02101這樣的郵政編碼如果單元格格式化為數字,會默默地丟失前導零,導致每封合併信件中的輸出格式不正確。
將所有資料保持在第一張工作表上。要進行成功的郵件合併,所有資料都必須在Excel工作簿的第一張工作表上。 如果您的工作簿有多個選項卡,Word將只讀取第一張工作表,因此在連接文件前將所有資料條目移動到Sheet 1上。
保存並關閉Excel文件。Excel文件在連接到Microsoft Word進行郵件合併之前必須保存並關閉,以正確運作。 打開的Excel文件可能會在Word嘗試導入資料時導致連接錯誤。
將列標題儘可能縮短且不含空格。 像"FirstName"和"ZipCode"這樣的列名比含有空格或特殊字元的名稱更不容易在匹配字段對話框中產生問題。

步驟2:打開Word並開始郵件合併
當Excel文件準備好後,打開Microsoft Word並建立或打開您的主文件。 如果您已經有一個現有的文件希望用作信函模板,立即打開它,而不是從空白頁開始。 這是每位收件人都將收到的信函、標籤或電子郵件模板。
使用逐步郵件合併嚮導:
要在Microsoft Word中啟動郵件合併嚮導,單擊郵件選項卡,然後選擇開始郵件合併,從列表底部的下拉箭頭中選擇一步步郵件合併嚮導。郵件合併嚮導提供了逐步指南來幫助使用者建立郵件合併文件,讓初學者更易於導航這一過程。 右側螢幕開啟一個面板,Word提示您按順序完成每個階段。
使用郵件合併嚮導時,使用者可以選擇他們想建立的文件型別,例如信件或標籤,然後進行連接資料源和插入合併字段的步驟。 對於本指南,選擇信件作為文件型別。
直接使用郵件選項卡:
更有經驗的使用者可以從郵件選項卡中的開始郵件合併組中單擊開始郵件合併並直接選擇文件型別,而無需嚮導。 無論哪種方法,結果都是相同的。

步驟3:將您的Excel文件作為資料源連接
一旦設置好文件型別,下一步就是連結您的excel文件,讓Word知道從何處提取收件人詳細資訊。
- 在郵件選項卡中,單擊選擇收件人在開始郵件合併組中。
- 從下拉箭頭中,選擇使用現有列表。 要將您的Excel試算表連接到Word文件以進行郵件合併,您需要在郵件選項卡中的選擇收件人選項下選擇使用現有列表。
- 文件瀏覽器打開。 導航到包含您的Excel文件的文件夾,選擇它,然後單擊打開。
- 出現一個對話框,列出工作簿中的工作表。 選擇Sheet1(包含您資料的目標表),然後單擊確定。
Word 現在連接到您的Excel資料作為現有列表。現有列表瀏覽選項可讓您從計算機上的任何位置找到並打開保存的xlsx文件。 此時,Word開始從工作簿的第一張工作表導入資訊,使每個列標題都可用作合併字段。
如果Word無法正確讀取Excel文件,請檢查文件是否已關閉,保存為xlsx格式,並且所有列標題都位於Sheet 1的第一行,且上方無空白行。
連接後,您可以單擊郵件選項卡中的選擇編輯收件人列表以打開郵件合併收件人面板。 這顯示您的試算表中的每一行為單獨的條目。 您可以使用它取消選擇特定的收件人,排序列表,或篩選合併中包含的行。 在繼續之前仔細審核收件人列表,以確保Word正確讀取您的所有資料條目。

步驟4:在文件中插入合併字段
與資料源連接後,您現在可以在Word文件中放置郵件合併字段,以便個性化資料顯示的任何地方。
使用地址塊:
地址塊是一個快捷方式,將姓名、公司和郵寄地址組合為一個字段。 單擊郵件選項卡的插入字段組中的地址塊。 一個對話框出現,您可以在其中配置姓名和地址的格式。 如果匹配字段對話框中的任何字段未自動與您的列名對齊,請單擊匹配字段。 匹配字段對話框讓您手動將您的列標題映射到Word內部使用的預期字段名稱,解決任何試算表匹配問題。
使用單獨合併字段:
為了完全控制佈局和格式化,逐個插入合併字段。將您的光標定位到要放置字段的位置,然後單擊郵件選項卡中的插入合併字段。 一個下拉列表顯示您excel試算表中的每一列標題。 單擊字段名稱將其插入光標位置。 插入的常用字段包括:
- 用於地址塊開頭的"問候語"姓氏"
- 下一行下的"公司"
- 下一行的"地址",然後是"城市"、"州"和"郵編"
- 如"親愛的"稱呼" "姓氏","這樣的問候語
使用問候語行:
單擊郵件選項卡中的選擇問候語以插入預先格式化的問候語。 該對話框允許您選擇問候語格式(如"親愛的史密斯先生","親愛的James",等等),並為姓名字段為空的收件人配置後備。
始終手動在連續的合併字段之間新增空格。 Word不會自動在字段之間新增空格,因此""FirstName""LastName""將顯示為"JamesCarter"而中間沒有空格字元。

步驟5:在完成合併之前預覽結果
在文件中插入合併字段後,您可以通過選擇郵件選項卡中的預覽結果來預覽結果,允許您看到合併資料將如何顯示。
單擊郵件選項卡中的預覽結果。 Word將每個合併字段替換為您Excel試算表第一行中的相應資料。 使用預覽結果組中的左箭頭和右箭頭在記錄之間移動,以檢查每個收件人的資料是否正確顯示。 這使您可以在承諾完整合併之前驗證收件人詳細資訊是否正確。
特別檢查:
- 問候語按自然閱讀("親愛的Carter先生",而不是"親愛的Carter先生 ,")
- 地址塊在所有行中正確格式化,包括那些公司名稱較長的行
- 郵政編碼和郵寄編碼在適用時顯示前導零
- 頁面頂部的當前記錄計數器與預期匹配
在插入的電子郵件消息或信件中插入合併字段後,您可以預覽結果以確認內容在完成合併過程前是否正確顯示。 使用左右箭頭瀏覽多個記錄,而不僅僅是第一個。

步驟6:完成郵件合併並輸出您的文件
確認預覽後,您即可運行合併並生成最後輸出。
合併到新文件(推薦):
在郵件選項卡中,單擊完成與合併按鈕,然後從下拉箭頭中選擇編輯個人化文件。 彈出對話框,詢問是合併所有記錄、當前記錄還是設置範圍。 選擇全部並單擊確定。 Word生成了一個新文件,其中包含所有單個文件作為單獨頁面,一個頁面一個收件人。 這是最安全的方法,因為它使您可以在列印或發送前查看合併文件。
查看後選擇保存以保留合併文件。 您還可以選擇使用文件 > 另存為(save as)來對其重命名,並將其與模板和資料源一起儲存。
直接列印:
單擊完成與合併 > 列印文件以將合併結果直接發送到列印機,無需建立中間文件。當您需要立即列印文件時非常有用,無需先查看或歸檔單個文件。

步驟7:建立郵寄標籤
使用Excel試算表作為資料源建立郵寄標籤同樣適用於郵件合併過程,遵循用於信件的相同步驟。
- 在郵件選項卡中,單擊開始郵件合併 > 標籤。
- 在標籤選項對話框中,選擇您的標籤供應商和產品編號以匹配您計算機上的實體標籤紙。
- 單擊選擇收件人 > 使用現有列表並連結到相同的excel文件。
- 單擊插入合併字段將地址字段放置在標籤上。 在單個標籤區域內在單獨的行中新增"FirstName"、"LastName"、"Address"、"City"、"State"和"ZipCode"。
- 單擊更新標籤將排版複制到頁面上的所有標籤。
- 預覽,然後完成並合併以生成個人標籤準備列印。
步驟8:通過郵件合併發送電子郵件消息
郵件合併還可以直接從Word通過Microsoft Outlook發送個性化的電子郵件消息。
通過郵件合併發送電子郵件需要Outlook開啟並設置為預設電子郵件程式。 這適用於經典版Outlook和新版Outlook。 在開始之前確保已配置。
在設置電子郵件合併時,請確保您的郵寄列表包含電子郵件地址列,該列將用於向每位收件人發送個人化郵件。 在演示試算表中,這是EmailAddress列。
- 在郵件選項卡中,單擊開始郵件合併 > 電子郵件消息。
- 在Word文件中撰寫您的郵件正文,然後插入合併字段用於問候語行和任何個性化內容,就像您為信件所做的一樣。
- 單擊選擇收件人 > 使用現有列表並連接到excel文件。
- 要使用郵件合併個性化電子郵件消息,請在您的主文件中插入合併字段,例如姓名和地址,這些將替換為從您的郵寄列表中相應的資料。
- 單擊完成與合併 > 發送電子郵件消息。
- 在對話框中,將發送至字段設置為您的電子郵件地址列(EmailAddress),新增主題行,並選擇HTML為郵件格式以獲得最佳相容性。
- 點擊確定。 Word通過Outlook向每位收件人發送一封個人化電子郵件。 Outlook聯繫人也可以作為資料源的替代選擇,而不是excel工作表,前提是您的聯繫人列表儲存在那裡。
完成電子郵件合併後,檢查您的Outlook已發郵件文件夾以確認消息已發送。 列表中的每封電子郵件都顯示為單獨的已發消息,每位收件人一封。

常見問題和排除故障
Word找不到Excel文件或在連接時返回錯誤
嘗試在Word中連結之前,請檢查excel文件是否已保存並完全關閉。 具有未保存更改的打開工作簿可能會阻止連接。 還請確認文件是保存為.xlsx而不是.xls或其他格式。
郵政編碼或郵遞區號的前導零缺失
當Excel中的ZipCode列格式設置為數字而不是文字時,會發生這種情況。 打開試算表,選擇ZipCode列,將其格式化為文字,然後重新輸入任何丟失前導零的值。 Excel文件必須再次保存並關閉,然後才能在Word中重新連接。
合併字段顯示字段程式碼而不是資料(例如{MERGEFIELD FirstName})
按下Alt + F9在Word中切換字段程式碼顯示和字段結果顯示。 這是一個顯示設置,不會影響合併本身。
匹配字段對話框顯示未映射的字段
當您的列名與Word期望的地址塊名稱不匹配時會發生這種情況。 單擊郵件選項卡中的匹配字段並手動將每個列名映射到相應的Word字段。 例如,如果Word自動不識別,將您的"ZipCode"列映射到"Postal Code"字段。
合併輸出中缺少一些收件人
單擊郵件選項卡中的選擇編輯收件人列表以打開郵件合併收件人面板。 檢查是否有行被意外取消選擇。 還要確認excel頁面內的資料範圍中沒有空行,因為這可能導致Word在到達列表末尾之前停止讀取資料條目。
電子郵件合併成功發送但收件人未收到電子郵件
在運行合併之前,確認Outlook開啟並設置為預設電子郵件程式。 檢查Outlook已發郵件文件夾查看消息是否已經發送。 如果使用新Outlook,請注意,有些版本與經典Outlook相比,對電子郵件合併的支援有限。
快速參考:從Excel到Word的郵件合併
| 任務 | 在哪裡找到它 | 筆記 |
|---|---|---|
| 開始郵件合併 | 郵件選項卡 > 開始郵件合併 | 選擇信件、標籤或電子郵件消息 |
| 連接Excel文件 | 選擇收件人 > 使用現有列表 | 文件必須保存並關閉 |
| 新增地址塊 | 插入字段組 > 地址塊 | 使用匹配字段進行列映射 |
| 插入單個字段 | 插入字段組 > 插入合併字段 | 合併字段名稱每一個字段 |
| 新增問候語行 | 郵件選項卡 > 問候語行 | 在對話框中選擇問候語行格式 |
| 預覽合併 | 郵件選項卡 > 預覽結果 | 使用左右箭頭檢查記錄 |
| 完成合併到文件 | 完成與合併 > 編輯個人化文件 | 建立包含所有頁面的新文件 |
| 列印文件 | 完成與合併 > 列印文件 | 直接發送到列印機 |
| 發送電子郵件消息 | 完成與合併 > 發送電子郵件消息 | 需要Outlook作為預設郵件程式 |
| 編輯收件人列表 | 選擇編輯收件人列表 | 篩選、排序或取消選擇行 |
對於開發人員:使用IronXL構建和驗證Excel郵件合併資料
如果您的應用程式生成郵件合併過程所需的Excel資料源,該文件的質量和格式將直接決定合併是否成功。 IronXL 是一個.NET函式庫,讓C#開發人員可以程式化地建立、讀取和格式化Excel文件,而無需在伺服器或開發人員機器上安裝Microsoft Office。
郵件合併資料文件中最常見的故障點是缺少標題、合併單元格、郵政編碼型別錯誤以及資料範圍內的空行。 IronXL讓您可以在文件交給Word之前,完全程式化地控制每個單元格、列格式和資料型別,從根本上消除此類問題。
這是使用IronXL建立正確結構的郵寄列表Excel文件的方法,所有列標題都位於Sheet 1的第一行,ZipCode列格式化為文字:
using IronXL;
// Create a new workbook - data must be on the first sheet for mail merge
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.DefaultWorkSheet;
workSheet.Name = "Sheet1";
// Set column headers in row 1 - these become the merge field names in Word
string[] headers = {
"FirstName", "LastName", "Salutation", "Company",
"Address", "City", "State", "ZipCode", "EmailAddress"
};
for (int i = 0; i < headers.Length; i++)
{
var headerCell = workSheet.GetCell(0, i);
headerCell.Value = headers[i];
headerCell.Style.Font.Bold = true;
}
// Add recipient data rows
var recipients = new[]
{
new[] { "James", "Carter", "Mr.", "Carter & Associates", "142 Oak Lane", "Chicago", "IL", "60601", "j.carter@carterassoc.com" },
new[] { "Sarah", "Mitchell", "Ms.", "Blue Ridge Consulting", "890 Maple Avenue", "Austin", "TX", "78701", "s.mitchell@blueridge.com" },
new[] { "Robert", "Nguyen", "Mr.", "Nguyen Legal Group", "55 Harbor View", "Seattle", "WA", "98101", "r.nguyen@nguyenlegal.com" },
};
for (int row = 0; row < recipients.Length; row++)
{
for (int col = 0; col < recipients[row].Length; col++)
{
var cell = workSheet.GetCell(row + 1, col);
cell.Value = recipients[row][col];
// Format ZipCode column (index 7) as text to preserve leading zeros
// This prevents postal codes like "02101" from dropping to "2101"
if (col == 7)
{
cell.FormatString = "@"; // @ = text format in Excel
}
}
}
// Save - file must be closed before Word can link to it for mail merge
workBook.SaveAs("mailing-list.xlsx");
using IronXL;
// Create a new workbook - data must be on the first sheet for mail merge
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.DefaultWorkSheet;
workSheet.Name = "Sheet1";
// Set column headers in row 1 - these become the merge field names in Word
string[] headers = {
"FirstName", "LastName", "Salutation", "Company",
"Address", "City", "State", "ZipCode", "EmailAddress"
};
for (int i = 0; i < headers.Length; i++)
{
var headerCell = workSheet.GetCell(0, i);
headerCell.Value = headers[i];
headerCell.Style.Font.Bold = true;
}
// Add recipient data rows
var recipients = new[]
{
new[] { "James", "Carter", "Mr.", "Carter & Associates", "142 Oak Lane", "Chicago", "IL", "60601", "j.carter@carterassoc.com" },
new[] { "Sarah", "Mitchell", "Ms.", "Blue Ridge Consulting", "890 Maple Avenue", "Austin", "TX", "78701", "s.mitchell@blueridge.com" },
new[] { "Robert", "Nguyen", "Mr.", "Nguyen Legal Group", "55 Harbor View", "Seattle", "WA", "98101", "r.nguyen@nguyenlegal.com" },
};
for (int row = 0; row < recipients.Length; row++)
{
for (int col = 0; col < recipients[row].Length; col++)
{
var cell = workSheet.GetCell(row + 1, col);
cell.Value = recipients[row][col];
// Format ZipCode column (index 7) as text to preserve leading zeros
// This prevents postal codes like "02101" from dropping to "2101"
if (col == 7)
{
cell.FormatString = "@"; // @ = text format in Excel
}
}
}
// Save - file must be closed before Word can link to it for mail merge
workBook.SaveAs("mailing-list.xlsx");
Imports IronXL
' Create a new workbook - data must be on the first sheet for mail merge
Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim workSheet As WorkSheet = workBook.DefaultWorkSheet
workSheet.Name = "Sheet1"
' Set column headers in row 1 - these become the merge field names in Word
Dim headers As String() = {
"FirstName", "LastName", "Salutation", "Company",
"Address", "City", "State", "ZipCode", "EmailAddress"
}
For i As Integer = 0 To headers.Length - 1
Dim headerCell = workSheet.GetCell(0, i)
headerCell.Value = headers(i)
headerCell.Style.Font.Bold = True
Next
' Add recipient data rows
Dim recipients = {
New String() { "James", "Carter", "Mr.", "Carter & Associates", "142 Oak Lane", "Chicago", "IL", "60601", "j.carter@carterassoc.com" },
New String() { "Sarah", "Mitchell", "Ms.", "Blue Ridge Consulting", "890 Maple Avenue", "Austin", "TX", "78701", "s.mitchell@blueridge.com" },
New String() { "Robert", "Nguyen", "Mr.", "Nguyen Legal Group", "55 Harbor View", "Seattle", "WA", "98101", "r.nguyen@nguyenlegal.com" }
}
For row As Integer = 0 To recipients.Length - 1
For col As Integer = 0 To recipients(row).Length - 1
Dim cell = workSheet.GetCell(row + 1, col)
cell.Value = recipients(row)(col)
' Format ZipCode column (index 7) as text to preserve leading zeros
' This prevents postal codes like "02101" from dropping to "2101"
If col = 7 Then
cell.FormatString = "@" ' @ = text format in Excel
End If
Next
Next
' Save - file must be closed before Word can link to it for mail merge
workBook.SaveAs("mailing-list.xlsx")
要在將Excel文件連接到郵件合併工作流程之前閱讀和驗證現有的Excel文件,IronXL讓您檢查所需結構變得簡單:
using IronXL;
WorkBook workBook = WorkBook.Load("mailing-list.xlsx");
// Always read from the first sheet for mail merge compatibility
WorkSheet firstSheet = workBook.DefaultWorkSheet;
// Verify the first row contains column headers, not data
string firstHeader = firstSheet["A1"].StringValue;
Console.WriteLine($"First column header: {firstHeader}");
// Read all recipient data rows
foreach (var row in firstSheet.Rows.Skip(1)) // Skip header row
{
string firstName = row[0].StringValue;
string lastName = row[1].StringValue;
string zipCode = row[7].StringValue; // Read as string to preserve leading zeros
Console.WriteLine($"{firstName} {lastName} - ZIP: {zipCode}");
}
using IronXL;
WorkBook workBook = WorkBook.Load("mailing-list.xlsx");
// Always read from the first sheet for mail merge compatibility
WorkSheet firstSheet = workBook.DefaultWorkSheet;
// Verify the first row contains column headers, not data
string firstHeader = firstSheet["A1"].StringValue;
Console.WriteLine($"First column header: {firstHeader}");
// Read all recipient data rows
foreach (var row in firstSheet.Rows.Skip(1)) // Skip header row
{
string firstName = row[0].StringValue;
string lastName = row[1].StringValue;
string zipCode = row[7].StringValue; // Read as string to preserve leading zeros
Console.WriteLine($"{firstName} {lastName} - ZIP: {zipCode}");
}
Imports IronXL
Dim workBook As WorkBook = WorkBook.Load("mailing-list.xlsx")
' Always read from the first sheet for mail merge compatibility
Dim firstSheet As WorkSheet = workBook.DefaultWorkSheet
' Verify the first row contains column headers, not data
Dim firstHeader As String = firstSheet("A1").StringValue
Console.WriteLine($"First column header: {firstHeader}")
' Read all recipient data rows
For Each row In firstSheet.Rows.Skip(1) ' Skip header row
Dim firstName As String = row(0).StringValue
Dim lastName As String = row(1).StringValue
Dim zipCode As String = row(7).StringValue ' Read as string to preserve leading zeros
Console.WriteLine($"{firstName} {lastName} - ZIP: {zipCode}")
Next
IronXL運行在.NET 6及更高版本,並且與Windows、Linux、macOS、Docker和Azure完全相容,非常適合從伺服器端應用程式、排程任務或Web API生成郵件合併資料文件,而不需要任何Microsoft Office的依賴。
開始使用: 透過NuGet安裝 IronXL.Excel 安裝包。 可用30天全功能免費試用,不需要信用卡。
進一步閱讀:
包裝
從excel快速表運行Word郵件合併是批量生產個性化信件、郵寄標籤和電子郵件消息的最可靠方法之一。 該過程歸結為三個核心步驟:在Excel中構建乾淨的郵寄列表,其中第一張工作表上的資料格式設置正確,通過郵件選項卡使用現有列表將該文件連接到Word,並準確地將合併字段放置在每個收件人資料應顯示的地方。
一旦連接了資料源,Word中的插入字段組和地址塊工具會承擔重任。 在完成合併之前,用左箭頭和右箭頭預覽結果,以捕捉任何格式問題、錯位的字段或缺少的郵編,然后它們到達收件人。 郵件合併完成後,您可以選擇保存合併文件,這將保留與資料源的連接,允許將來使用而無需重新連接。
對於那些應用程式生成或轉換進入郵件合併工作流程的Excel資料的開發團隊,IronXL提供了一個乾淨的API,用於在.NET中建立正確結構、格式良好的試算表文件,無需Office的依賴。 開始免費試用,在您的環境中探索完整功能集。
有關特定郵件合併場景或未按預期運作的步驟的問題? 在下方留言,或造訪Iron Software部落格以獲得關於Excel自動化、資料格式化和文件生成的進一步支持。




