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:\Users\Administrator\source\repos\OpenXMLStudy\OpenXMLStudy\Sum100.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", );
  22. data.Add("dsa", );
  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() <= )
  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 = ;
  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))
  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. DODC.Legend legend = chart.AppendChild<DODC.Legend>(
  237. new DODC.Legend(
  238. new DODC.LegendPosition()
  239. {
  240. Val = new DOX.EnumValue<DODC.LegendPositionValues>(DODC.LegendPositionValues.Right) //图例位置
  241. }));
  242.  
  243. //图可见
  244. chart.Append(new DODC.PlotVisibleOnly()
  245. {
  246. Val = new DOX.BooleanValue(true)
  247. });
  248.  
  249. chartPart.ChartSpace.Save();
  250.  
  251. drawingsPart.WorksheetDrawing = new DODS.WorksheetDrawing();
  252.  
  253. //图例和图形区域大小
  254. DODS.TwoCellAnchor twoCellAnchor = drawingsPart.WorksheetDrawing.AppendChild<DODS.TwoCellAnchor>(new DODS.TwoCellAnchor());
  255.  
  256. //图形区域大小
  257. twoCellAnchor.Append(new DODS.FromMarker(new DODS.ColumnId(""),
  258. new DODS.ColumnOffset(""),
  259. new DODS.RowId(""),
  260. new DODS.RowOffset("")));
  261.  
  262. //图例区域大小
  263. twoCellAnchor.Append(new DODS.ToMarker(new DODS.ColumnId(""),
  264. new DODS.ColumnOffset(""),
  265. new DODS.RowId(""),
  266. new DODS.RowOffset("")));
  267.  
  268. //添加图形和图例到区域中
  269. //图形框架
  270. DODS.GraphicFrame graphicFrame =
  271. twoCellAnchor.AppendChild<DODS.GraphicFrame>(new DODS.GraphicFrame());
  272. graphicFrame.Macro = "";
  273.  
  274. //图表标题
  275. graphicFrame.Append(
  276. new DODS.NonVisualGraphicFrameProperties(
  277. new DODS.NonVisualDrawingProperties()
  278. {
  279. Id = new DOX.UInt32Value(2u),
  280. Name = "Chart 1"
  281. },
  282. new DODS.NonVisualGraphicFrameDrawingProperties()
  283. ));
  284.  
  285. //区域坐标
  286. graphicFrame.Append(
  287. new DODS.Transform(
  288. new DOD.Offset()
  289. {
  290. X = 0L,
  291. Y = 0L
  292. },
  293. new DOD.Extents()
  294. {
  295. Cx = 0L,
  296. Cy = 0L
  297. }
  298. ));
  299.  
  300. //把图形添加到区域中
  301. graphicFrame.Append(
  302. new DOD.Graphic(
  303. new DOD.GraphicData(
  304. new DODC.ChartReference()
  305. {
  306. Id = drawingsPart.GetIdOfPart(chartPart)//指定图形ID
  307. })
  308. { Uri = "http://schemas.openxmlformats.org/drawingml/2006/chart" }
  309. ));
  310.  
  311. twoCellAnchor.Append(new DODS.ClientData());
  312.  
  313. drawingsPart.WorksheetDrawing.Save();
  314.  
  315. }
  316. }
  317. }
  318. }

运行上面代码得到图表如图:

注意:上面代码不支持重复运行

利用openxml在Excel中插入图表的更多相关文章

  1. java 在Excel中插入图片 POI实现

    一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...

  2. java POI实现向Excel中插入图片

          做Web开发免不了要与Excel打交道.今天老大给我一个任务-导出Excel.开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可.但是有一点不同,就是要加入图片, ...

  3. 利用POI获取Excel中图片和图片位置

    利用POI获取Excel中图片和图片位置(支持excel2003or2007多sheet) 转自:http://blog.csdn.net/delongcpp/article/details/8833 ...

  4. 如何使用VSTO自动将Excel中的图表复制到Word

    如何使用VSTO自动将Excel中的图表复制到Word 原文地址:https://code.msdn.microsoft.com/How-to-copy-Chart-in-Excel-a29f9029 ...

  5. 利用Kettle 从Excel中抽取数据写入SQLite

    SQLite作为一种数据库可以配置为Kettle的数据输入和输出,这个例子是从Excel中抽取数据然后写入到SQLite中 配置测试并成功后如下 下面是配置步骤: Excel输入配置 sqlite配置 ...

  6. Java 添加、读取、删除Excel中的图表趋势线

    本文以Java示例介绍如何在Excel中添加趋势线,以及读取趋势线公式.通过文中的方法可支持添加6种不同类型的趋势线,包括Linear.Exponential.Logarithmic.Moving A ...

  7. 使用OpenXml把Excel中的数据导出到DataSet中

    public class OpenXmlHelper { /// <summary> /// 读取Excel数据到DataSet中,默认读取所有Sheet中的数据 /// </sum ...

  8. 利用VBA查找excel中一行某列第一次不为空与最后一列不为空的列数

    昨日同事有需求,想知道每个商品第一次销售的月份,以及最后一次销售的月份. 本想通过什么excel函数来解决,但是找了半天也没找到合适的,最后还是通过VBA来解决吧. 使用方法: Excel工具-宏-V ...

  9. 使用Npoi向Excel中插入图片

    先把数据库中的数据都导入到Excel表格中,把图片地址的路径全部转成绝对路径. 使用Npoi读取刚导出的Excle表格,把图片那个单元格的图片路径读出来,然后用文件流读取图片,然后通过Npoi把图片放 ...

随机推荐

  1. h5-上传图片预览

    <div class="content_sq" style="position:relative;"> <img src="imag ...

  2. Linq指令执行分析

    Linq指令执行分析 一.Linq中IEnumerable的结构 Linq在执行聚合操作和ToXxx系统方法之前,一直都是一个数据源和一串指令(下面的讨论都是基于未执行聚合操作和ToXxx系统方法之前 ...

  3. os库新建文件夹

    file.write()可以自动生成文件但不能生成文件夹. os库生成文件夹 # 判断文件夹是否存在(./xxx/xxx) if not isExists: os.makedirs(path) pri ...

  4. day48 前端高级选择器优先级

    复习 1. 基础选择器 标签选择器(div) | 类选择器(.div1) | id选择器(#div2) <div class="div1" id="div2&quo ...

  5. fuchsia 内核

    1 内核zircon 是c++写的,system call是重写的,不兼容POSIX https://fuchsia.googlesource.com/zircon/+/HEAD/docs/conce ...

  6. 如何自动生成图片用于测试 pytorch(No image? No need image)

    if __name__ == '__main__': module = CAM_Module() in_data = torch.randint(0, 255, (2, 3, 7, 7), dtype ...

  7. go语言语法基础

    1. go标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号 如:fmt.Println("hello world") 2.行分隔符 在 Go 程序中,一 ...

  8. SpringCloud微服务基础

    1.传统项目架构  传统项目分为三层架构,将业务逻辑层.数据库访问层.控制层放入在一个项目中.适合于个人或者小团队开发,不适合大团队开发. 2.分布式项目架构(解耦方案) 根据业务需求进行拆分成N个子 ...

  9. node.js 从入门到。。。

    本人安装环境为 mac ,所以只记录了 mac 下的操作步骤 1.安装 node node的国内下载地址:http://nodejs.cn/download/ 安装之后,在终端输入指令 node -v ...

  10. mysql查询时间段内的数据

    https://blog.csdn.net/ls1645/article/details/79118464