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. JS工具类

    封装了开发中常用的操作 并添加了一些扩展方法供调用 var util = { //获取Url中的参数(不支持中文) getParams: function() { var url = location ...

  2. Beanstalkd消息队列 -- php类Pheanstalk使用

    业务场景 商城订单生成30分钟后 如果未支付关闭订单 解决办法 可以使用延迟消息队列   这里我们用的是beanstalkd Beanstalkd介绍 Beanstalk,一个高性能.轻量级的分布式内 ...

  3. 后台商品搜索功能开发SQL

    在做后台的商品搜索功能开发时遇到了一些问题记录下来 版本一 <select id="SelectByNameAndParentId resultMap="Base_resul ...

  4. 编写程序,使用while循环将50到100的整数相加

    #include<iostream> int main(int argc, char const *argv[]) { using std::cout; ,b=; ){ a++; b=+b ...

  5. bootloaderd的再解析

    boot的0脚和1脚可以选择启动方式,以前只知道可以选择的方式是nandflash启动,或者选择从norflash启动,当选择nandflash启动时,cpu看到的0地址是ram的0地址,根据是nan ...

  6. c/c++一维数组简单介绍

    定义:同一种类型数据的集合 通俗的讲就是,将多个同一种类型的数据按一定的内存顺序写在一起. 注意我的几个关键字“多个”,“同一种”,“一定的内存顺序”.如果理解了这几个关键词,说明你的数组已经掌握了. ...

  7. vue的搭建项目

    请求的封装,先在src下面创建一个utils的文件夹,文件夹里面有ajax.js loading.js index.js to 1 请求的封装 ajax文件 需要引入的文件在后面 /* * [page ...

  8. mysql权限操作(转)

    慢慢看吧mysql中可以给你一个用户授予如select,insert,update,delete等其中的一个或者多个权限,主要使用grant命令,用法格式为: grant 权限 on 数据库对象 to ...

  9. CentOS-07安装Redis学习笔记

    CentOS-07安装Redis 下载 http://download.redis.io/releases/redis-3.0.0.tar.gz 安装第一步:将下载的Redis源码包上传大奥Linux ...

  10. Layer 创建 和 lamdba function 创建 和 API GateWay 配置 和 添加依赖

    进入控制台 选择 Lamdba 服务 进入控制面板, 单击右边: 创建函数 然后进入此图界面 添加lamdba 函数 名称 选择运行环境:python 选择角色 选择现有角色, 角色创建 可以参考 无 ...