学习C#调用OpenXml操作word文档的基本用法(35:学习图形类-5)

  使用图形类Drawing不仅可以将图片保存到word文档,还能将图表、表格等数据保存到word文档,关键就在于其子类型GraphicData支持关联多种类型的图形数据,本文记录以嵌入式布局方式向word中插入图表的基本用法。

  主要代码如下所示:

csharp 复制代码
using A = DocumentFormat.OpenXml.Drawing;
using C=DocumentFormat.OpenXml.Drawing.Charts;
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;

if(cbInsertChart.Checked)
{
    ChartPart chartPart = mainPart.AddNewPart<ChartPart>();
    string chartPartId = mainPart.GetIdOfPart(chartPart);

    Drawing drawing = CreateChartDrawing(chartPartId, chartPart);
    run.Append(drawing);
}

public Drawing CreateChartDrawing(string relationshipId, ChartPart chartPart)
{
    var chartSpace = new C.ChartSpace();
    chartSpace.AddNamespaceDeclaration("c", "http://schemas.openxmlformats.org/drawingml/2006/chart");
    chartSpace.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
    chartSpace.AppendChild(new C.EditingLanguage { Val = "zh-CN" });

    var chart = new C.Chart();
    chart.AppendChild(new C.AutoTitleDeleted { Val = true });

    var plotArea = new C.PlotArea();

    var barChart = new C.BarChart(
        new C.BarDirection { Val = C.BarDirectionValues.Column },
        new C.BarGrouping { Val = C.BarGroupingValues.Clustered },
        new C.VaryColors { Val = true }
    );

    var series = new C.BarChartSeries(
        new C.Index { Val = 0 },
        new C.Order { Val = 0 },
        new C.SeriesText(new C.NumericValue("测试数据"))
    );

    series.AppendChild(new C.CategoryAxisData(
        new C.StringLiteral(
            new C.PointCount { Val = 4 },
            new C.StringPoint { Index = 0, NumericValue = new C.NumericValue("A") },
            new C.StringPoint { Index = 1, NumericValue = new C.NumericValue("B") },
            new C.StringPoint { Index = 2, NumericValue = new C.NumericValue("C") },
            new C.StringPoint { Index = 3, NumericValue = new C.NumericValue("D") }
        )
    ));

    series.AppendChild(new C.Values(
        new C.NumberLiteral(
            new C.PointCount { Val = 4 },
            new C.NumericPoint { Index = 0, NumericValue = new C.NumericValue("10") },
            new C.NumericPoint { Index = 1, NumericValue = new C.NumericValue("20") },
            new C.NumericPoint { Index = 2, NumericValue = new C.NumericValue("30") },
            new C.NumericPoint { Index = 3, NumericValue = new C.NumericValue("40") }
        )
    ));

    barChart.AppendChild(series);

    // 坐标轴
    var catAxis = new C.CategoryAxis(
        new C.AxisId { Val = 100 },
        new C.Scaling(new C.Orientation { Val = C.OrientationValues.MinMax }),
        new C.AxisPosition { Val = C.AxisPositionValues.Bottom },
        new C.CrossingAxis { Val = 200 },
        new C.Crosses { Val = C.CrossesValues.AutoZero },
        new C.TickLabelPosition { Val = C.TickLabelPositionValues.NextTo }
    );

    var valAxis = new C.ValueAxis(
        new C.AxisId { Val = 200 },
        new C.Scaling(new C.Orientation { Val = C.OrientationValues.MinMax }),
        new C.AxisPosition { Val = C.AxisPositionValues.Left },
        new C.CrossingAxis { Val = 100 },
        new C.Crosses { Val = C.CrossesValues.AutoZero },
        new C.TickLabelPosition { Val = C.TickLabelPositionValues.NextTo },
        new C.MajorTickMark { Val = C.TickMarkValues.None },
        new C.MinorTickMark { Val = C.TickMarkValues.None }
    );

    // 让BarChart引用坐标轴ID
    barChart.AppendChild(new C.AxisId { Val = 100 });
    barChart.AppendChild(new C.AxisId { Val = 200 });

    plotArea.Append(barChart, catAxis, valAxis);
    chart.Append(plotArea);

    chartSpace.AppendChild(chart);
    chartSpace.Save(chartPart);

    return new Drawing(
        new DW.Inline(
            new DW.Extent { Cx = 6000000, Cy = 4000000 },
            new DW.EffectExtent { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L },
            new DW.DocProperties { Id = 1, Name = "Chart 1" },
            new DW.NonVisualGraphicFrameDrawingProperties(
                new A.GraphicFrameLocks { NoChangeAspect = true }
            ),
            new A.Graphic(
                new A.GraphicData(
                    new C.ChartReference { Id = relationshipId }
                )
                { Uri = "http://schemas.openxmlformats.org/drawingml/2006/chart" }
            )
        )
    );
}

  下面的截图是程序运行效果及word文档的内容截图。

参考文献

1https://github.com/dotnet/Open-XML-SDK

2https://learn.microsoft.com/zh-cn/office/open-xml/open-xml-sdk

3https://learn.microsoft.com/zh-cn/dotnet/api/documentformat.openxml.wordprocessing.style?view=openxml-3.0.1

4https://blog.csdn.net/i042416/article/details/126228816

相关推荐
信可维6 小时前
AI 读 Word 表格总读错?先查合并单元格和表头这 3 处
开发语言·人工智能·c#·word·软件工程
andrsted11 小时前
练题簿在线免费刷题:将资料、Word 和 PDF导入小程序练习
学习·微信小程序·小程序·pdf·word·学习方法
ProcessOn官方账号12 小时前
ProcessOn Office 插件上线:在 Word / Excel / PPT 里直接画流程图
word·excel·插件·office·processon
2501_930707784 天前
使用C#代码在 Word 文档中添加、插入或删除页面
开发语言·c#·word
weixin_416660075 天前
AI 生成的 Mermaid 流程图和 LaTeX 公式,怎么一起导出到 Word?
人工智能·word·流程图·豆包
asdzx675 天前
使用 Python 按页或节拆分 Word 文档
python·word
死磕音视频5 天前
Microsoft Copilot 办公入门:在 Word、Excel、PowerPoint 里用 AI 完成日常文档工作
word·excel·copilot·办公效率
2501_930707785 天前
如何使用C#代码合并Word文档
word
芦芭荞6 天前
QT使用xml模版生成word文档
xml·qt·word
Am-Chestnuts6 天前
DeepSeek写教案怎么导出Word?完整步骤
ai·word