在 C# 中如何查看 PowerPoint 文件
由团队撰写于 Iron Software
从Excel到Microsoft Word的邮件合并可以快速创建个性化的信件、标签或电子邮件,而无需手动编辑每个文档。 其理念很简单:您保持一个包含所有收件人详细信息的Excel电子表格,将其连接到一个Word邮件合并模板中,在需要个性化数据出现的地方插入合并字段,然后让Word生成每行数据的单独、自定义副本。 若是手动编辑需要花费数小时的工作,使用邮件合并却能在几分钟内完成,而且每个名字、地址和细节都正确地从您的邮寄列表中填充。
邮件合并过程涉及三个文档:包含数据的Excel文件、Word中包含信件或标签的主文档,以及最终生成的合并文档。 成功的邮件合并需要一个干净的电子表格、正确格式化的数据,以及在Word模板中正确位置放置的合并字段。 诸如邮政编码、货币和日期等特殊数据类型应在开始邮件合并之前在Excel中正确格式化,并且所有数据必须在Excel工作簿的第一张工作表上,以便Word正确读取。
这篇文章解释了该过程的每一步:准备您的Excel电子表格,在邮件选项卡中将其连接为数据源,插入合并字段,预览结果,完成合并,以及处理电子邮件消息。 需要在运行合并前以编程方式构建或验证Excel数据源的开发人员,可以在文章结尾找到如何使用IronXL在.NET中处理Excel文件创建和格式化的部分,而无需安装Microsoft Office。
步骤1:准备您的Excel电子表格
一个干净、结构良好的Excel电子表格是可靠的Word邮件合并的基础。 在打开Word之前,您的数据与合并字段之间的匹配完全取决于Excel文件的设置方式。
第一行的列标题。 确保您的Excel电子表格为您要包括的每个项目准备了一个列,如姓名、地址、城市、州和邮政编码。 第一行中的列名将成为Word中可用的合并字段,因此它们应是唯一的、清晰标记的,并且没有空行位于它们之上。 确保第一行包含唯一的标题,并且没有空行在其上面,因为Word使用第一行来识别可用的合并字段。
为每一个数据段使用单独的列。 将名、姓和称谓分别储存在不同的列中,而不是将它们组合在一起。 这样当稍后创建问候行和地址块时,您就能完全控制。 在Word中运行邮件合并之前,确保您的Excel文件包含所有必要的信息,例如名、姓、称谓、邮政编码和地址。
将邮政编码和区号格式化为文本。 在为邮件合并准备Excel数据时,确保ZIP码或邮政编码的列格式设置为文本,以避免丢失任何前导零。 如果单元格格式为数字,则像02101这样的邮政编码会静默丢掉前导零,导致在每个合并的信件中输出格式不正确。
保持所有数据在第一张表中。 为了成功的邮件合并,所有数据必须在Excel工作簿的第一张表中。 如果您的工作簿有多个选项卡,Word将只读取第一张表,因此在连接文件之前将所有数据条目移动到Sheet 1。
保存并关闭该Excel文件。 在链接到Microsoft Word之前,Excel文件必须保存并关闭,以保证邮件合并的正常运行。 打开的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格式,并确保所有列标题位于第一行且其上没有空行。
一旦连接,您可以点击邮件选项卡中的编辑收件人列表,打开邮件合并收件人面板。 这将显示您的电子表格中的每一行作为一个单独的条目。 您可以使用它来取消选择特定收件人,排序列表,或过滤合并中包含的行。 在继续前仔细检查收件人列表,以确保Word正确读取了您的所有数据条目。

步骤4:在您的文档中插入合并字段
连接好数据源后,现在可以在word文档中您希望个性化数据出现的地方插入邮件合并字段。
使用地址块:
地址块是一个捷径,将姓名、公司和邮寄地址合并为一个字段。 点击邮件选项卡的插入字段组中的地址块。 将出现一个对话框,您可以在其中配置姓名和地址的格式。 如果匹配字段对话框中的任何字段未自动与您的列名对齐,请点击匹配字段。 匹配字段对话框让您手动将列标题映射到Word内部使用的预期字段名称,从而解决任何电子表格匹配问题。
使用单个合并字段:
为了完全控制布局和格式,将合并字段一个接一个地插入。将光标放置在您希望放置字段的位置,然后点击插入合并字段在插入字段组中。 下拉菜单列出了您的Excel电子表格中的每个列标题。 点击字段名以将其插入光标位置。 常见需要插入的字段包括:
- 为地址块开头准备的"称谓" "姓"
- 在下面的行上加入"公司"
- 下一行"地址"后跟"城市"、"州"和"邮政编码"
- 问候语,例如"亲爱的"称谓" "姓氏","
使用问候语:
点击邮件选项卡中的选择问候语以插入预格式化的问候。 在对话框中,您可以选择问候语格式(亲爱的史密斯先生,亲雅姆,等等)并配置名字字段为空的收件人的备用设置。
始终手动在连续合并字段之间添加空格。 Word不会自动在字段之间添加空格,因此""姓""名字""将显示为"詹姆斯卡特",中间没有空格。

步骤5:在完成合并之前预览结果
在文档中插入合并字段后,您可以通过在邮件选项卡中选择预览结果来预览结果,从而了解合并数据的外观。
点击邮件选项卡中的预览结果。 Word将每个合并字段替换为您的Excel电子表格第一行中的对应数据。 使用预览结果组中的左箭头和右箭头在记录之间移动,并检查每个收件人的数据是否正确显示。 这可让您在完成全面合并之前验证收件人详细信息的正确性。
特别注意:
- 问候语是否自然流畅(如"亲爱的卡特先生,"而不是"亲爱的卡特先生 ,")
- 地址块在所有行上是否格式正确,包括那些公司名称较长的行
- 邮政编码和邮政代码在适用的情况下是否以前导零显示
- 页面顶部的当前记录计数器是否与您的预期一致
在合并字段插入电子邮件或信件后,您可以预览结果以确认内容正确显示,然后再完成合并过程。 使用左右箭头滚动浏览多个记录,而不仅仅是第一条。

步骤6:完成邮件合并并输出您的文档
确认预览后,您可以准备运行合并并生成最终输出。
合并到新文档(推荐):
在邮件选项卡中,点击完成并合并按钮,然后从下拉箭头中选择编辑单个文档。 对话框询问是否合并所有记录、当前记录或一范围。 选择全部并点击确定。 Word生成包含所有单独文档的新文档,以每个收件人为一个页面。 这是一种最安全的方法,因为它让您在打印或发送文档之前可以审查合并文档。
阅后保存以保留合并文档。 您还可以选择使用文件 > 另存为重新命名并将其与您的模板和数据源存放在一起。
直接打印:
点击完成并合并 > 打印文档将合并结果直接发送到打印机,不用创建中间文件。当您需要立即打印文档而不需要先审查或存档单个文档时,此功能非常有用。

步骤7:创建邮寄标签
相同的邮件合并过程可用于创建使用Excel电子表格作为数据源的邮寄标签,步骤与信件相同。
- 在邮件选项卡中,点击启动邮件合并 > 标签。
- 在标签选项对话框中,选择您的标签供应商和产品编号,以匹配计算机上的实际标签纸。
- 点击选择收件人 > 使用现有列表并链接到相同的Excel文件。
- 点击插入合并字段将地址字段放在标签上。 在单个标签区域的单独行中添加"姓"、"名字"、"地址"、"城市"、"州"、和"邮政编码"。
- 点击更新标签以将布局复制到页面上的所有标签。
- 预览,然后完成合并以生成准备打印的单独标签。
步骤8:通过邮件合并发送电子邮件
邮件合并还可以直接从Word通过Microsoft Outlook发送个性化电子邮件。
通过邮件合并发送电子邮件需要Outlook打开并设置为默认的电子邮件程序。 这适用于经典Outlook和新Outlook。 在开始之前确保配置正确。
在设置电子邮件合并时,确保您的邮件列表中包含一个电子邮件地址的列,这将用于向每个收件人发送个性化信息。 在演示电子表格中,这是电子邮件地址列。
- 在邮件选项卡中,点击启动邮件合并 > 电子邮件信息。
- 在Word文档中编写您的邮件正文,然后插入问候行和任何个性化内容的合并字段,就像编写信件一样。
- 点击选择收件人 > 使用现有列表并连接到您的Excel文件。
- 要使用邮件合并个性化电子邮件,在您的主文档中插入合并字段,如名字和地址,这些字段将被您的邮件列表中的相应数据替换。
- 点击完成并合并 > 发送电子邮件。
- 在对话框中,将收件人字段设置为您的电子邮件地址列(EmailAddress),添加主题行,并选择HTML为邮件格式以获得最佳兼容性。
- 点击确定。 Word通过Outlook向每个收件人发送一封个性化邮件。 Outlook联系人也可以作为替代数据源,而不是excel表,如果您的联系人列表存储在那里。
完成电子邮件合并后,检查您的Outlook已发送邮件文件夹以确认邮件是否已发送。 列表中的每封邮件显示为单独的已发送邮件,每个收件人为一封。

常见问题及故障排除
Word找不到Excel文件或连接时出错
在尝试连接到Word之前,检查Excel文件是否已经保存并完全关闭。 打开但未保存更改的工作簿可能会阻止连接。 还要确认文件保存为.xlsx而不是.xls或其他格式。
邮政编码或邮政代码缺少前导零
当Excel中的ZipCode列格式化为数字而不是文本时会发生这种情况。 打开电子表格,选择ZipCode列,将其格式化为文本,然后重新输入丢失前导零的值。 Excel文件必须再次保存并关闭,然后在Word中重新连接。
合并字段显示字段代码而不是数据(例如{MERGEFIELD 姓)
按下Alt + F9可在Word中切换字段代码显示和字段结果显示。 这是一个显示设置,不会影响合并本身。
匹配字段对话框显示未映射的字段
当您的列名与Word期望的用于地址块的名称不匹配时会发生这种情况。 点击邮件选项卡中的匹配字段并手动将每个列名映射到相应的Word字段。 例如,如果Word不自动识别您的"ZipCode"列,可以将其映射到"邮政编码"字段。
某些收件人在合并输出中缺失
通过点击邮件选项卡中的选择编辑收件人列表打开邮件合并收件人面板。 检查是否有任何行被意外取消选择。 还要确认excel表中的数据范围内没有空行,因为这些可能导致Word在到达列表末尾之前停止读取数据条目。
电子邮件合并已发送但收件人未收到电子邮件
在运行合并之前确认Outlook已打开并设置为默认电子邮件程序。 检查Outlook已发送邮件文件夹,看看消息是否已发送。 如果使用新Outlook,需要注意的是,某些版本对电子邮件合并的支持比经典Outlook有限。
快速参考:从Excel到Word的邮件合并
| 任务 | 在哪里可以找到 | 备注 |
|---|---|---|
| 启动邮件合并 | 邮件选项卡 > 启动邮件合并 | 选择信件、标签或电子邮件信息 |
| 连接Excel文件 | 选择收件人 > 使用现有列表 | 文件必须保存并关闭 |
| 添加地址块 | 插入字段组 > 地址块 | 使用匹配字段进行列映射 |
| 插入单个字段 | 插入字段组 > 插入合并字段 | 每个合并字段名称一个字段 |
| 添加问候行 | 邮件选项卡 > 问候行 | 在对话框中选择问候格式 |
| 预览合并 | 邮件选项卡 > 预览结果 | 使用左右箭头检查记录 |
| 完成合并到文件 | 完成并合并 > 编辑单个文档 | 创建包含所有页面的新文档 |
| 打印文档 | 完成并合并 > 打印文档 | 直接发送到打印机 |
| 发送电子邮件 | 完成并合并 > 发送电子邮件 | 要求Outlook作为默认电子邮件程序 |
| 编辑收件人列表 | 选择编辑收件人列表 | 过滤、排序或取消选择行 |
供开发者使用:使用IronXL构建和验证Excel邮件合并数据
如果您的应用程序生成用于邮件合并过程的Excel数据源,则该文件的质量和格式决定了合并是否成功。 IronXL是一个.NET库,让C#开发人员可以在不需要在服务器或开发机上安装Microsoft Office的情况下以编程方式创建、读取和格式化Excel文件。
邮件合并数据文件中最常见的故障点是缺少标题、合并单元格、输入错误的邮政编码和数据范围中的空行。 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文件连接到邮件合并工作流之前读取和验证它,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使用Install-Package IronXL.Excel安装。 免费试用可享有30天的全部功能且不需要信用卡。
进一步阅读:
总结
从Excel电子表格运行Word邮件合并是大规模制作个性化信件、邮寄标签和电子邮件信息的最可靠方法之一。 该过程归结为三个核心步骤:在Excel中构建一个数据合适、格式正确的第一张邮寄列表,使用邮件选项卡通过使用现有列表连接该文件到Word,并精确放置合并字段让每个收件人数据片段显示在正确位置。
一旦连接到数据源,Word中的插入字段组和地址块工具就能处理沉重的工作。 在完成合并之前,用左右箭头预览结果,以查找任何格式问题、字段对齐错误或缺失的邮政编码,以避免它们到达收件人手中。 邮件合并完成后,您可以选择保存合并文档,保持与数据源的连接,可以将来使用而无需重新连接。
对于那些应用程序生成或转换进入邮件合并工作流的Excel数据的开发团队,IronXL提供了一种干净的API,用于创建结构正确、格式适当的电子表格文件在.NET中而无需Office依赖。 从试用版本开始,探索在您自己的环境中完整的功能集。
关于特定邮件合并场景或某个步骤未按预期工作的问题? 在下方留言,或访问Iron Software博客以获取有关Excel自动化、数据格式和文档生成的更多帮助。




