C#使用Office Interop生成Word文档详细指南

Ruby
Ruby
发布时间:2026-10-14 | 6人浏览过
原创

本文通过具体代码实例,详解了如何在C#项目中利用Office Interop组件自动生成Word文档。内容涵盖文档初始化、段落格式化、动态表格构建、分页控制及图表插入等关键步骤,并对比了直接生成与基于模板生成的不同策略,为开发者提供完整的操作参考。

初始化Word环境与创建文档

在C#中操作Word文档,首先需要引用Microsoft.Office.Interop.Word库。为了便于调试和观察结果,通常会将Visible属性设置为true。初始化过程主要涉及创建Application对象和Document对象,其中许多参数使用Missing.Value作为占位符以适应COM接口的要求。

private void button1_Click(object sender, System.EventArgs e)
{
    object oMissing = System.Reflection.Missing.Value;
    object oEndOfDoc = "\\endofdoc";

    // \endofdoc是预定义的bookmark

    // 创建一个document.
    Word._Application oWord;
    Word._Document oDoc;
    oWord = new Word.Application();
    oWord.Visible = true;
    oDoc = oWord.Documents.Add(ref oMissing, ref oMissing,
        ref oMissing, ref oMissing);
}

添加段落与文本格式化

文档内容的构建主要通过添加Paragraph对象来实现。可以通过设置Range.Text填充文本,并利用Font.Bold控制加粗,Format.SpaceAfter调整段后间距。以下示例演示了如何添加标题和普通文本段落:

// 在document的开始部分添加一个paragraph.
Word.Paragraph oPara1;
oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing);
oPara1.Range.Text = "Heading 1";
oPara1.Range.Font.Bold = 1;
oPara1.Format.SpaceAfter = 24;    //24 pt spacing after paragraph.
oPara1.Range.InsertParagraphAfter();

// 在当前document的最后添加一个paragraph
Word.Paragraph oPara2;
object oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
oPara2 = oDoc.Content.Paragraphs.Add(ref oRng);
oPara2.Range.Text = "Heading 2";
oPara2.Format.SpaceAfter = 6;
oPara2.Range.InsertParagraphAfter();

插入动态表格与样式设置

表格是Word文档中常见的元素。使用Tables.Add方法可以在指定位置插入表格,并通过循环填充单元格数据。此外,可以单独设置表头样式(如加粗、斜体)或调整列宽。

// 添加一个3行5列的表格,填充数据,并且设定第一行的样式
Word.Table oTable;
Word.Range wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
oTable = oDoc.Tables.Add(wrdRng, 3, 5, ref oMissing, ref oMissing);
oTable.Range.ParagraphFormat.SpaceAfter = 6;
int r, c;
string strText;
for(r = 1; r <= 3; r++)
    for(c = 1; c <= 5; c++)
    {
        strText = "r" + r + "c" + c;
        oTable.Cell(r, c).Range.Text = strText;
    }
oTable.Rows[1].Range.Font.Bold = 1;
oTable.Rows[1].Range.Font.Italic = 1;

对于另一个5行2列表格,还可以动态调整列宽:

wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
oTable = oDoc.Tables.Add(wrdRng, 5, 2, ref oMissing, ref oMissing);
// ... 填充数据 ...
oTable.Columns[1].Width = oWord.InchesToPoints(2); 
oTable.Columns[2].Width = oWord.InchesToPoints(3); 

处理分页与插入图表

当文档内容较长时,可能需要根据内容长度自动插入分页符。可以通过获取垂直位置信息来判断是否达到阈值,进而插入分页符。此外,还可以嵌入OLE对象(如Excel图表):

// Keep inserting text. When you get to 7 inches from top of the document, insert a hard page break.
object oPos;
double dPos = oWord.InchesToPoints(7);
oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range.InsertParagraphAfter();
do {
    wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    wrdRng.ParagraphFormat.SpaceAfter = 6;
    wrdRng.InsertAfter("A line of text");
    wrdRng.InsertParagraphAfter();
    oPos = wrdRng.get_Information(Word.WdInformation.wdVerticalPositionRelativeToPage);
} while(dPos >= Convert.ToDouble(oPos));

object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
object oPageBreak = Word.WdBreakType.wdPageBreak;
wrdRng.Collapse(ref oCollapseEnd);
wrdRng.InsertBreak(ref oPageBreak);
wrdRng.Collapse(ref oCollapseEnd);
wrdRng.InsertAfter("We're now on page 2. Here's my chart:");

// 添加一个chart (MSGraph.Chart.8)  
object oClassType = "MSGraph.Chart.8";
wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
object oShape = wrdRng.InlineShapes.AddOLEObject(ref oClassType, ref oMissing, 
    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

// 修改图表类型为折线图
object oChart = oShape.OLEFormat.Object;
object[] Parameters = new Object[1];
Parameters[0] = 4; // xlLine = 4
oChart.GetType().InvokeMember("ChartType", BindingFlags.SetProperty, null, oChart, Parameters); 

// 更新并退出图表应用
object oChartApp = oChart.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, oChart, null);
oChartApp.GetType().InvokeMember("Update", BindingFlags.InvokeMethod, null, oChartApp, null);
oChartApp.GetType().InvokeMember("Quit", BindingFlags.InvokeMethod, null, oChartApp, null); 

// 设置图表尺寸
oShape.Width = oWord.InchesToPoints(6.25f);
oShape.Height = oWord.InchesToPoints(3.57f);

使用模板生成标准化文档

如果生成的文档需要保持统一的格式和布局,使用预设的.dot或.dotx模板文件是更高效的选择。这能减少对单个对象格式的逐一定义,并提供更精确的控制。

  • 加载模板:通过Documents.Add方法的第一个参数指定模板路径。
  • 替换书签:在模板中预先定义书签(Bookmark),代码中可通过书签名称定位并替换文本。
  • 应用样式:可以直接调用模板中预定义的Style名称进行应用。
// 加载模板
object oTemplate = "c:\\MyTemplate.dot";
oDoc = oWord.Documents.Add(ref oTemplate, ref oMissing, ref oMissing, ref oMissing);

// 替换书签文本
object oBookMark = "MyBookmark";
oDoc.Bookmarks.Item(ref oBookMark).Range.Text = "Some Text Here";

// 应用预设样式
object oStyleName = "MyStyle";
oDoc.Bookmarks.Item(ref oBookMark).Range.set_Style(ref oStyleName); 
// 或者作用于Selection
// oWord.Selection.set_Style(ref oStyleName); 

核心在于理解Word Application的对象模型框架。无论是从头创建还是基于模板,遵循对象包含关系(Application → Document → Content/Bookmarks → Paragraph/Table)即可有序地进行开发。需要注意的是,处理嵌套表格或使用特定字体、样式时需额外小心,以确保兼容性。

以上就是使用C#通过Office Interop生成Word文档的详细内容,更多关于C#办公自动化开发的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表