Word 图表自动化:用 C# 批量生成数据可视化文档

季宁
季宁
发布时间:2026-08-24 | 92人浏览过
原创

前言

很多团队做周报、经营分析或项目汇报时,真正耗时间的往往不是算数据,而是反复把数据搬进 Word,再手动调整图表样式和位置。一旦数据频繁更新,或者需要批量生成文档,这套流程就很容易变成重复劳动。本文按“为什么选这套方案、如何快速生成第一个图表、怎样继续做样式和批量扩展”的顺序展开,帮助你判断它是否适合放进自己的报表生成流程。

很多团队做周报、经营分析或项目汇报时,真正耗时间的往往不是算数据,而是反复把数据搬进 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 里生成第一个图表

如果你的目标是先把流程跑通,可以把建图过程拆成四步:创建文档、插入图表、填充数据、保存文件。

展示用 C# 和 Spire.Doc 在 Word 中生成图表的四步流程信息图
Word 图表自动生成四步流程把 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 枚举值描述
Column3DClustered3D簇状柱形图
ColumnStacked堆积柱形图
Line折线图
LineStacked堆积折线图
Pie饼图
BarStacked堆积条形图
Area面积图
Scatter散点图
Bubble气泡图
Doughnut圆环图
Radar雷达图
Stock股票图

更多图表类型可以参考:Spire.Doc for .NET ChartType API 参考。

如何控制图表样式和展示细节

实际项目里,图表能不能生成只是第一步,是否便于阅读、是否符合报告规范,通常取决于标题、坐标轴、图例、数据标签和布局这些细节。

展示 Spire.Doc 图表样式控制项的结构化信息图
图表样式控制的四个重点图表可读性主要取决于标题、坐标轴、图例和布局四类设置,这些项也是自动化报告里最常调整的部分。

图表标题设置

通过 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 文档生成接入后端服务的团队,它是一条比较实用的实现路径。

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表