利用openxml在Excel中插入图表
Posted kingline
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用openxml在Excel中插入图表相关的知识,希望对你有一定的参考价值。
1 using System.Collections.Generic; 2 using System.Linq; 3 using DOD = DocumentFormat.OpenXml.Drawing; 4 using DODC = DocumentFormat.OpenXml.Drawing.Charts; 5 using DODS = DocumentFormat.OpenXml.Drawing.Spreadsheet; 6 using DOS = DocumentFormat.OpenXml.Spreadsheet; 7 using DOX = DocumentFormat.OpenXml; 8 using pkg = DocumentFormat.OpenXml.Packaging; 9 10 namespace InsertChartTest 11 { 12 class Program 13 { 14 const string fileName = @"C:UsersAdministratorsource eposOpenXMLStudyOpenXMLStudySum100.xlsx"; 15 16 static void Main(string[] args) 17 { 18 string worksheetName = "Joe"; 19 string title = "New Chart"; 20 Dictionary<string, int> data = new Dictionary<string, int>(); 21 data.Add("abc", 1); 22 data.Add("dsa", 2); 23 InsertChartInSpreadsheet(fileName, worksheetName, title, data); 24 25 } 26 27 private static void InsertChartInSpreadsheet(string docName, string worksheetName, string title, 28 Dictionary<string, int> data) 29 { 30 using (pkg.SpreadsheetDocument document = pkg.SpreadsheetDocument.Open(docName, true)) 31 { 32 IEnumerable<DOS.Sheet> sheets = document.WorkbookPart.Workbook.Descendants<DOS.Sheet>(); 33 34 if (sheets == null || sheets.Count() <= 0) 35 return; 36 37 pkg.WorksheetPart worksheetPart = (pkg.WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id); 38 39 System.Diagnostics.Debug.WriteLine("SheetID:{0}", sheets.First().Id); 40 41 // DOS.Worksheet worksheet = worksheetPart.Worksheet; 42 pkg.DrawingsPart drawingsPart = worksheetPart.AddNewPart<pkg.DrawingsPart>(); 43 44 worksheetPart.Worksheet.Append(new DOS.Drawing() 45 { 46 Id = worksheetPart.GetIdOfPart(drawingsPart) 47 }); 48 worksheetPart.Worksheet.Save(); 49 50 pkg.ChartPart chartPart = drawingsPart.AddNewPart<pkg.ChartPart>(); 51 52 //图表实例 53 chartPart.ChartSpace = new DODC.ChartSpace(); 54 55 chartPart.ChartSpace.Append( 56 new DODC.EditingLanguage() 57 { 58 Val = new DOX.StringValue("en-US") 59 }); 60 61 //图表最外层 62 DODC.Chart chart = chartPart.ChartSpace.AppendChild<DODC.Chart>(new DODC.Chart()); 63 64 //图形区 65 DODC.PlotArea plotArea = chart.AppendChild<DODC.PlotArea>(new DODC.PlotArea()); 66 67 //布局 68 DODC.Layout layout = plotArea.AppendChild<DODC.Layout>(new DODC.Layout()); 69 70 //柱形图 71 DODC.BarChart barChart = plotArea 72 .AppendChild<DODC.BarChart>( 73 new DODC.BarChart( 74 new DODC.BarDirection() 75 { 76 Val = new DOX.EnumValue<DODC.BarDirectionValues>(DODC.BarDirectionValues.Column) 77 }, 78 new DODC.BarGrouping() 79 { 80 Val = new DOX.EnumValue<DODC.BarGroupingValues>(DODC.BarGroupingValues.Clustered) 81 })); 82 83 uint i = 0; 84 85 foreach (string key in data.Keys) 86 { 87 //柱形图序列 88 DODC.BarChartSeries barChartSeries = barChart 89 .AppendChild<DODC.BarChartSeries>( 90 new DODC.BarChartSeries(//柱形图序列 91 new DODC.Index() 92 { 93 Val = new DOX.UInt32Value(i) 94 }, 95 new DODC.Order() 96 { 97 Val = new DOX.UInt32Value(i) 98 }, 99 new DODC.SeriesText( //系列文本 100 new DODC.NumericValue() 101 { 102 Text = key 103 }) 104 )); 105 106 //字符串常值 107 DODC.StringLiteral strLit = barChartSeries 108 .AppendChild<DODC.CategoryAxisData>( 109 new DODC.CategoryAxisData()) 110 .AppendChild<DODC.StringLiteral>( 111 new DODC.StringLiteral()); 112 113 strLit.Append(new DODC.PointCount() 114 { 115 Val = new DOX.UInt32Value(1U) 116 }); 117 118 strLit.AppendChild<DODC.StringPoint>(new DODC.StringPoint() 119 { 120 Index = new DOX.UInt32Value(0U) 121 }) 122 .Append(new DODC.NumericValue(key)); //原为title 123 124 //值常值 125 DODC.NumberLiteral numLit = barChartSeries 126 .AppendChild<DODC.Values>(new DODC.Values() 127 ).AppendChild<DODC.NumberLiteral>(new DODC.NumberLiteral() 128 ); 129 130 numLit.Append(new DODC.FormatCode("General")); 131 132 numLit.Append(new DODC.PointCount() 133 { 134 Val = new DOX.UInt32Value(1U) 135 }); 136 137 numLit.AppendChild<DODC.NumericPoint>(new DODC.NumericPoint() 138 { 139 Index = new DOX.UInt32Value(0u) 140 }).Append(new DODC.NumericValue(data[key].ToString())); 141 142 i++; 143 } 144 145 barChart.Append(new DODC.AxisId() 146 { 147 Val = new DOX.UInt32Value(48650112u) 148 }); 149 150 barChart.Append(new DODC.AxisId() 151 { 152 Val = new DOX.UInt32Value(48672768u) 153 }); 154 155 //分类坐标值 156 DODC.CategoryAxis catAx = plotArea.AppendChild<DODC.CategoryAxis>( 157 new DODC.CategoryAxis( 158 new DODC.AxisId() 159 { 160 Val = new DOX.UInt32Value(48650112u) 161 }, 162 new DODC.Scaling(new DODC.Orientation() 163 { 164 Val = new DOX.EnumValue<DODC.OrientationValues>(DODC.OrientationValues.MinMax) 165 }), 166 new DODC.AxisPosition()//坐标值位置 167 { 168 Val = new DOX.EnumValue<DODC.AxisPositionValues>(DODC.AxisPositionValues.Bottom) 169 }, 170 new DODC.TickLabelPosition()//标签位置 171 { 172 Val = new DOX.EnumValue<DODC.TickLabelPositionValues>(DODC.TickLabelPositionValues.NextTo) 173 }, 174 new DODC.CrossingAxis() 175 { 176 Val = new DOX.UInt32Value(48672768U) 177 }, 178 new DODC.Crosses() 179 { 180 Val = new DOX.EnumValue<DODC.CrossesValues>(DODC.CrossesValues.AutoZero) 181 }, 182 new DODC.AutoLabeled() 183 { 184 Val = new DOX.BooleanValue(true) 185 }, 186 new DODC.LabelAlignment() 187 { 188 Val = new DOX.EnumValue<DODC.LabelAlignmentValues>(DODC.LabelAlignmentValues.Center) 189 }, 190 new DODC.LabelOffset() 191 { 192 Val = new DOX.UInt16Value((ushort)100) 193 } 194 )); 195 196 //值坐标值 197 DODC.ValueAxis valAx = plotArea.AppendChild<DODC.ValueAxis>( 198 new DODC.ValueAxis( 199 new DODC.AxisId() 200 { 201 Val = new DOX.UInt32Value(48672768u) 202 }, 203 new DODC.Scaling( 204 new DODC.Orientation() 205 { 206 Val = new DOX.EnumValue<DODC.OrientationValues>(DODC.OrientationValues.MinMax) 207 }), 208 new DODC.AxisPosition() 209 { 210 Val = new DOX.EnumValue<DODC.AxisPositionValues>(DODC.AxisPositionValues.Left) 211 }, 212 new DODC.MajorGridlines(), 213 new DODC.NumberingFormat() 214 { 215 FormatCode = new DOX.StringValue("General"), 216 SourceLinked = new DOX.BooleanValue(true) 217 }, 218 new DODC.TickLabelPosition() 219 { 220 Val = new DOX.EnumValue<DODC.TickLabelPositionValues>(DODC.TickLabelPositionValues.NextTo) 221 }, 222 new DODC.CrossingAxis() 223 { 224 Val = new DOX.UInt32Value(48650112U) 225 }, 226 new DODC.Crosses() 227 { 228 Val = new DOX.EnumValue<DODC.CrossesValues>(DODC.CrossesValues.AutoZero) 229 }, 230 new DODC.CrossBetween() 231 { 232 Val = new DOX.EnumValue<DODC.CrossBetweenValues>(DODC.CrossBetweenValues.Between) 233 })); 234 235 236 //图例 237 DODC.Legend legend = chart.AppendChild<DODC.Legend>( 238 new DODC.Legend( 239 new DODC.LegendPosition() 240 { 241 Val = new DOX.EnumValue<DODC.LegendPositionValues>(DODC.LegendPositionValues.Right) //图例位置 242 })); 243 244 //图可见 245 chart.Append(new DODC.PlotVisibleOnly() 246 { 247 Val = new DOX.BooleanValue(true) 248 }); 249 250 chartPart.ChartSpace.Save(); 251 252 drawingsPart.WorksheetDrawing = new DODS.WorksheetDrawing(); 253 254 //图例和图形区域大小 255 DODS.TwoCellAnchor twoCellAnchor = drawingsPart.WorksheetDrawing.AppendChild<DODS.TwoCellAnchor>(new DODS.TwoCellAnchor()); 256 257 //图形区域大小 258 twoCellAnchor.Append(new DODS.FromMarker(new DODS.ColumnId("9"), 259 new DODS.ColumnOffset("581025"), 260 new DODS.RowId("17"), 261 new DODS.RowOffset("114300"))); 262 263 //图例区域大小 264 twoCellAnchor.Append(new DODS.ToMarker(new DODS.ColumnId("17"), 265 new DODS.ColumnOffset("276225"), 266 new DODS.RowId("32"), 267 new DODS.RowOffset("0"))); 268 269 270 //添加图形和图例到区域中 271 //图形框架 272 DODS.GraphicFrame graphicFrame = 273 twoCellAnchor.AppendChild<DODS.GraphicFrame>(new DODS.GraphicFrame()); 274 graphicFrame.Macro = ""; 275 276 //图表标题 277 graphicFrame.Append( 278 new DODS.NonVisualGraphicFrameProperties( 279 new DODS.NonVisualDrawingProperties() 280 { 281 Id = new DOX.UInt32Value(2u), 282 Name = "Chart 1" 283 }, 284 new DODS.NonVisualGraphicFrameDrawingProperties() 285 )); 286 287 //区域坐标 288 graphicFrame.Append( 289 new DODS.Transform( 290 new DOD.Offset() 291 { 292 X = 0L, 293 Y = 0L 294 }, 295 new DOD.Extents() 296 { 297 Cx = 0L, 298 Cy = 0L 299 } 300 )); 301 302 //把图形添加到区域中 303 graphicFrame.Append( 304 new DOD.Graphic( 305 new DOD.GraphicData( 306 new DODC.ChartReference() 307 { 308 Id = drawingsPart.GetIdOfPart(chartPart)//指定图形ID 309 }) 310 { Uri = "http://schemas.openxmlformats.org/drawingml/2006/chart" } 311 )); 312 313 twoCellAnchor.Append(new DODS.ClientData()); 314 315 drawingsPart.WorksheetDrawing.Save(); 316 317 } 318 } 319 } 320 }
运行上面代码得到图表如图:
注意:上面代码不支持重复运行
以上是关于利用openxml在Excel中插入图表的主要内容,如果未能解决你的问题,请参考以下文章
dotnet OpenXML 读取 PPT 内嵌 ole 格式 Excel 表格的信息
dotnet OpenXML 读取 PPT 内嵌 ole 格式 Excel 表格的信息
dotnet OpenXML 读取 PPT 内嵌 ole 格式 Excel 表格的信息
dotnet OpenXML 利用合并表格单元格在 PPT 文档插入不可见的额外版权信息