/**
* 条形图;柱形图 的数据写入方法
* @param slide 图表
* @param index 柱状图的下标
* @param data 要填充的数据
* @param titles 内嵌Excel的X轴title
* @param columnTitles 内嵌Excel的Y轴title
* @return
*/
public static XSLFSlide setBarChart(XSLFSlide slide, int index, List<List<String>> data, List<String> titles,
List<String> columnTitles) {
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();
CTBarChart barChart = null;
try {
barChart = plotArea.getBarChartArray(0);
} catch (Exception e) {
log.error("不存在柱状图或者不是柱状图!" + e);
}

List<CTBarSer> serList = barChart.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();
CTBarSer[] serArr = new CTBarSer[serList.size()];
for (int i = 0; i < objArr.length; i++) {
if (serList.toArray()[i] instanceof CTBarSer) {
serArr[i] = (CTBarSer) objArr[i];
}
}
barChart.setSerArray(serArr);
// 把图表绑定到Excel workbook中
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet();
// 创建列标题行
Row lineTitle = sheet.createRow(0);
// 获取行数
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));
}
// ser对应一列
for (int i = 0; i < serList.size(); i++) {
CTBarSer 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();
serList.get(i).getTx().getStrRef().setF(titleRef);
// 写入数据
CTNumData numData = serList.get(i).getVal().getNumRef().getNumCache();
// 清除旧的数据值
numData.setPtArray(null);
// 一格
for (int j = 0; j < titles.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(titles.size());
strData.getPtCount().setVal(titles.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联动的更多相关文章

  1. Java编辑PPT的折线图,与内嵌Excel联动

    /** * 折线图的数据写入方法 * @param slide ppt图表 * @param index 折线图的下标 * @param data 需要填充的数据 * @param titles 内嵌 ...

  2. SAP ALV内嵌(In-place)Excel的问与答

    1.问题:点击ALV工具栏的"Excel"图标后,出现空白的内嵌Excel界面,无法正常显示报表数据.可按以下思路解决:(1)检查Excel中的宏安全设置选项.访问方法:启动Exc ...

  3. Java设置PPT的扇形图,与内嵌Excel联动

    /** * 设置饼图的主方法 * @param slide 图表 * @param index 图标位置 * @param data 需要设置的数据 * @param titles 关联Excel的标 ...

  4. Eclipse内嵌的webservice客户端

    概述 Eclipse内嵌的webservice客户端,可用于发起请求,查看结果,展示请求和响应的报文. 详情 在Java EE视图,可以看到内嵌的webservice客户端浏览器登陆按钮 点击打开浏览 ...

  5. Atitit java集成内嵌浏览器与外嵌浏览器attilax总结

    Atitit java集成内嵌浏览器与外嵌浏览器attilax总结 HTML5将颠覆原生App世界.这听起来有点危言耸听,但若认真分析HTML5的发展史,你会发现,这个世界的发展趋势确实就是这样. 熟 ...

  6. java发送内嵌图片邮件

    前言: 博客系统中需要邮件服务的功能,以前写过类似的功能,不过功能太简单了,仅仅是发送文本内容,现在尝试一下发送内嵌图片邮件! 准备工作: 请参考:http://www.cnblogs.com/huj ...

  7. apache ftp server的简单入门(java应用内嵌ftp server)

    Apache Ftp Server:(强调) Apache Ftp Server 是100%纯Java的FTP服务器软件,它采用MINA网络框架开发具有非常好的性能.Apache FtpServer ...

  8. 批量导出ppt中内嵌的图片

    某个ppt中很多页,然后插入了很多图片,且图片都是被压缩的,看起来非常费劲,所以想着一次性把图片另存为,找了接近一个小时,终于被我找到啦,分享给大家: 1.直接把ppt的后缀修改为rar 2.解压ra ...

  9. swt java 内嵌ActiveX控件

    这里用的是SWT/JFace开发application中SWT自带的org.eclipse.swt.ole.win32 包可以支持内嵌OLE和ActiveX. 具体用法如下: //创建一个OleFra ...

随机推荐

  1. Memcached与Redis对比,Redis基础笔记回顾

    Memcached 1.为什么要把数据存入内存?快 2.Memcached和Redis的区别 (1)Memcached缓存.Redis数据库,Memcached不支持持久化到磁盘 (2)Redis提供 ...

  2. 张高兴的 Windows 10 IoT 开发笔记:FM 电台模块 KT0803L

    This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub:https://github.co ...

  3. virtualbox+vagrant学习-2(command cli)-18-vagrant ssh-config命令

    SSH Config 格式: vagrant ssh-config [options] [name|id] 这将从SSH直接将SSH配置文件的有效配置输出到正在运行的vagrant 计算机(而不是使用 ...

  4. kendo ui - MultiSelect 多选系列

    kendo-ui 官网:https://www.telerik.com/documentation 初始化 grid: 引入文件: <link rel="stylesheet" ...

  5. Python自动化之跨域访问jsonp

    这里提到了JSONP,那有人就问了,它同JSON有什么区别不同和区别呢,接下我们就来看看,百度百科有以下说明: ''' 1. JSON(JavaScript Object Notation) 是一种轻 ...

  6. 【转】纯JS省市区三级联动(行政区划代码更新至2015-9-30)

    本文代码实现的功能是省市区三级联动下拉列表,纯Javascript,网上已有很多这方面的代码.但是作为一个新手,这是我的第一篇CSDN博客,发此文的目的主要是学习交流,希望看到的朋友发现有什么不对的地 ...

  7. VC++获取当前路径及程序名的实现代码

    VC上或取当前路径有多种方法,最常用的是使用 GetCurrentDirectory和GetModuleFileName函数,个中都有诸多注意事项,特别总结一下 一.获取当前运行目录的绝对路径 1.使 ...

  8. B. Vile Grasshoppers

    http://codeforces.com/problemset/problem/937/B The weather is fine today and hence it's high time to ...

  9. <摘录>字节对齐与结构体大小

    说明: 结 构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题.这些问题在平时编程的时候也确实不怎么用到,但在一 些笔试面试题目中出是常常出现,对sizeo ...

  10. SD卡受损,千万不要再格式化了

    1.手机提示SD卡受损; 2.把内卡插入电脑后,提示格式化,点取消.然后查看一下属性; 3.点电脑上的“开始菜单”--“运行”- chkdsk H:/F (H:就是你的SD卡盘符,/F是修复参数); ...