介绍

本指南展示了如何使用 Aspose.Words FOSS 为 .NET 完全通过代码构建原生 Word 图表——这与在 Word 中使用 插入 > 图表 时 Word 本身创建的绘图对象相同。以这种方式添加的图表不是图片;它是嵌入文档 OOXML 包中的 Chart 对象,拥有数据系列模型、坐标轴、图例以及数据表,文件保存后 Word 仍然可以打开并编辑。本文深入探讨该 Chart API:如何创建图表、添加系列数据,以及访问控制渲染方式的坐标轴、图例、数据标签和格式化对象。

该库采用 MIT 许可证,且没有本地依赖。它面向 .NET Standard 2.0,因此本文中的代码可在 .NET Framework 4.6.2+ 和 .NET 6、8、10 上直接运行。可通过 NuGet 安装,或从源码构建——请参见下文的快速入门。此处展示的全部内容都是商业版 Aspose.Words 为 .NET 使用的相同图表引擎;此版本包含完整的图表对象模型,但不包括页面布局或渲染功能,因此图表的页面位置不会被计算,文档也无法导出为 PDF 或图像。


包含内容

创建图表并添加数据系列

DocumentBuilder.InsertChart(chartType, width, height) 在当前位置插入一个图表形状并返回一个 Shape;其 Chart 属性是后续所有操作的入口。新插入的图表已经包含一个默认系列,因此大多数代码会先清除它,然后通过 Chart.Series(一种 ChartSeriesCollection)添加自己的数据。

using Aspose.Words;
using Aspose.Words.Drawing.Charts;

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

Shape shape = builder.InsertChart(ChartType.Line, 432, 252);
Chart chart = shape.Chart;

// Delete default generated series.
chart.Series.Clear();

string[] categories = new string[] { "AW Category 1", "AW Category 2", "AW Category 3" };
chart.Series.Add("AW Series 1", categories, new double[] { 4.3, 2.5, 3.5 });

ChartSeriesCollection.Add 提供了针对类别/数值对(如上所示)、X/Y 数值对、日期系列以及带有额外大小值的气泡系列的重载。在单个 ChartSeries 上,Add(xValue)Add(xValue, yValue)Add(xValue, yValue, bubbleSize) 可追加单个点,Insert 在指定索引处放置一个点,而 Clear() / ClearValues() 则在不一定删除系列对象本身的情况下移除系列数据。

图表类型和系列类型

ChartType — 传递给 InsertChart 的枚举 — 包含约 40 个成员,覆盖标准 Word 图表族:LineBarColumnPieDoughnutRadarScatterStockSurfaceTreemapSunburstHistogramParetoBoxAndWhiskerWaterfallFunnel,以及其中若干的堆叠、百分比堆叠和 3D 变体(Bar3DColumnStackedArea3DPercentStacked 等)。

一个相关但不同的枚举 ChartSeriesType 出现在 ChartSeries.SeriesTypeChartSeriesGroup.SeriesType 上,用于描述单个系列或系列组的类型,而不是整个图表。它拥有与 ChartType 相同的成员,并额外包含两个 — ParetoLineRegionMap — 这两个 ChartType 并未直接公开。ChartSeriesGroup 正是使组合图表成为可能的原因:Chart.SeriesGroups(一个 ChartSeriesGroupCollection)在图表中为每种系列类型保存一个组,每个组都有自己的 AxisX/AxisY 对以及诸如 OverlapGapWidthBubbleScaleDoughnutHoleSize 的布局属性。

坐标轴、网格线和缩放

Chart.AxisXAxisYAxisZ(加上 Axes 集合)返回 ChartAxis 对象。每个坐标轴都有一个 TypeChartAxisType.CategorySeriesValue),刻度标记设置(MajorTickMarkMinorTickMarkCrossInsideOutsideNone),网格线标志(HasMajorGridlinesHasMinorGridlines),以及单位控制(MajorUnitMinorUnit 及其 *IsAuto 对应项)。ChartAxis.Scaling 返回一个 AxisScaling 对象,其 MinimumMaximumAxisBound 值 — AxisBound.IsAuto 报告该界限是否自动计算,而参数化构造函数(AxisBound(value)AxisBound(datetime))则设置明确的数值或日期界限。类别坐标轴可以通过 ChartAxis.CategoryTypeAxisCategoryType.AutomaticCategoryTime)固定到文本或时间类别上,ChartAxis.Title 公开了一个带有自身 TextShowFontChartAxisTitle

图例、数据表和图表标题

Chart.Legend 返回一个 ChartLegend,其 Position(一个由 NoneBottomLeftRightTopTopRight 组成的 LegendPosition)控制它相对于绘图区的渲染位置;LegendEntries 是一个由各个 ChartLegendEntry 对象组成的 ChartLegendEntryCollection,每个对象都有自己的 FontIsHidden 标志,用于在不将系列从图表中移除的情况下隐藏该系列在图例中的显示。Chart.DataTable(一个 ChartDataTable)在设置 Show 时将系列值以网格形式显示在图表下方,并由 HasLegendKeysHasHorizontalBorderHasVerticalBorderHasOutlineBorder 控制其外观。Chart.Title 是一个具有 TextShow 属性的 ChartTitle,遵循与坐标轴标题相同的模式。

数据标签、数据点和标记

ChartSeries.HasDataLabels 打开系列的数据标签,而 ChartSeries.DataLabels(一个 ChartDataLabelCollection)或其单独的 ChartDataLabel 控制每个标签显示的内容:ShowValueShowCategoryNameShowSeriesNameShowPercentageShowLegendKeyShowBubbleSize 是独立的标志,PositionChartDataLabelPosition.CenterInsideEndOutsideEndBestFit 等)将标签相对于其点放置。ChartSeries.DataPoints 通过 ChartDataPoint 提供逐点访问,后者拥有自己的 Marker(一个带有来自 MarkerSymbol 枚举的 SymbolChartMarker 和一个 Size)、Explosion(用于拉出饼图切片)以及 Format。所有可以填充或描边的图表元素——系列、数据点、图例、标题、数据表——都通过其 Format 属性公开一个 ChartFormat,并具有 FillStrokeShapeTypeChartShapeType)属性以及一个用于重置的 SetDefaultFill() 方法。需要注意的一点是:在 ChartFormat 上与主题关联的填充和描边颜色变体(FillableForeThemeColorFillableBackThemeColorStrokeForeThemeColorStrokeBackThemeColor 以及它们的色调/阴影对应项)在此版本中未实现——请改用普通的 Fill/Stroke 颜色,而不是主题颜色引用。Chart.Style(一个如 MutedSaturatedGradientOutlineBlackChartStyle)在一步中为整个图表应用预定义的外观。


快速入门

Aspose.Words FOSS 用于 .NET 可通过 NuGet 获得:

dotnet add package Aspose.Words.FOSS

改为从源码构建:

git clone https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git
cd Aspose.Words-FOSS-for-.NET
dotnet build Aspose.Words.sln -c Release

然后在你的应用程序中添加对 Aspose.Words.csproj 的项目引用。引用添加后,这将创建一个包含一个系列的折线图并将其保存为 DOCX:

using Aspose.Words;
using Aspose.Words.Drawing.Charts;

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

Shape shape = builder.InsertChart(ChartType.Line, 432, 252);
Chart chart = shape.Chart;

// Delete default generated series.
chart.Series.Clear();

string[] categories = new string[] { "AW Category 1", "AW Category 2", "AW Category 3" };
chart.Series.Add("AW Series 1", categories, new double[] { 4.3, 2.5, 3.5 });

doc.Save("chart.docx");
Console.WriteLine("Saved chart.docx");

在 Word 中打开 chart.docx,该图表可完全编辑——右键单击它并选择“Edit Data”即可看到上面写的相同三个类别和数值。


支持的格式

格式扩展名读取写入
DOCX.docx
DOCM.docm
DOTX.dotx
DOTM.dotm
扁平 OPC (所有变体)(各种)
Markdown.md
Text.txt

使用 Chart API 构建的图表是 OOXML 绘图对象,因此它们可以在上述 DOCX 系列格式(DOCX、DOCM、DOTX、DOTM 和 Flat OPC)之间往返。此版本无法导出为 PDF、XPS 或图像,也无法打印,因此没有任何东西会将图表渲染为位图——图表保持为 Word 文件内的实时可编辑对象。此版本中移除的额外格式转换器(DOC、RTF、ODT、HTML、EPUB、MHTML、MOBI、AZW3 和 WordML)与库中其他位置排除的子系统相同,并非针对图表的特定功能。


开源与许可

Aspose.Words FOSS for .NET 在 MIT 许可证下发布,免费用于商业和个人用途,无版税或再分发限制。完整源码,包括本文中引用的图表类,已在 GitHub 的 Aspose.Words FOSS for .NET 仓库 中提供。


快速入门

相关资源