C# OpenXML 在 Word 文档中嵌入电子表格图表

excelwordXML

1个回答

写回答

zyJiee

2025-07-06 15:00

+ 关注

XML
XML

使用C# OpenXML在word文档中嵌入电子表格图表

在C#开发中,我们经常需要将数据以图表的形式展示在word文档中。使用OpenXML库可以很方便地在word文档中嵌入电子表格图表。本文将介绍如何使用C# OpenXML来实现这一功能,并提供相应的案例代码。

准备工作

在开始之前,我们需要先安装OpenXML SDK库。可以在NuGet包管理器中搜索并安装“DocumentFormat.OpenXML”库。

步骤一:创建word文档

首先,我们需要创建一个新的word文档。可以使用以下代码创建一个空白的word文档。

csharp

using DocumentFormat.OpenXML.Packaging;

using DocumentFormat.OpenXML.wordprocessing;

public void CreatewordDocument(string filePath)

{

using (var document = wordprocessingDocument.Create(filePath, wordprocessingDocumentType.Document))

{

var mAInPart = document.AddMAInDocumentPart();

mAInPart.Document = new Document();

mAInPart.Document.AppendChild(new Body());

mAInPart.Document.Save();

}

}

以上代码创建了一个新的word文档,并保存在指定的文件路径。

步骤二:插入电子表格

接下来,我们需要在word文档中插入一个电子表格。可以使用以下代码在指定位置插入一个空白的表格。

csharp

public void InsertTable(string filePath, int rowIndex, int columnIndex)

{

using (var document = wordprocessingDocument.Open(filePath, true))

{

var body = document.MAInDocumentPart.Document.Body;

var table = new Table();

var tableProperties = new TableProperties(

new TableBorders(

new TopBorder { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 1 },

new BottomBorder { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 1 },

new LeftBorder { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 1 },

new RightBorder { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 1 },

new InsideHorizontalBorder { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 1 },

new InsideVerticalBorder { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 1 }

)

);

table.AppendChild(tableProperties);

var row = new TableRow();

var cell = new TableCell();

cell.Append(new Paragraph(new Run(new Text("示例表格"))));

row.Append(cell);

table.Append(row);

body.InsertAt(table, rowIndex);

document.MAInDocumentPart.Document.Save();

}

}

以上代码在指定的行和列位置插入一个带有标题的表格。

步骤三:插入图表

最后,我们需要在表格中插入一个图表。可以使用以下代码在表格中插入一个柱状图。

csharp

public void InsertChart(string filePath, int rowIndex, int columnIndex)

{

using (var document = wordprocessingDocument.Open(filePath, true))

{

var body = document.MAInDocumentPart.Document.Body;

var chartPart = document.MAInDocumentPart.AddNewPart<ChartPart>();

chartPart.ChartSpace = new ChartSpace();

chartPart.ChartSpace.AppendChild(new EditingLanguage { Val = "en-US" });

var chart = chartPart.ChartSpace.AppendChild(new Chart());

var plotArea = chart.AppendChild(new PlotArea());

var barChart = plotArea.AppendChild(new BarChart());

var barChartSeries = barChart.AppendChild(new BarChartSeries());

var values = barChartSeries.AppendChild(new Values());

values.AppendChild(new NumberReference(new NumberingCache(new FormatCode("General")) { Append(new CachedNumberValue("100")) }));

var barChartCategoryAxis = barChart.AppendChild(new CategoryAxis(new AxisId { Val = new UInt32Value(48650112u) }, new Scaling(new Orientation { Val = new EnumValue<DocumentFormat.OpenXML.Drawing.Charts.OrientationValues>(DocumentFormat.OpenXML.Drawing.Charts.OrientationValues.MinMax) }), new AxisPosition { Val = new EnumValue<DocumentFormat.OpenXML.Drawing.Charts.AxisPositionValues>(DocumentFormat.OpenXML.Drawing.Charts.AxisPositionValues.Bottom) }, new TickLabelPosition { Val = new EnumValue<DocumentFormat.OpenXML.Drawing.Charts.TickLabelPositionValues>(DocumentFormat.OpenXML.Drawing.Charts.TickLabelPositionValues.NextTo) }, new CrossingAxis { Val = new UInt32Value(48650112u) }, new Crosses { Val = new EnumValue<DocumentFormat.OpenXML.Drawing.Charts.CrossesValues>(DocumentFormat.OpenXML.Drawing.Charts.CrossesValues.AutoZero) }, new AutoLabeled { Val = new BooleanValue(true) }, new LabelAlignment(new Alignment { Val = new EnumValue<DocumentFormat.OpenXML.Drawing.Charts.LabelAlignmentValues>(DocumentFormat.OpenXML.Drawing.Charts.LabelAlignmentValues.Center) }), new LabelOffset(new Offset { Val = 100u }), new Title(new Layout(new ManualLayout(new Left { Val = 0.5 }, new Top { Val = 0.5 }, new Width { Val = 2.0 }, new Height { Val = 2.0 })), new Overlay { Val = false }, new ChartText(new RichText(new Paragraph(new Run(new Text("示例图表"))))))));

var barChartValueAxis = barChart.AppendChild(new ValueAxis(new AxisId { Val = new UInt32Value(48672768u) }, new Scaling(new Orientation { Val = new EnumValue<DocumentFormat.OpenXML.Drawing.Charts.OrientationValues>(DocumentFormat.OpenXML.Drawing.Charts.OrientationValues.MinMax) }), new AxisPosition { Val = new EnumValue<DocumentFormat.OpenXML.Drawing.Charts.AxisPositionValues>(DocumentFormat.OpenXML.Drawing.Charts.AxisPositionValues.Left) }, new MajorGridlines(), new DocumentFormat.OpenXML.Drawing.Charts.NumberingFormat { FormatCode = "General", SourceLinked = true }, new TickLabelPosition { Val = new EnumValue<DocumentFormat.OpenXML.Drawing.Charts.TickLabelPositionValues>(DocumentFormat.OpenXML.Drawing.Charts.TickLabelPositionValues.NextTo) }, new CrossingAxis { Val = new UInt32Value(48650112u) }, new Crosses { Val = new EnumValue<DocumentFormat.OpenXML.Drawing.Charts.CrossesValues>(DocumentFormat.OpenXML.Drawing.Charts.CrossesValues.AutoZero) }, new CrossBetween { Val = new EnumValue<DocumentFormat.OpenXML.Drawing.Charts.CrossBetweenValues>(DocumentFormat.OpenXML.Drawing.Charts.CrossBetweenValues.Between) }));

barChart.Append(new AxisId { Val = new UInt32Value(48650112u) });

barChart.Append(new AxisId { Val = new UInt32Value(48672768u) });

chartPart.ChartSpace.Save();

var chartReference = new Drawing(new Inline(new Extent { Cx = 990000L, Cy = 792000L }, new DocProperties { Id = "1", Name = "Chart 1" }, new Graphic(new GraphicData(new DocumentFormat.OpenXML.Drawing.Charts.ChartReference { Id = document.MAInDocumentPart.GetIdOfPart(chartPart) }) { Uri = "http://schemas.openXMLformats.org/drawingml/2006/chart" }) { Uri = "http://schemas.openXMLformats.org/drawingml/2006/mAIn" })) { DistanceFromTop = 0u, DistanceFromBottom = 0u, DistanceFromLeft = 0u, DistanceFromRight = 0u });

var cell = body.Elements<Table>().ElementAt(rowIndex).Elements<TableRow>().ElementAt(columnIndex).Elements<TableCell>().First();

cell.RemoveAllChildren();

cell.Append(chartReference);

document.MAInDocumentPart.Document.Save();

}

}

以上代码在指定的行和列位置插入一个柱状图。

通过使用C# OpenXML库,我们可以很方便地在word文档中嵌入电子表格图表。本文介绍了如何使用C# OpenXML来实现这一功能,并提供了相应的案例代码。希望本文对您在C#开发中嵌入电子表格图表有所帮助。

参考链接:

- [OpenXML SDK库](XML/">https://www.nuget.org/packages/DocumentFormat.OpenXML/)

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号