using System.Collections.Generic;
using System.Linq;
using DOD = DocumentFormat.OpenXml.Drawing;
using DODC = DocumentFormat.OpenXml.Drawing.Charts;
using DODS = DocumentFormat.OpenXml.Drawing.Spreadsheet;
using DOS = DocumentFormat.OpenXml.Spreadsheet;
using DOX = DocumentFormat.OpenXml;
using pkg = DocumentFormat.OpenXml.Packaging; namespace InsertChartTest
{
class Program
{
const string fileName = @"C:\Users\Administrator\source\repos\OpenXMLStudy\OpenXMLStudy\Sum100.xlsx"; static void Main(string[] args)
{
string worksheetName = "Joe";
string title = "New Chart";
Dictionary<string, int> data = new Dictionary<string, int>();
data.Add("abc", );
data.Add("dsa", );
InsertChartInSpreadsheet(fileName, worksheetName, title, data); } private static void InsertChartInSpreadsheet(string docName, string worksheetName, string title,
Dictionary<string, int> data)
{
using (pkg.SpreadsheetDocument document = pkg.SpreadsheetDocument.Open(docName, true))
{
IEnumerable<DOS.Sheet> sheets = document.WorkbookPart.Workbook.Descendants<DOS.Sheet>(); if (sheets == null || sheets.Count() <= )
return; pkg.WorksheetPart worksheetPart = (pkg.WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id); System.Diagnostics.Debug.WriteLine("SheetID:{0}", sheets.First().Id); // DOS.Worksheet worksheet = worksheetPart.Worksheet;
pkg.DrawingsPart drawingsPart = worksheetPart.AddNewPart<pkg.DrawingsPart>(); worksheetPart.Worksheet.Append(new DOS.Drawing()
{
Id = worksheetPart.GetIdOfPart(drawingsPart)
});
worksheetPart.Worksheet.Save(); pkg.ChartPart chartPart = drawingsPart.AddNewPart<pkg.ChartPart>(); //图表实例
chartPart.ChartSpace = new DODC.ChartSpace(); chartPart.ChartSpace.Append(
new DODC.EditingLanguage()
{
Val = new DOX.StringValue("en-US")
}); //图表最外层
DODC.Chart chart = chartPart.ChartSpace.AppendChild<DODC.Chart>(new DODC.Chart()); //图形区
DODC.PlotArea plotArea = chart.AppendChild<DODC.PlotArea>(new DODC.PlotArea()); //布局
DODC.Layout layout = plotArea.AppendChild<DODC.Layout>(new DODC.Layout()); //柱形图
DODC.BarChart barChart = plotArea
.AppendChild<DODC.BarChart>(
new DODC.BarChart(
new DODC.BarDirection()
{
Val = new DOX.EnumValue<DODC.BarDirectionValues>(DODC.BarDirectionValues.Column)
},
new DODC.BarGrouping()
{
Val = new DOX.EnumValue<DODC.BarGroupingValues>(DODC.BarGroupingValues.Clustered)
})); uint i = ; foreach (string key in data.Keys)
{
//柱形图序列
DODC.BarChartSeries barChartSeries = barChart
.AppendChild<DODC.BarChartSeries>(
new DODC.BarChartSeries(//柱形图序列
new DODC.Index()
{
Val = new DOX.UInt32Value(i)
},
new DODC.Order()
{
Val = new DOX.UInt32Value(i)
},
new DODC.SeriesText( //系列文本
new DODC.NumericValue()
{
Text = key
})
)); //字符串常值
DODC.StringLiteral strLit = barChartSeries
.AppendChild<DODC.CategoryAxisData>(
new DODC.CategoryAxisData())
.AppendChild<DODC.StringLiteral>(
new DODC.StringLiteral()); strLit.Append(new DODC.PointCount()
{
Val = new DOX.UInt32Value(1U)
}); strLit.AppendChild<DODC.StringPoint>(new DODC.StringPoint()
{
Index = new DOX.UInt32Value(0U)
})
.Append(new DODC.NumericValue(key)); //原为title //值常值
DODC.NumberLiteral numLit = barChartSeries
.AppendChild<DODC.Values>(new DODC.Values()
).AppendChild<DODC.NumberLiteral>(new DODC.NumberLiteral()
); numLit.Append(new DODC.FormatCode("General")); numLit.Append(new DODC.PointCount()
{
Val = new DOX.UInt32Value(1U)
}); numLit.AppendChild<DODC.NumericPoint>(new DODC.NumericPoint()
{
Index = new DOX.UInt32Value(0u)
}).Append(new DODC.NumericValue(data[key].ToString())); i++;
} barChart.Append(new DODC.AxisId()
{
Val = new DOX.UInt32Value(48650112u)
}); barChart.Append(new DODC.AxisId()
{
Val = new DOX.UInt32Value(48672768u)
}); //分类坐标值
DODC.CategoryAxis catAx = plotArea.AppendChild<DODC.CategoryAxis>(
new DODC.CategoryAxis(
new DODC.AxisId()
{
Val = new DOX.UInt32Value(48650112u)
},
new DODC.Scaling(new DODC.Orientation()
{
Val = new DOX.EnumValue<DODC.OrientationValues>(DODC.OrientationValues.MinMax)
}),
new DODC.AxisPosition()//坐标值位置
{
Val = new DOX.EnumValue<DODC.AxisPositionValues>(DODC.AxisPositionValues.Bottom)
},
new DODC.TickLabelPosition()//标签位置
{
Val = new DOX.EnumValue<DODC.TickLabelPositionValues>(DODC.TickLabelPositionValues.NextTo)
},
new DODC.CrossingAxis()
{
Val = new DOX.UInt32Value(48672768U)
},
new DODC.Crosses()
{
Val = new DOX.EnumValue<DODC.CrossesValues>(DODC.CrossesValues.AutoZero)
},
new DODC.AutoLabeled()
{
Val = new DOX.BooleanValue(true)
},
new DODC.LabelAlignment()
{
Val = new DOX.EnumValue<DODC.LabelAlignmentValues>(DODC.LabelAlignmentValues.Center)
},
new DODC.LabelOffset()
{
Val = new DOX.UInt16Value((ushort))
}
)); //值坐标值
DODC.ValueAxis valAx = plotArea.AppendChild<DODC.ValueAxis>(
new DODC.ValueAxis(
new DODC.AxisId()
{
Val = new DOX.UInt32Value(48672768u)
},
new DODC.Scaling(
new DODC.Orientation()
{
Val = new DOX.EnumValue<DODC.OrientationValues>(DODC.OrientationValues.MinMax)
}),
new DODC.AxisPosition()
{
Val = new DOX.EnumValue<DODC.AxisPositionValues>(DODC.AxisPositionValues.Left)
},
new DODC.MajorGridlines(),
new DODC.NumberingFormat()
{
FormatCode = new DOX.StringValue("General"),
SourceLinked = new DOX.BooleanValue(true)
},
new DODC.TickLabelPosition()
{
Val = new DOX.EnumValue<DODC.TickLabelPositionValues>(DODC.TickLabelPositionValues.NextTo)
},
new DODC.CrossingAxis()
{
Val = new DOX.UInt32Value(48650112U)
},
new DODC.Crosses()
{
Val = new DOX.EnumValue<DODC.CrossesValues>(DODC.CrossesValues.AutoZero)
},
new DODC.CrossBetween()
{
Val = new DOX.EnumValue<DODC.CrossBetweenValues>(DODC.CrossBetweenValues.Between)
})); //图例
DODC.Legend legend = chart.AppendChild<DODC.Legend>(
new DODC.Legend(
new DODC.LegendPosition()
{
Val = new DOX.EnumValue<DODC.LegendPositionValues>(DODC.LegendPositionValues.Right) //图例位置
})); //图可见
chart.Append(new DODC.PlotVisibleOnly()
{
Val = new DOX.BooleanValue(true)
}); chartPart.ChartSpace.Save(); drawingsPart.WorksheetDrawing = new DODS.WorksheetDrawing(); //图例和图形区域大小
DODS.TwoCellAnchor twoCellAnchor = drawingsPart.WorksheetDrawing.AppendChild<DODS.TwoCellAnchor>(new DODS.TwoCellAnchor()); //图形区域大小
twoCellAnchor.Append(new DODS.FromMarker(new DODS.ColumnId(""),
new DODS.ColumnOffset(""),
new DODS.RowId(""),
new DODS.RowOffset(""))); //图例区域大小
twoCellAnchor.Append(new DODS.ToMarker(new DODS.ColumnId(""),
new DODS.ColumnOffset(""),
new DODS.RowId(""),
new DODS.RowOffset(""))); //添加图形和图例到区域中
//图形框架
DODS.GraphicFrame graphicFrame =
twoCellAnchor.AppendChild<DODS.GraphicFrame>(new DODS.GraphicFrame());
graphicFrame.Macro = ""; //图表标题
graphicFrame.Append(
new DODS.NonVisualGraphicFrameProperties(
new DODS.NonVisualDrawingProperties()
{
Id = new DOX.UInt32Value(2u),
Name = "Chart 1"
},
new DODS.NonVisualGraphicFrameDrawingProperties()
)); //区域坐标
graphicFrame.Append(
new DODS.Transform(
new DOD.Offset()
{
X = 0L,
Y = 0L
},
new DOD.Extents()
{
Cx = 0L,
Cy = 0L
}
)); //把图形添加到区域中
graphicFrame.Append(
new DOD.Graphic(
new DOD.GraphicData(
new DODC.ChartReference()
{
Id = drawingsPart.GetIdOfPart(chartPart)//指定图形ID
})
{ Uri = "http://schemas.openxmlformats.org/drawingml/2006/chart" }
)); twoCellAnchor.Append(new DODS.ClientData()); drawingsPart.WorksheetDrawing.Save(); }
}
}
}

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

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

利用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. 5. Go函数

    [定义函数] 直接上一个栗子,Go语言定义函数: func add(a int, b int) int { return a + b } 一目了然,还不太习惯Go语言的命名方式, 类型为什么要写到后面 ...

  2. 字符编码:Unicode和UTF-8之间的关系

    Unicode和UTF-8之间的关系 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256 ...

  3. 用eclipse创建动态web项目手动生成web.xml方法

    建一个web项目,后来在用到web.xml文件时,才发现项目创建时没有自动创建web.xml文件. 在创建的项目上单击右键,然后单击java EE Tools下的用红线圈住的地方,然后查看你的WEB- ...

  4. 20175314 实验三 敏捷开发与XP实践

    20175314 实验二 Java面向对象程序设计 一.实验内容 XP基础 XP核心实践 相关工具 二.实验步骤 (一)代码格式化 创建"175314.exp3"项目,在该项目下创 ...

  5. 关于webApi 跨域请求

    先说一下我的项目,后台单纯的webApi,前端采用Vue+axios, 说一下我遇见的问题,axios请求webAPI但是浏览器会报错,大致上就是不允许跨域请求. 于是查找解决办法发现以下代码(web ...

  6. Hadoop环境搭建--Docker完全分布式部署Hadoop环境(菜鸟采坑吐血整理)

    系统:Centos 7,内核版本3.10 本文介绍如何从0利用Docker搭建Hadoop环境,制作的镜像文件已经分享,也可以直接使用制作好的镜像文件. 一.宿主机准备工作 0.宿主机(Centos7 ...

  7. git log命令常用参数集合

    git log 查看 提交历史 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面. 常用的格式占位符写法及其代表的意义.选项 说明%H 提交对象(commit)的 ...

  8. sliding window:"Marginalization","Schur complement","First estimate jacobin"

    [1]知行合一2 SLAM中的marginalization 和 Schur complement SLAM的Bundle Adjustment上,随着时间的推移,路标特征点(landmark)和相机 ...

  9. EasyUI ComboGrid 笔记(支持分页)

    业务要求: 下拉框做选择时需要展现多个字段供用户参考,由于内容可能会很多,故还需要考虑分页. 解决方案: 由于项目整体已经采用了EasyUI,在浏览了demo以后,初步考虑使用EasyUI的combo ...

  10. Qt5.12.2开发Android环境搭建

    Qt-Android开发环境概要qt-opensource-windows-x86-5.12.2----armv7jdk-8u201-windows-x64android-ndk-r18b-windo ...