很多团队做周报、经营分析或项目汇报时,真正耗时间的往往不是算数据,而是反复把数据搬进 Word,再手动调整图表样式和位置。一旦数据频繁更新,或者需要批量生成文档,这套流程就很容易变成重复劳动。本文按“为什么选这套方案、如何快速生成第一个图表、怎样继续做样式和批量扩展”的顺序展开,帮助你判断它是否适合放进自己的报表生成流程。
为什么用 C# 做 Word 图表自动化
Word 文档中的图表,本质上是报告里的数据可视化部件。常见类型包括柱状图、折线图、饼图、散点图等,不同图表适合不同场景:柱状图适合做类别对比,折线图适合看趋势,饼图适合展示占比。
如果直接用原生方式在 C# 中操作 Word,通常要依赖 Microsoft Office PIA(Primary Interop Assemblies)。这种方案的问题在于,开发环境和部署环境往往都要安装 Office,在无头服务、服务器端任务或云端部署场景里并不友好,配置和维护成本也更高。
这也是第三方文档库存在的意义。本文使用的 Spire.Doc for .NET,可以在不安装 Microsoft Office 的情况下,完成 Word 文档的创建、修改、转换和打印,也包括图表对象的自动生成。对于需要批量出报告、按模板生成文档的项目,这类方案通常更容易落地。
先安装 Spire.Doc for .NET
在 C# 项目中,可以先通过 NuGet 安装依赖:
// 通过NuGet包管理器安装 Spire.Doc
// Install-Package Spire.Doc
用 C# 在 Word 里生成第一个图表
如果你的目标是先把流程跑通,可以把建图过程拆成四步:创建文档、插入图表、填充数据、保存文件。

第 1 步:创建或加载 Word 文档
先创建一个文档对象,再添加节和段落,后续图表会插入到段落中。
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using Spire.Doc.Fields.Shapes.Charts; // 注意:Chart相关的类在此命名空间下
// 创建一个新的Word文档
Document document = new Document();
// 添加一个节
Section section = document.AddSection();
// 添加一个段落
Paragraph paragraph = section.AddParagraph();
第 2 步:把图表插入段落
通过 paragraph.AppendChart() 可以直接创建图表对象。这里示例使用的是 3D 簇状柱形图,尺寸为 500 × 300。
// 添加一个柱状图,宽度500,高度300
ShapeObject shape = paragraph.AppendChart(ChartType.Column3DClustered, 500, 300);
Chart chart = shape.Chart;
第 3 步:准备类别和系列数据
图表数据一般由类别标签和一个或多个系列组成。下面这组示例数据,使用了 4 个产品类别,以及“销售额 2023”“销售额 2024”两组数值。
// 清除默认的系列数据
chart.Series.Clear();
// 准备数据
string[] categories = { "产品A", "产品B", "产品C", "产品D" };
double[] series1Data = { 20, 35, 15, 40 };
double[] series2Data = { 25, 30, 20, 45 };
// 添加第一个系列
ChartSeries series1 = chart.Series.Add("销售额 2023", categories, series1Data);
// 添加第二个系列
ChartSeries series2 = chart.Series.Add("销售额 2024", categories, series2Data);
第 4 步:保存为 Word 文件
完成数据填充后,直接保存为 .docx 即可。
// 保存文档
document.SaveToFile("Word_Chart_Example.docx", FileFormat.Docx);
完整 3D 柱状图示例
如果你想一次性看完整流程,下面这段代码可以直接对应一个可运行的基础示例。原文中的方法名存在空格断裂,这里按实际可用写法整理为 SaveToFile。
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using Spire.Doc.Fields.Shapes.Charts;
class Program
{
static void Main(string[] args)
{
// 创建一个新的Word文档
Document document = new Document();
Section section = document.AddSection();
Paragraph paragraph = section.AddParagraph();
// 添加一个柱状图,宽度500,高度300
ShapeObject shape = paragraph.AppendChart(ChartType.Column3DClustered, 500, 300);
Chart chart = shape.Chart;
// 清除默认的系列数据
chart.Series.Clear();
// 准备数据
string[] categories = { "产品A", "产品B", "产品C", "产品D" };
double[] series1Data = { 80, 55, 70, 95 }; // 2023年数据
double[] series2Data = { 75, 60, 85, 100 }; // 2024年数据
// 添加第一个系列
ChartSeries series1 = chart.Series.Add("销售额 2023", categories, series1Data);
// 添加第二个系列
ChartSeries series2 = chart.Series.Add("销售额 2024", categories, series2Data);
// 设置图表标题
chart.Title.Text = "年度产品销售额对比";
chart.Title.Show = true;
chart.Title.CharacterFormat.FontSize = 14;
chart.Title.CharacterFormat.Bold = true;
// 设置X轴标题
chart.AxisX.Title.Text = "产品类型";
chart.AxisX.Title.Show = true;
// 设置Y轴标题
chart.AxisY.Title.Text = "销售额 (万元)";
chart.AxisY.Title.Show = true;
// 显示图例
chart.Legend.Show = true;
chart.Legend.Position = LegendPosition.Right;
// 保存文档
document.SaveToFile("Word_Chart_Column3DClustered.docx", FileFormat.Docx);
}
}
可用图表类型有哪些
跑通基础示例后,接下来要考虑的是图表类型是否覆盖自己的业务场景。Spire.Doc for .NET 支持的 ChartType 枚举值很多,下面列出原文中提到的一部分:
ChartType 枚举值 | 描述 |
|---|---|
Column3DClustered | 3D簇状柱形图 |
ColumnStacked | 堆积柱形图 |
Line | 折线图 |
LineStacked | 堆积折线图 |
Pie | 饼图 |
BarStacked | 堆积条形图 |
Area | 面积图 |
Scatter | 散点图 |
Bubble | 气泡图 |
Doughnut | 圆环图 |
Radar | 雷达图 |
Stock | 股票图 |
更多图表类型可以参考:Spire.Doc for .NET ChartType API 参考。
如何控制图表样式和展示细节
实际项目里,图表能不能生成只是第一步,是否便于阅读、是否符合报告规范,通常取决于标题、坐标轴、图例、数据标签和布局这些细节。

图表标题设置
通过 chart.Title 可以设置标题文本、是否显示、是否覆盖图表区域,以及字体样式。
chart.Title.Text = "2024年第一季度销售数据"; // 设置标题文本
chart.Title.Show = true; // 显示标题
chart.Title.Overlay = false; // 标题不覆盖图表区域
chart.Title.CharacterFormat.FontSize = 16; // 字体大小
chart.Title.CharacterFormat.Bold = true; // 加粗
chart.Title.CharacterFormat.TextColor = Color.DarkBlue; // 颜色
坐标轴与数据标签设置
X 轴和 Y 轴可以分别设置标题;如果想让读者直接看到数值,还可以给每个系列打开数据标签。
// 设置X轴标题
chart.AxisX.Title.Text = "月份";
chart.AxisX.Title.Show = true;
chart.AxisX.Title.GetCharacterFormat().FontSize = 10;
// 设置Y轴标题
chart.AxisY.Title.Text = "销售额 (万元)";
chart.AxisY.Title.Show = true;
chart.AxisY.HasMajorGridlines = true; // 显示主要网格线
// 为每个系列添加数据标签
foreach (ChartSeries series in chart.Series)
{
series.HasDataLabels = true;
series.DataLabels.ShowValue = true; // 显示数据值
series.DataLabels.ShowCategoryName = false; // 不显示类别名称
series.DataLabels.CharacterFormat.Position = 10f; // 标签位置
series.DataLabels.CharacterFormat.FontSize = 8;
}
图例设置
当图表中有多个系列时,图例几乎是必需的。可以控制其是否显示、放在什么位置,以及是否遮挡图表区域。
chart.Legend.Show = true; // 显示图例
chart.Legend.Position = LegendPosition.Bottom; // 图例位于底部
chart.Legend.Overlay = false; // 图例不覆盖图表区域
chart.Legend.CharacterFormat.FontSize = 9;
图表位置与尺寸
图表对象本身属于 ShapeObject,因此除了在 AppendChart() 时指定尺寸,也可以继续设置页面中的绝对位置。
// 设置图表在页面上的绝对位置
shape.VerticalPosition = 100; // 距离页面顶部100磅
shape.HorizontalPosition = 50; // 距离页面左侧50磅
// 也可以在AppendChart时指定宽度和高度,或后续修改
// shape.Width = 600;
// shape.Height = 400;
如何生成动态数据和多图表报告
当需求从“做一个图”升级到“按数据自动出整份报告”时,重点就不再只是 API 会不会调用,而是数据来源能不能接上、同一份文档里能不能容纳多种图表。

把外部数据接入图表
Spire.Doc for .NET 可以与数据库结果、CSV 文件、JSON 数据等结构化数据配合使用。原文给出了一个从 CSV 读取类别和数值,再写入图表系列的示意:
// 伪代码示例:从CSV文件读取数据
/*
string csvFilePath = "data.csv";
List<string[]> csvData = new List<string[]>();
using (StreamReader sr = new StreamReader(csvFilePath))
{
string line;
while ((line = sr.ReadLine()) != null)
{
csvData.Add(line.Split(','));
}
}
// 假设CSV第一行是标题,第二行开始是数据
string[] categoriesFromCsv = new string[csvData.Count - 1];
double[] valuesFromCsv = new double[csvData.Count - 1];
for (int i = 1; i < csvData.Count; i++)
{
categoriesFromCsv[i - 1] = csvData[i][0]; // 第一列作为类别
valuesFromCsv[i - 1] = double.Parse(csvData[i][1]); // 第二列作为数值
}
// 然后将这些数据填充到图表系列中
ChartSeries dynamicSeries = chart.Series.Add("动态数据", categoriesFromCsv, valuesFromCsv);
*/
这一段的意义不在于 CSV 本身,而在于说明图表数据并不需要写死在代码里。只要能整理成“类别数组 + 数值数组”,就可以接到图表对象上。
在同一份 Word 文档中插入多个图表
如果一份报告同时需要趋势图、结构图和对比图,可以在同一个文档里多次调用 AppendChart()。每个图表可以放在独立段落中,便于控制版式。
// 添加第一个图表 (3D柱状图)
ShapeObject chartShape1 = section.AddParagraph().AppendChart(ChartType.Column3DClustered, 500, 300);
Chart chart1 = chartShape1.Chart;
// ... (为chart1设置数据和格式) ...
// 添加第二个图表 (饼图)
ShapeObject chartShape2 = section.AddParagraph().AppendChart(ChartType.Pie, 400, 300);
Chart chart2 = chartShape2.Chart;
// ... (为chart2设置数据和格式) ...
这种方式比较适合月报、经营简报、项目复盘等文档:数据更新后重新运行程序,就能批量生成包含多图表的 Word 报告,而不需要人工逐页处理。
这套方案适合哪些场景
如果你的工作流里已经存在大量 Word 报告,并且这些报告的数据来源稳定、模板相对固定,那么用 C# 配合 Spire.Doc for .NET 自动生成图表,通常能明显减少重复编辑工作。它的核心价值有三点:一是避免依赖本地 Office 安装,二是把图表生成纳入程序流程,三是让数据更新和文档输出形成可重复执行的链路。
从本文示例看,这套方案已经覆盖了基础建图、样式控制、动态数据接入和多图表文档输出几个关键环节。对于需要批量出报告、强调一致性、并希望把 Word 文档生成接入后端服务的团队,它是一条比较实用的实现路径。













