Java编辑PPT的折线图,与内嵌Excel联动
/**
* 折线图的数据写入方法
* @param slide ppt图表
* @param index 折线图的下标
* @param data 需要填充的数据
* @param titles 内嵌Excel的X轴title
* @param columnTitles 内嵌Excel的Y轴title
* @return
* @throws IOException
*/
@SuppressWarnings("unused")
public static XSLFSlide setLineChart(XSLFSlide slide, int index, List<List<String>> data, List<String> titles,
List<String> columnTitles) throws IOException {
XSLFChart chart = setChartData(slide, index);
List<POIXMLDocumentPart> partList = chart.getRelations();
POIXMLDocumentPart xlsPart = null;
// 获取到内嵌的Excel
for (int i = 0; i < partList.size(); i++) {
xlsPart = partList.get(i);
if (xlsPart.getPackagePart().getPartName().getName().endsWith("xlsx")) {
break;
}
}
CTChart ctChart = chart.getCTChart();
CTPlotArea plotArea = ctChart.getPlotArea();
CTLineChart lineChart = null;
try {
lineChart = plotArea.getLineChartArray(0);
} catch (Exception e) {
log.error("异常:" + e);
}
if (lineChart == null) {
return slide;
}
List<CTLineSer> serList = lineChart.getSerList();
// 如果模板中的列数与Excel数据中的列不对等
if (serList.size() > columnTitles.size()) {
serList = serList.subList(0, columnTitles.size());
} else if (serList.size() < columnTitles.size()) {
for (int i = 0; i < (columnTitles.size() - serList.size()); i++) {
serList.add(serList.get(0));
}
}
Object[] objArr = serList.toArray();
CTLineSer[] serArr = new CTLineSer[serList.size()];
for (int i = 0; i < objArr.length; i++) {
if (serList.toArray()[i] instanceof CTLineSer) {
serArr[i] = (CTLineSer) objArr[i];
}
}
lineChart.setSerArray(serArr);
// 把图表绑定到Excel workbook中
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet();
// 创建列标题行
Row lineTitle = sheet.createRow(0);
int rowNum = sheet.getLastRowNum();
// 创建并设置列标题行
CTStrData strData = serList.get(0).getCat().getStrRef().getStrCache();
strData.setPtArray(null);
for (int i = 0; i < titles.size(); i++) {
lineTitle.createCell(i + 1).setCellValue(titles.get(i));
CTStrVal sVal = strData.addNewPt();
sVal.setIdx(i);
sVal.setV(titles.get(i));
}
// 如果只是折线图,则需要设置行
// 创建行数和行标题
for (int rows = 0; rows < columnTitles.size(); rows++) {
sheet.createRow(rows + 1).createCell(0).setCellValue(columnTitles.get(rows));
}
for (int i = 0; i < serList.size(); i++) {
CTLineSer ser = serList.get(i);
CTSerTx tx = ser.getTx();
tx.getStrRef().getStrCache().getPtArray(0).setV(columnTitles.get(i));
// 关联列标题
String titleRef = new CellReference(sheet.getSheetName(), i + 1, 0, true, true).formatAsString();
tx.getStrRef().setF(titleRef);
// 写入数据
CTNumData numData = serList.get(i).getVal().getNumRef().getNumCache();
// 清除旧的数据值
numData.setPtArray(null);
// 每一格
for (int j = 0; j < data.size(); j++) {
CTNumVal numVal = numData.addNewPt();
numVal.setIdx(j);
numVal.setV("" + getDataDouble(data, j, i));
// 写入workbook
Row row = sheet.getRow(i + 1);
Cell cell = row.createCell(j + 1);
cell.setCellValue(getDataDouble(data, j, i));
}
numData.getPtCount().setVal(data.size());
// 设置行标题和数据关联
String numDataRange = new CellRangeAddress(i + 1, i + 1, 1, data.size()).formatAsString(sheet.getSheetName(), true);
serList.get(i).getVal().getNumRef().setF(numDataRange);
}
// 关联行标题
String axisDataRange = new CellRangeAddress(0, 0, 1, data.size()).formatAsString(sheet.getSheetName(), true);
serList.get(0).getCat().getStrRef().setF(axisDataRange);
// 更新嵌入的workbook
updateWorkbook(xlsPart, wb);
return slide;
}
/**
* 更新嵌入的workbook
* @param ppt
* @param xlsPart
* @param wb
* @return
*/
private static void updateWorkbook(POIXMLDocumentPart xlsPart, XSSFWorkbook wb) {
// 更新嵌入的workbook
OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
try {
wb.write(xlsOut);
} catch (IOException e) {
log.error("PPTUtil.updateWorkbook() :" + e);
} finally {
try {
xlsOut.close();
} catch (IOException e) {
log.error("PPTUtil.updateWorkbook() :" + e);
}
}
}
Java编辑PPT的折线图,与内嵌Excel联动的更多相关文章
- Java编辑PPT的柱状图,与内嵌的Excel联动
/** * 条形图:柱形图 的数据写入方法 * @param slide 图表 * @param index 柱状图的下标 * @param data 要填充的数据 * @param titles 内 ...
- Java设置PPT的扇形图,与内嵌Excel联动
/** * 设置饼图的主方法 * @param slide 图表 * @param index 图标位置 * @param data 需要设置的数据 * @param titles 关联Excel的标 ...
- Excel柱状图折线图组合怎么做 Excel百分比趋势图制作教程
Excel柱状图折线图组合怎么做 Excel百分比趋势图制作教程 用excel作图时候经常会碰到做柱状图和折线图组合,这样的图一般难在折线图的数据很小,是百分比趋势图,所以经常相对前面主数据太小了,在 ...
- 魔改——MFC SDI 支持 内嵌 EXCEL OLE
==================================声明================================== 本文版权归作者所有 未经作者授权 请勿转载 保留法律追究的 ...
- C# Dsoframer.ocx 如何在winform中嵌入Excel,内嵌Excel,word
如果你还不太清楚Dspframer.ocx怎么放到窗体上就看上一篇文章,里面详细介绍了是如何放到窗体上的. 链接:http://www.cnblogs.com/pingming/p/4182045.h ...
- C# 如何在winform中嵌入Excel,内嵌Excel,word
近使用.net做一个小软件遇到一个问题,就是想实现把excel表格在winform中打开,同时可以操作,不单单是打开.或者就提取数据.在网上找了好多资料,发现这方面的资料比较少,即使有,都是旧版本的使 ...
- 批量导出ppt中内嵌的图片
某个ppt中很多页,然后插入了很多图片,且图片都是被压缩的,看起来非常费劲,所以想着一次性把图片另存为,找了接近一个小时,终于被我找到啦,分享给大家: 1.直接把ppt的后缀修改为rar 2.解压ra ...
- Selenium2+python自动化26-js处理内嵌div滚动条
前言 前面有篇专门用js解决了浏览器滚动条的问题,生活总是多姿多彩,有的滚动条就在页面上,这时候又得仰仗js大哥来解决啦. 一.内嵌滚动条 1.下面这张图就是内嵌div带有滚动条的样子,记住它的长相.
- 2.24 js处理内嵌div滚动条
2.24 js处理内嵌div滚动条 前言 前面有篇专门用js解决了浏览器滚动条的问题,生活总是多姿多彩,有的滚动条就在页面上,这时候又得仰仗js大哥来解决啦.一.内嵌滚动条 1.下面这张图 ...
随机推荐
- Hyper-v 中 CentOS 连接外网之有线网卡
一.打开虚拟机交换管理器,查看默认的虚拟交换机 如果不是内部网络,则需要新建一个虚拟交换机,新的交换机应该使用内部网络: 二.配置虚拟机使用的交换机.如果 “默认开关” 不是内部网络,需要使用自己新创 ...
- map filter 的func 放在前面
map filter 的func 放在前面 sorted 在后 ( iter.. , key=function')
- bin/hdfs dfs命令
appendToFile Usage: hdfs dfs -appendToFile <localsrc> ... <dst> 追加一个或者多个文件到hdfs制定文件中.也可以 ...
- JavaScript计算指定日期与当前日期的相差天数
java中处理2个时间段相差几天很容易,直接调相关方法就行,不过js处理这类问题稍微有点不易,项目开发中也用到了,如下: 1 2 3 4 5 6 7 8 9 10 11 12 //计算两个日期天数差的 ...
- cocos2d-x(十一)Lua开发飞机大战-6-加入子弹
接下来我们为飞机加入子弹,首先创建一个BulletLayer: module("BulletLayer",package.seeall) local bulletBatchNode ...
- P4197 Peaks
题目描述 在Bytemountains有N座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点 ...
- [luogu2680] 运输计划
题面 很明显, 由于是求最长路的最小值, 我们可以使用二分求解. 我们二分一个长度\(mid\), 将所有使得\(dis(u, v)\)大于\(mid\)的点对\((u, v)\)找出, 设总共有 ...
- ajax执行失败原因
ajax 跳入error的一些原因 先放一个标准的jquery的ajax代码: $.ajax({ type: 'POST', url: 'getSecondClassification', data: ...
- #leetcode刷题之路46-全排列
给定一个没有重复数字的序列,返回其所有可能的全排列.示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] 两 ...
- Scala模式匹配常用
今天在工作中遇到的几个小问题,总结一下: 1.因为业务需要调用PHP的接口,获取到的返回体需要做一段逻辑处理,然而某个字段接收到的参数是io.serializable类型,字段的类型不是预期的stri ...