.NET驾驭Word之力:结构化文档元素操作

news/2025/9/22 15:55:48/文章来源:https://www.cnblogs.com/mudtools/p/19105429

在前几篇文章中,我们学习了Word对象模型的基础知识、文本操作与格式设置等内容。掌握了这些基础知识后,我们现在可以进一步深入到文档的结构化元素操作,包括段落与节的管理、表格的创建与操作以及图片的插入等。

本文将详细介绍如何使用MudTools.OfficeInterop.Word库来操作Word文档中的结构化元素,包括段落与节的使用、表格的自动化操作以及图片与形状的插入。最后,我们将通过一个实战示例——创建一个包含多种结构化元素的员工信息表,来综合运用所学知识。

使用段落(Paragraphs)与节(Sections)

段落和节是Word文档中重要的结构化元素。段落用于组织文本内容,而节则用于对文档进行分段,以便为不同部分设置不同的页面布局。

遍历文档中的所有段落

在处理Word文档时,经常需要遍历文档中的所有段落以进行批量操作。通过Paragraphs属性,我们可以轻松访问文档中的所有段落。

using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Word;// 打开现有文档
using var wordApp = WordFactory.Open(@"C:\Documents\SampleDocument.docx");
var document = wordApp.ActiveDocument;// 遍历文档中的所有段落
foreach (var paragraph in document.Paragraphs)
{// 输出段落文本Console.WriteLine(paragraph.GetText());// 为每个段落设置12磅的段后间距paragraph.SpaceAfter = 12;// 为每个段落设置1.5倍行距paragraph.LineSpacingRule = WdLineSpacing.wdLineSpace15;
}// 或者通过索引访问特定段落
for (int i = 1; i <= document.ParagraphCount; i++)
{var paragraph = document.Paragraphs[i];// 处理段落内容Console.WriteLine($"第{i}段: {paragraph.GetText()}");
}

在上面的示例中,我们展示了两种遍历段落的方式:使用foreach循环和通过索引访问。每种方式都有其适用场景,foreach循环适用于需要处理所有段落的情况,而索引访问适用于需要精确控制处理顺序或只处理特定段落的情况。

应用场景:文档格式标准化

在企业环境中,经常需要对大量文档进行格式标准化处理。例如,确保所有文档的段落间距、行距、字体等符合公司规范。

/// <summary>
/// 文档格式标准化工具
/// </summary>
public class DocumentFormatter
{/// <summary>/// 标准化文档格式/// </summary>/// <param name="documentPath">文档路径</param>public void StandardizeDocument(string documentPath){try{// 打开文档using var wordApp = WordFactory.Open(documentPath);var document = wordApp.ActiveDocument;// 隐藏Word应用程序以提高性能wordApp.Visibility = WordAppVisibility.Hidden;wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;// 遍历所有段落并标准化格式foreach (var paragraph in document.Paragraphs){// 设置段落格式paragraph.SpaceAfter = 12;  // 段后间距12磅paragraph.SpaceBefore = 0;  // 段前间距0磅paragraph.LineSpacingRule = WdLineSpacing.wdLineSpace15; // 1.5倍行距// 设置字体格式paragraph.Range.Font.Name = "微软雅黑";paragraph.Range.Font.Size = 10.5f;// 设置对齐方式paragraph.Alignment = WdParagraphAlignment.wdAlignParagraphJustify; // 两端对齐}// 保存文档document.Save();document.Close();Console.WriteLine($"文档 {documentPath} 格式标准化完成");}catch (Exception ex){Console.WriteLine($"格式标准化过程中发生错误: {ex.Message}");}}
}

使用节(Section)为文档的不同部分设置不同的页面布局

节是Word文档中用于分隔具有不同页面布局设置的区域。通过节,我们可以为文档的不同部分设置不同的页眉页脚、纸张方向、页边距等。

// 添加新节并设置不同的页面方向
var sections = document.Sections;// 获取当前节的数量
int sectionCount = sections.Count;// 在文档末尾添加分节符以创建新节
document.AddSectionBreak(document.Content.End - 1, (int)WdSectionBreakType.wdSectionBreakNextPage);// 获取新添加的节
var newSection = sections[sectionCount + 1];// 为新节设置横向页面
newSection.PageSetup.Orientation = WdOrientation.wdOrientLandscape;// 为不同节设置不同的页眉
var firstSectionHeader = sections[1].Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary];
firstSectionHeader.Range.Text = "这是第一节的页眉";var newSectionHeader = newSection.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary];
newSectionHeader.Range.Text = "这是新节的页眉";

通过以上代码,我们可以为文档的不同部分设置不同的页面布局。这对于制作包含多种内容类型的复杂文档非常有用,例如在同一篇文档中既有纵向的文字说明,又有横向的表格数据。

应用场景:制作混合布局报告

在制作技术报告或商业文档时,经常需要在同一篇文档中包含不同类型的页面布局。例如,文档正文使用纵向布局,而数据表格使用横向布局。

/// <summary>
/// 混合布局报告生成器
/// </summary>
public class MixedLayoutReportGenerator
{/// <summary>/// 生成混合布局报告/// </summary>/// <param name="templatePath">模板路径</param>/// <param name="outputPath">输出路径</param>public void GenerateReport(string templatePath, string outputPath){try{// 基于模板创建文档using var wordApp = WordFactory.CreateFrom(templatePath);var document = wordApp.ActiveDocument;// 隐藏Word应用程序wordApp.Visibility = WordAppVisibility.Hidden;wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;// 在文档末尾添加分节符,创建新节用于横向表格document.AddSectionBreak(document.Content.End - 1, (int)WdSectionBreakType.wdSectionBreakNextPage);// 获取新节var dataSection = document.Sections[document.Sections.Count];// 设置新节为横向布局dataSection.PageSetup.Orientation = WdOrientation.wdOrientLandscape;// 在新节中添加标题var range = dataSection.Range;range.Collapse(WdCollapseDirection.wdCollapseStart);range.Text = "数据汇总表\n";range.Font.Bold = 1;range.Font.Size = 14;range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;// 添加表格range.Collapse(WdCollapseDirection.wdCollapseEnd);var table = document.Tables.Add(range, 10, 6); // 10行6列的表格// 填充表格数据PopulateTableData(table);// 保存文档document.SaveAs(outputPath, WdSaveFormat.wdFormatXMLDocument);document.Close();Console.WriteLine($"混合布局报告已生成: {outputPath}");}catch (Exception ex){Console.WriteLine($"生成报告时发生错误: {ex.Message}");}}/// <summary>/// 填充表格数据/// </summary>/// <param name="table">表格对象</param>private void PopulateTableData(IWordTable table){// 表头string[] headers = { "序号", "产品名称", "销售数量", "单价", "总金额", "备注" };for (int i = 0; i < headers.Length; i++){table.Cell(1, i + 1).Range.Text = headers[i];table.Cell(1, i + 1).Range.Font.Bold = 1;table.Cell(1, i + 1).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;}// 示例数据string[,] data = {{"1", "产品A", "100", "50.00", "5000.00", ""},{"2", "产品B", "200", "30.00", "6000.00", ""},{"3", "产品C", "150", "40.00", "6000.00", ""},{"4", "产品D", "80", "70.00", "5600.00", ""},{"5", "产品E", "120", "35.00", "4200.00", ""}};// 填充数据for (int i = 0; i < data.GetLength(0); i++){for (int j = 0; j < data.GetLength(1); j++){table.Cell(i + 2, j + 1).Range.Text = data[i, j];table.Cell(i + 2, j + 1).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;}}// 设置表格样式table.Borders.Enable = 1;table.PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;table.PreferredWidth = 100;}
}

表格(Table)的自动化

表格是Word文档中用于组织和展示数据的重要元素。MudTools.OfficeInterop.Word库提供了丰富的API来创建、操作和格式化表格。

创建指定行数列的表格

使用Tables.Add方法,我们可以轻松地在文档中创建指定行列数的表格。

// 在文档末尾创建一个5行4列的表格
var range = document.Content;
range.Collapse(WdCollapseDirection.wdCollapseEnd); // 将范围折叠到末尾var table = document.Tables.Add(range, 5, 4);// 设置表格标题行
table.Rows[1].Cells[1].Range.Text = "姓名";
table.Rows[1].Cells[2].Range.Text = "部门";
table.Rows[1].Cells[3].Range.Text = "职位";
table.Rows[1].Cells[4].Range.Text = "入职日期";// 填充表格数据
string[,] employeeData = {{"张三", "技术部", "软件工程师", "2022-01-15"},{"李四", "市场部", "市场专员", "2021-11-20"},{"王五", "人事部", "人事经理", "2020-05-10"},{"赵六", "财务部", "会计师", "2022-03-08"}
};for (int i = 0; i < employeeData.GetLength(0); i++)
{for (int j = 0; j < employeeData.GetLength(1); j++){table.Cell(i + 2, j + 1).Range.Text = employeeData[i, j];}
}// 设置标题行为粗体
for (int i = 1; i <= 4; i++)
{table.Cell(1, i).Range.Font.Bold = 1;
}

遍历单元格、写入数据、设置表格样式和边框

创建表格后,我们需要填充数据并设置样式。

// 设置表格样式
table.TableStyle = "网格型";// 设置表格边框
table.Borders.Enable = 1;
table.Borders.LineStyle = WdLineStyle.wdLineStyleSingle;
table.Borders.LineWidth = WdLineWidth.wdLineWidth150pt;// 遍历所有单元格并设置对齐方式
foreach (var row in table.Rows)
{foreach (var cell in row.Cells){cell.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;cell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;}
}// 设置表格宽度
table.PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;
table.PreferredWidth = 100;

单元格合并与拆分

在实际应用中,我们经常需要合并或拆分单元格以满足不同的布局需求。

// 合并单元格示例:合并第一行的所有单元格作为标题
var firstRow = table.Rows[1];
firstRow.Cells[1].Merge(firstRow.Cells[4]);// 在合并后的单元格中添加标题文本
firstRow.Cells[1].Range.Text = "员工信息表";
firstRow.Cells[1].Range.Font.Bold = 1;
firstRow.Cells[1].Range.Font.Size = 14;
firstRow.Cells[1].Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;// 拆分单元格示例:拆分指定单元格
var cellToSplit = table.Cell(3, 2);
cellToSplit.Split(2, 1); // 拆分为2行1列

应用场景:自动化生成财务报表

在财务部门,经常需要生成各种财务报表,这些报表通常包含复杂的表格结构。通过自动化生成,可以大大提高工作效率并减少错误。

/// <summary>
/// 财务报表生成器
/// </summary>
public class FinancialReportGenerator
{/// <summary>/// 生成财务报表/// </summary>/// <param name="financialData">财务数据</param>/// <param name="outputPath">输出路径</param>public void GenerateFinancialReport(FinancialData financialData, string outputPath){try{// 创建新文档using var wordApp = WordFactory.BlankWorkbook();var document = wordApp.ActiveDocument;// 隐藏Word应用程序wordApp.Visibility = WordAppVisibility.Hidden;wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;// 添加标题AddReportTitle(document, "年度财务报告");// 添加报告基本信息AddReportInfo(document, financialData);// 添加收入明细表AddIncomeStatement(document, financialData.IncomeItems);// 添加资产负债表AddBalanceSheet(document, financialData.Assets, financialData.Liabilities, financialData.Equity);// 保存文档document.SaveAs(outputPath, WdSaveFormat.wdFormatXMLDocument);document.Close();Console.WriteLine($"财务报告已生成: {outputPath}");}catch (Exception ex){Console.WriteLine($"生成财务报告时发生错误: {ex.Message}");}}/// <summary>/// 添加报告标题/// </summary>/// <param name="document">文档对象</param>/// <param name="title">标题文本</param>private void AddReportTitle(IWordDocument document, string title){var titleParagraph = document.AddParagraph(0, title);titleParagraph.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;titleParagraph.Range.Font.Name = "微软雅黑";titleParagraph.Range.Font.Size = 18;titleParagraph.Range.Font.Bold = 1;// 添加空行document.AddParagraph(document.Content.End - 1);}/// <summary>/// 添加报告基本信息/// </summary>/// <param name="document">文档对象</param>/// <param name="financialData">财务数据</param>private void AddReportInfo(IWordDocument document, FinancialData financialData){var infoParagraph = document.AddParagraph(document.Content.End - 1, $"报告期间: {financialData.Period}\n" +$"编制单位: {financialData.CompanyName}\n" +$"货币单位: 人民币元\n");infoParagraph.Range.Font.Name = "微软雅黑";infoParagraph.Range.Font.Size = 12;// 添加空行document.AddParagraph(document.Content.End - 1);}/// <summary>/// 添加收入明细表/// </summary>/// <param name="document">文档对象</param>/// <param name="incomeItems">收入项目</param>private void AddIncomeStatement(IWordDocument document, List<IncomeItem> incomeItems){// 添加表标题var titleParagraph = document.AddParagraph(document.Content.End - 1, "一、收入明细表");titleParagraph.Range.Font.Bold = 1;titleParagraph.Range.Font.Size = 14;// 添加空行document.AddParagraph(document.Content.End - 1);// 创建表格var range = document.Content;range.Collapse(WdCollapseDirection.wdCollapseEnd);var table = document.Tables.Add(range, incomeItems.Count + 2, 4); // 数据行+标题行+合计行// 设置表头string[] headers = { "项目", "本期金额", "上期金额", "增减率(%)" };for (int i = 0; i < headers.Length; i++){var cell = table.Cell(1, i + 1);cell.Range.Text = headers[i];cell.Range.Font.Bold = 1;cell.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;cell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;}// 填充数据decimal totalCurrent = 0, totalPrevious = 0;for (int i = 0; i < incomeItems.Count; i++){var item = incomeItems[i];table.Cell(i + 2, 1).Range.Text = item.Name;table.Cell(i + 2, 2).Range.Text = item.CurrentAmount.ToString("N2");table.Cell(i + 2, 3).Range.Text = item.PreviousAmount.ToString("N2");table.Cell(i + 2, 4).Range.Text = item.ChangeRate.ToString("F2");totalCurrent += item.CurrentAmount;totalPrevious += item.PreviousAmount;// 设置对齐方式for (int j = 1; j <= 4; j++){table.Cell(i + 2, j).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;if (j > 1){table.Cell(i + 2, j).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight;}}}// 添加合计行table.Cell(incomeItems.Count + 2, 1).Range.Text = "合计";table.Cell(incomeItems.Count + 2, 1).Range.Font.Bold = 1;table.Cell(incomeItems.Count + 2, 2).Range.Text = totalCurrent.ToString("N2");table.Cell(incomeItems.Count + 2, 2).Range.Font.Bold = 1;table.Cell(incomeItems.Count + 2, 3).Range.Text = totalPrevious.ToString("N2");table.Cell(incomeItems.Count + 2, 3).Range.Font.Bold = 1;var totalChangeRate = totalPrevious != 0 ? (totalCurrent - totalPrevious) / totalPrevious * 100 : 0;table.Cell(incomeItems.Count + 2, 4).Range.Text = totalChangeRate.ToString("F2");table.Cell(incomeItems.Count + 2, 4).Range.Font.Bold = 1;// 设置合计行对齐方式for (int j = 1; j <= 4; j++){table.Cell(incomeItems.Count + 2, j).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;if (j > 1){table.Cell(incomeItems.Count + 2, j).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight;}}// 设置表格样式table.Borders.Enable = 1;table.PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;table.PreferredWidth = 100;// 添加空行document.AddParagraph(document.Content.End - 1);document.AddParagraph(document.Content.End - 1);}/// <summary>/// 添加资产负债表/// </summary>/// <param name="document">文档对象</param>/// <param name="assets">资产项目</param>/// <param name="liabilities">负债项目</param>/// <param name="equity">权益项目</param>private void AddBalanceSheet(IWordDocument document, List<AssetItem> assets, List<LiabilityItem> liabilities, List<EquityItem> equity){// 添加表标题var titleParagraph = document.AddParagraph(document.Content.End - 1, "二、资产负债表");titleParagraph.Range.Font.Bold = 1;titleParagraph.Range.Font.Size = 14;// 添加空行document.AddParagraph(document.Content.End - 1);// 创建表格var range = document.Content;range.Collapse(WdCollapseDirection.wdCollapseEnd);var table = document.Tables.Add(range, Math.Max(assets.Count, liabilities.Count + equity.Count) + 1, 4);// 设置表头table.Cell(1, 1).Range.Text = "资产";table.Cell(1, 1).Range.Font.Bold = 1;table.Cell(1, 2).Range.Text = "金额";table.Cell(1, 2).Range.Font.Bold = 1;table.Cell(1, 3).Range.Text = "负债和权益";table.Cell(1, 3).Range.Font.Bold = 1;table.Cell(1, 4).Range.Text = "金额";table.Cell(1, 4).Range.Font.Bold = 1;// 设置表头格式for (int i = 1; i <= 4; i++){table.Cell(1, i).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;table.Cell(1, i).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;}// 填充资产数据for (int i = 0; i < assets.Count; i++){table.Cell(i + 2, 1).Range.Text = assets[i].Name;table.Cell(i + 2, 2).Range.Text = assets[i].Amount.ToString("N2");// 设置格式table.Cell(i + 2, 1).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;table.Cell(i + 2, 2).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;table.Cell(i + 2, 2).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight;}// 填充负债和权益数据int liabilityStartRow = 2;for (int i = 0; i < liabilities.Count; i++){table.Cell(i + liabilityStartRow, 3).Range.Text = liabilities[i].Name;table.Cell(i + liabilityStartRow, 4).Range.Text = liabilities[i].Amount.ToString("N2");// 设置格式table.Cell(i + liabilityStartRow, 3).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;table.Cell(i + liabilityStartRow, 4).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;table.Cell(i + liabilityStartRow, 4).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight;}// 填充权益数据int equityStartRow = liabilityStartRow + liabilities.Count;for (int i = 0; i < equity.Count; i++){table.Cell(i + equityStartRow, 3).Range.Text = equity[i].Name;table.Cell(i + equityStartRow, 4).Range.Text = equity[i].Amount.ToString("N2");// 设置格式table.Cell(i + equityStartRow, 3).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;table.Cell(i + equityStartRow, 4).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;table.Cell(i + equityStartRow, 4).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight;}// 计算资产合计decimal totalAssets = assets.Sum(a => a.Amount);table.Cell(assets.Count + 2, 1).Range.Text = "资产总计";table.Cell(assets.Count + 2, 1).Range.Font.Bold = 1;table.Cell(assets.Count + 2, 2).Range.Text = totalAssets.ToString("N2");table.Cell(assets.Count + 2, 2).Range.Font.Bold = 1;// 计算负债和权益合计decimal totalLiabilities = liabilities.Sum(l => l.Amount);decimal totalEquity = equity.Sum(e => e.Amount);table.Cell(Math.Max(assets.Count, liabilities.Count + equity.Count) + 1, 3).Range.Text = "负债和权益总计";table.Cell(Math.Max(assets.Count, liabilities.Count + equity.Count) + 1, 3).Range.Font.Bold = 1;table.Cell(Math.Max(assets.Count, liabilities.Count + equity.Count) + 1, 4).Range.Text = (totalLiabilities + totalEquity).ToString("N2");table.Cell(Math.Max(assets.Count, liabilities.Count + equity.Count) + 1, 4).Range.Font.Bold = 1;// 设置表格样式table.Borders.Enable = 1;table.PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;table.PreferredWidth = 100;}
}/// <summary>
/// 财务数据模型
/// </summary>
public class FinancialData
{/// <summary>/// 报告期间/// </summary>public string Period { get; set; }/// <summary>/// 公司名称/// </summary>public string CompanyName { get; set; }/// <summary>/// 收入项目列表/// </summary>public List<IncomeItem> IncomeItems { get; set; }/// <summary>/// 资产项目列表/// </summary>public List<AssetItem> Assets { get; set; }/// <summary>/// 负债项目列表/// </summary>public List<LiabilityItem> Liabilities { get; set; }/// <summary>/// 权益项目列表/// </summary>public List<EquityItem> Equity { get; set; }
}/// <summary>
/// 收入项目
/// </summary>
public class IncomeItem
{/// <summary>/// 项目名称/// </summary>public string Name { get; set; }/// <summary>/// 本期金额/// </summary>public decimal CurrentAmount { get; set; }/// <summary>/// 上期金额/// </summary>public decimal PreviousAmount { get; set; }/// <summary>/// 增减率/// </summary>public decimal ChangeRate => PreviousAmount != 0 ? (CurrentAmount - PreviousAmount) / PreviousAmount * 100 : 0;
}/// <summary>
/// 资产项目
/// </summary>
public class AssetItem
{/// <summary>/// 项目名称/// </summary>public string Name { get; set; }/// <summary>/// 金额/// </summary>public decimal Amount { get; set; }
}/// <summary>
/// 负债项目
/// </summary>
public class LiabilityItem
{/// <summary>/// 项目名称/// </summary>public string Name { get; set; }/// <summary>/// 金额/// </summary>public decimal Amount { get; set; }
}/// <summary>
/// 权益项目
/// </summary>
public class EquityItem
{/// <summary>/// 项目名称/// </summary>public string Name { get; set; }/// <summary>/// 金额/// </summary>public decimal Amount { get; set; }
}

图片与形状的插入

图片和形状能够丰富文档的视觉效果,使其更加生动和易于理解。Word提供了两种类型的图形对象:内嵌形状和浮动形状。

使用InlineShapes.AddPicture方法插入图片

内嵌形状是嵌入在文本行中的对象,它们随着文本移动而移动。

// 在文档末尾插入内嵌图片
var range = document.Content;
range.Collapse(WdCollapseDirection.wdCollapseEnd);// 使用InlineShapes.AddPicture方法插入图片
var inlineShape = document.InlineShapes.AddPicture(fileName: @"C:\Images\company_logo.png",linkToFile: false,        // 不链接到文件saveWithDocument: true    // 与文档一起保存
);// 设置图片大小
inlineShape.Width = 100;
inlineShape.Height = 50;// 添加图片说明文字
range.InsertAfter("\n公司Logo\n");

使用Shapes.AddPicture方法插入浮动图片并设置环绕方式

浮动形状是独立于文本流的对象,可以放置在页面上的任意位置,并可以设置文字环绕方式。

// 插入浮动图片
var shape = document.Shapes.AddPicture(fileName: @"C:\Images\decorative_image.png",linkToFile: false,saveWithDocument: true,left: 300,    // 距离页面左边距300磅top: 150,     // 距离页面上边距150磅width: 150,height: 100
);// 设置图片的环绕方式
shape.WrapFormat.Type = WdWrapType.wdWrapSquare;
shape.WrapFormat.DistanceTop = 10;
shape.WrapFormat.DistanceBottom = 10;
shape.WrapFormat.DistanceLeft = 10;
shape.WrapFormat.DistanceRight = 10;// 设置图片的相对位置
shape.RelativeHorizontalPosition = WdRelativeHorizontalPosition.wdRelativeHorizontalPositionPage;
shape.RelativeVerticalPosition = WdRelativeVerticalPosition.wdRelativeVerticalPositionPage;

应用场景:自动化制作产品宣传册

在市场营销领域,经常需要制作产品宣传册。通过自动化生成,可以快速制作大量标准化的宣传材料。

/// <summary>
/// 产品宣传册生成器
/// </summary>
public class ProductBrochureGenerator
{/// <summary>/// 生成产品宣传册/// </summary>/// <param name="products">产品列表</param>/// <param name="templatePath">模板路径</param>/// <param name="outputPath">输出路径</param>public void GenerateBrochure(List<Product> products, string templatePath, string outputPath){try{// 基于模板创建文档using var wordApp = WordFactory.CreateFrom(templatePath);var document = wordApp.ActiveDocument;// 隐藏Word应用程序wordApp.Visibility = WordAppVisibility.Hidden;wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;// 为每个产品添加页面foreach (var product in products){AddProductPage(document, product);}// 保存文档document.SaveAs(outputPath, WdSaveFormat.wdFormatXMLDocument);document.Close();Console.WriteLine($"产品宣传册已生成: {outputPath}");}catch (Exception ex){Console.WriteLine($"生成产品宣传册时发生错误: {ex.Message}");}}/// <summary>/// 添加产品页面/// </summary>/// <param name="document">文档对象</param>/// <param name="product">产品信息</param>private void AddProductPage(IWordDocument document, Product product){// 添加分页符document.AddPageBreak(document.Content.End - 1);// 添加产品名称var titleParagraph = document.AddParagraph(document.Content.End - 1, product.Name);titleParagraph.Range.Font.Name = "微软雅黑";titleParagraph.Range.Font.Size = 24;titleParagraph.Range.Font.Bold = 1;titleParagraph.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;titleParagraph.SpaceAfter = 20;// 添加产品图片if (File.Exists(product.ImagePath)){var range = document.Content;range.Collapse(WdCollapseDirection.wdCollapseEnd);var inlineShape = document.InlineShapes.AddPicture(fileName: product.ImagePath,linkToFile: false,saveWithDocument: true);// 设置图片大小(保持纵横比)inlineShape.LockAspectRatio = true;if (inlineShape.Width > 300){inlineShape.Width = 300;}// 居中对齐图片range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;// 添加空行document.AddParagraph(document.Content.End - 1);}// 添加产品描述var descriptionParagraph = document.AddParagraph(document.Content.End - 1, product.Description);descriptionParagraph.Range.Font.Name = "微软雅黑";descriptionParagraph.Range.Font.Size = 12;descriptionParagraph.SpaceAfter = 15;// 添加产品特性列表AddProductFeatures(document, product.Features);// 添加价格信息var priceParagraph = document.AddParagraph(document.Content.End - 1, $"价格: ¥{product.Price.ToString("N2")}");priceParagraph.Range.Font.Name = "微软雅黑";priceParagraph.Range.Font.Size = 16;priceParagraph.Range.Font.Bold = 1;priceParagraph.Range.Font.Color = WdColor.wdColorRed;priceParagraph.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;}/// <summary>/// 添加产品特性列表/// </summary>/// <param name="document">文档对象</param>/// <param name="features">特性列表</param>private void AddProductFeatures(IWordDocument document, List<string> features){// 添加标题var featuresTitle = document.AddParagraph(document.Content.End - 1, "产品特性:");featuresTitle.Range.Font.Bold = 1;featuresTitle.SpaceAfter = 10;// 添加特性列表foreach (var feature in features){var featureParagraph = document.AddParagraph(document.Content.End - 1, "• " + feature);featureParagraph.Range.Font.Name = "微软雅黑";featureParagraph.Range.Font.Size = 11;featureParagraph.FirstLineIndent = -20; // 负缩进以对齐项目符号featureParagraph.LeftIndent = 20;featureParagraph.SpaceAfter = 5;}// 添加空行document.AddParagraph(document.Content.End - 1);}
}/// <summary>
/// 产品信息模型
/// </summary>
public class Product
{/// <summary>/// 产品名称/// </summary>public string Name { get; set; }/// <summary>/// 产品描述/// </summary>public string Description { get; set; }/// <summary>/// 产品特性列表/// </summary>public List<string> Features { get; set; }/// <summary>/// 产品价格/// </summary>public decimal Price { get; set; }/// <summary>/// 产品图片路径/// </summary>public string ImagePath { get; set; }
}

实战案例:创建员工信息表

现在,让我们通过一个完整的示例来综合运用所学知识,创建一个包含多种结构化元素的员工信息表。

using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Word;
using System;public class EmployeeInfoReportGenerator
{/// <summary>/// 生成员工信息报告/// </summary>public void GenerateEmployeeReport(){try{// 创建新的Word文档using var wordApp = WordFactory.BlankWorkbook();var document = wordApp.ActiveDocument;wordApp.Visibility = WordAppVisibility.Hidden;wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;// 设置文档页面布局document.PageSetup.Orientation = WdOrientation.wdOrientPortrait;document.PageSetup.TopMargin = 72;    // 1英寸 = 72磅document.PageSetup.BottomMargin = 72;document.PageSetup.LeftMargin = 72;document.PageSetup.RightMargin = 72;// 添加标题var titleParagraph = document.AddParagraph(0, "员工信息报告");titleParagraph.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;titleParagraph.Range.Font.Name = "微软雅黑";titleParagraph.Range.Font.Size = 20;titleParagraph.Range.Font.Bold = 1;// 添加空行document.AddParagraph(document.Content.End - 1);// 添加报告日期var dateParagraph = document.AddParagraph(document.Content.End - 1, $"生成日期: {DateTime.Now:yyyy年MM月dd日}");dateParagraph.Alignment = WdParagraphAlignment.wdAlignParagraphRight;dateParagraph.Range.Font.Size = 12;// 添加空行document.AddParagraph(document.Content.End - 1);document.AddParagraph(document.Content.End - 1);// 创建员工信息表格var tableRange = document.Content;tableRange.Collapse(WdCollapseDirection.wdCollapseEnd);var table = document.Tables.Add(tableRange, 6, 5); // 5行数据+1行标题// 设置表格标题行string[] headers = { "员工编号", "姓名", "部门", "职位", "入职日期" };for (int i = 1; i <= headers.Length; i++){var cell = table.Cell(1, i);cell.Range.Text = headers[i - 1];cell.Range.Font.Bold = 1;cell.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;cell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;}// 填充表格数据string[,] employeeData = {{"E001", "张三", "技术部", "高级软件工程师", "2020-03-15"},{"E002", "李四", "市场部", "市场经理", "2019-07-22"},{"E003", "王五", "人事部", "人事专员", "2021-01-10"},{"E004", "赵六", "财务部", "财务主管", "2018-11-05"},{"E005", "钱七", "技术部", "前端开发工程师", "2022-02-28"}};for (int i = 0; i < employeeData.GetLength(0); i++){for (int j = 0; j < employeeData.GetLength(1); j++){var cell = table.Cell(i + 2, j + 1);cell.Range.Text = employeeData[i, j];cell.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;cell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;}}// 设置表格样式table.Borders.Enable = 1;table.Borders.LineStyle = WdLineStyle.wdLineStyleSingle;table.Borders.LineWidth = WdLineWidth.wdLineWidth100pt;table.PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;table.PreferredWidth = 100;// 调整列宽table.Columns[1].PreferredWidth = 15;  // 员工编号列table.Columns[2].PreferredWidth = 20;  // 姓名列table.Columns[3].PreferredWidth = 20;  // 部门列table.Columns[4].PreferredWidth = 25;  // 职位列table.Columns[5].PreferredWidth = 20;  // 入职日期列// 添加总结段落document.AddParagraph(document.Content.End - 1);var summaryParagraph = document.AddParagraph(document.Content.End - 1,$"本报告共包含 {employeeData.GetLength(0)} 名员工的信息。所有数据均为最新更新。");summaryParagraph.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;summaryParagraph.FirstLineIndent = 21; // 首行缩进summaryParagraph.SpaceBefore = 12;summaryParagraph.SpaceAfter = 12;// 插入公司Logo(如果存在)try{if (System.IO.File.Exists(@"C:\Images\company_logo.png")){document.AddParagraph(document.Content.End - 1);var logoRange = document.Content;logoRange.Collapse(WdCollapseDirection.wdCollapseEnd);var logoShape = document.InlineShapes.AddPicture(@"C:\Images\company_logo.png", false, true);logoShape.Width = 120;logoShape.Height = 60;logoRange.InsertAfter("\n");}}catch (Exception ex){Console.WriteLine($"插入Logo时发生错误: {ex.Message}");}// 保存文档string outputPath = $@"C:\Reports\EmployeeReport_{DateTime.Now:yyyyMMdd}.docx";document.SaveAs(outputPath, WdSaveFormat.wdFormatXMLDocument);document.Close();Console.WriteLine($"员工信息报告已生成: {outputPath}");}catch (Exception ex){Console.WriteLine($"生成员工信息报告时发生错误: {ex.Message}");}}
}// 使用示例
class Program
{static void Main(string[] args){var generator = new EmployeeInfoReportGenerator();generator.GenerateEmployeeReport();}
}

总结

本文详细介绍了如何使用MudTools.OfficeInterop.Word库操作Word文档中的结构化元素,包括:

  1. 段落与节操作:学习了如何遍历文档中的所有段落,以及如何使用节为文档的不同部分设置不同的页面布局。

  2. 表格自动化:掌握了创建表格、填充数据、设置样式和边框,以及合并拆分单元格等操作。

  3. 图片与形状插入:了解了内嵌形状和浮动形状的区别,以及如何插入图片并设置其属性。

通过实战案例,我们综合运用了这些知识点,创建了一个完整的员工信息报告。这些技能对于开发文档自动化系统、报告生成工具等应用具有重要意义。

在下一篇文章中,我们将学习Word文档的页面设置与打印控制技巧,包括设置纸张大小、方向、页边距等高级功能,敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

行稳、致远 | 技术驱动下的思考感悟

行稳: 做好当下,结果第一 读书和加入京东以来的这十几年,我感触最深的一个点就是要做好当下。我个人是一个思维比较跳脱,想法算是比较多的人。总是喜欢瞎折腾,喜欢想东想西。有时候有点 “这山望见那山高” 的意思…

在控制台执行这段代码可以列出所有::selection规则

// 在控制台执行这段代码可以列出所有::selection规则 Array.from(document.styleSheets).forEach(sheet => { try { Array.from(sheet.cssRules).forEach(rule => { if(rule.selectorText && rule.sele…

JDK从8升级到21的问题集

一、背景与挑战 1.升级动因 ◦Oracle长期支持策略 ◦现代特性需求:协程、模式匹配、ZGC等 ◦安全性与性能的需求 ◦AI新技术引入的版本要求 2.项目情况 ◦100+项目并行升级的协同作战 ◦多技术栈并存 ◦持续集成体系的…

网站建设公司调查报告wordpress多国语言版本

首先&#xff0c;Kafka无法保证消息的全局有序性&#xff0c;这是因为Kafka的设计中允许多个生产者并行地向同一个主题写入消息。而且&#xff0c;一个主题可能会被划分为多个分区&#xff0c;每个分区都可以在独立的生产者和消费者之间进行并行处理。因此&#xff0c;生产者将…

wordpress游客变用户品牌网站和优化网站

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的ElasticSearch专栏&#xff0c;本篇博客由B战尚硅谷的ElasticSearch视频总结而来&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f306; 内容速览 1 es数据格…

网站色彩搭配方案泰安市高新区建设局网站

前言 当谈到异步编程时&#xff0c;C#中的async/await是一个强大且方便的工具。它使得编写并发和异步操作变得更加简单和可读&#xff0c;同时提供良好的可维护性。本文将详细解释async/await的使用&#xff0c;以及如何在C#中有效地利用它来实现异步操作。 目录 前言1. async…

先做网站装修还是先买虚拟主机wordpress china 中文

任务7:采集这5页中胜点列的数据,找出胜点最高的召唤师,将召唤师姓名填入答案中 此题采集的是胜点列表的数据如下 通过控制台审查元素查看,可以看到是乱码,记得几年前的快手,小红书,抖音也采用了此类反爬措施,html页面显示的是乱码,浏览器能正常显示数据,大概率就是…

科技公司网站案例做 在线观看免费网站

引言 在数据结构和算法的世界里&#xff0c;平衡二叉搜索树&#xff08;Balanced Binary Search Tree, BST&#xff09;是一种非常重要的数据结构。AVL树&#xff08;Adelson-Velsky和Landis发明的树&#xff09;就是平衡二叉搜索树的一种&#xff0c;它通过自平衡来维护其性质…

网站建设是用自己的服务器重庆室内设计

第1周&#xff1a;SQL入门 学习SQL语句的书写语法和规则从零学会SQL&#xff1a;入门​www.zhihu.com 第2周&#xff1a;查询基础 Select查询语句是SQL中最基础也是最重要的语句&#xff0c;这周我们就来利用Select来对表中的数据进行查询。从零学会SQL&#xff1a;简单查询​w…

福建建设局网站无锡市建设银行总行网站

puppeteer 文档:puppeteer.js中文文档|puppeteerjs中文网|puppeteer爬虫教程 Puppeteer本身依赖6.4以上的Node&#xff0c;但是为了异步超级好用的async/await&#xff0c;推荐使用7.6版本以上的Node。另外headless Chrome本身对服务器依赖的库的版本要求比较高&#xff0c;c…

做网站能用本地的数据库嘛商业空间设计案例网站

1月11日&#xff0c;由零售圈主办、20零售连锁协会协办、30零售行业媒体支持的中国零售圈大会暨2024未来零售跨年盛典在西安落下帷幕&#xff0c;在这个零售行业盛典中&#xff0c;第七在线凭借其高精尖产品和卓越的服务质量成功入选&#xff0c;并荣获了“百灵奖 Buylink Awar…

虚拟主机网站建设网站开发文档范文

11服务&#xff1a; 功能&#xff1a;控制MCU进行重启&#xff0c;重启分为硬重启和软重启&#xff0c;11服务一般代表软重启&#xff0c;虽然它里面有个子服务是硬件重启&#xff0c;这里需要注意下&#xff1b;硬重启在日常工作中一般代表B重启。命令格式&#xff08;请求&am…

做网站犯法了 程序员有责任吗江干网站建设

一、背景 近年来由于危险河道管理措施不到位&#xff0c;调峰电站泄水风险长期存在&#xff0c;信息通报制度缺失以及民众安全警觉性不高等因素导致的水电站在泄洪时冲走下游河道游客以及人民财产的事故频发。 二、系统介绍 水电站智能监测泄洪预警系统是一种集成了物联网、云…

超前探展!2025 云栖大会朋友圈晒图必备

2025 云栖大会来了! 从基础设施、大模型到 Agent 和具身智能 全景呈现 AI 技术演进与产业落地 尽在 9.24-9.26 杭州云栖小镇! 2025 云栖大会将持续三天,来自 50 余个国家的 2000 多位演讲嘉宾将齐聚杭州,通过云栖前…

古蔺中国建设银行网站改变网站的域名空间

其实这篇文章不是这里的&#xff0c;只是&#xff0c;后台很傻B地进不了了。也不知道是什么乱七八糟的问题。先写在这里&#xff0c;当做这么久没更新的偷懒好了。&#xff08;而且&#xff0c;挑出来的这些都是精华呢!&#xff09;&#xff0c;大家各取所需吧&#xff1a; 1. …

html5 公司网站盘锦网站推广

611. 有效三角形的个数 给定一个包含非负整数的数组&#xff0c;你的任务是统计其中可以组成三角形三条边的三元组个数。 示例 1: 输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3注意: 数组长度不超过1000。数组里整数的范…

杭州好的做网站公司阿里云申请域名做网站

当提到C的时候&#xff0c;很多人会觉得语法复杂、学习曲线陡峭&#xff0c;并且好像与C语言还有点"纠缠不清"。尽管如此&#xff0c;C仍然是当今世界上最受欢迎和最有影响力的编程语言之一。特别是在当今快速发展的人工智能&#xff08;AI&#xff09;领域&#xff…

衡量网站质量的标准工信部官网查询系统查询手机

微软发布了Entity Framework Core2.1&#xff0c;为EF开发者带来了很多期待已久的特性。EF Core 2.1增加了对SQL GROUP BY的支持&#xff0c;支持延迟加载和数据种子等。EF Core 2.1的第一个重要新增特性是将GroupBy操作符翻译成包含GROUP BY子句的SQL。缺乏这种支持被认为是EF…

织梦响应式茶叶网站模板php网站开发技术

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现方案 📒📝 操作步骤📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 小米设备的广告一直是用户头疼的问题,无论是开屏广告、应用内广告还是系统广告,都影响了用户体验。本文将详细介绍如何通过小米路由器实现去除广告…

凯里建设网站专注WordPress网站建设开发

在buildAdmin的表格中&#xff0c;通过按钮来选中和取消某一行 这种情况&#xff0c;只适合表格行的单选 在elementplus是这样说的 我们所使用的就是这个方法 看一下buildAdmin中的用法 highlight-current-row 是element-plus 中表格的属性 因为 buildadmin 中的table是对 el…