/**

* 折线图的数据写入方法

* @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> data, List titles,

List columnTitles) throws IOException {

XSLFChart chart = setChartData(slide, index);

List 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 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 折线图_java折线图的数据写入方法相关推荐

  1. java流输出_Java OutputStream.write()将数据写入输出流

    首页 > 基础教程 > IO流 > OutputStream类 Java OutputStream.write()将数据写入输出流 定义 public abstract void w ...

  2. hbase集群 数据写入_一种构建HBase集群全文索引方法,数据读取方法以及数据写入方法与流程...

    本发明涉及HBase集群领域,尤其涉及一种构建HBase集群全文索引方法,数据读取方法以及数据写入方法. 背景技术: 随着云计算技术的不断发展,云计算技术不断落地成为支撑各行业信息技术发展的重要支柱. ...

  3. java jdbc 批处理_Java JDBC批处理插入数据操作

    在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...

  4. java 内存分布_java的各类型数据在内存中分配情况详解_

    1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但掌握Jav ...

  5. java 生成随机数_Java 生成随机数的 N 种方法

    原标题:Java 生成随机数的 N 种方法 www.baeldung.com/java-generating-random-numbers 1.引言 本文将探讨用 Java 生成随机数的不同方法. 2 ...

  6. OPC UA JAVA开发笔记(四):数据写入

    这一节我们来将如何实现Client端的数据持续写入OPC UA.一下程序均在Spring Boot环境中,请先添加相应的依赖 首先,我们准备一个RestController用于提供JSON数据. @R ...

  7. java 数组删除_Java数组删除指定元素的方法(按数组角标删除)

    Java最有效的删除数组指定元素的方法,应该属于这一种形式,下面是Java数组按角标删除数据的工具类,代码如下:public static byte[] removeTheElement(byte[] ...

  8. java private 接口_java接口中 定义 private 私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  9. java 访问手机存储卡,Android App将数据写入内部存储和外部存储的示例

    File存储(内部存储) 一旦程序在设备安装后,data/data/包名/ 即为内部存储空间,对外保密. Context提供了2个方法来打开输入.输出流 FileInputStream openFil ...

最新文章

  1. mysql decimal(10,2)对应java类型
  2. Android开机自启监听网络改变源码
  3. mysql 5.7 mts_mysql5.7 中启用MTS后error log中大量Note日志分析
  4. Cacti0.8.8a监控mysql
  5. java代码如何删除文件_Java如何删除文件和目录代码? 爱问知识人
  6. ffmpeg——vs集成ffmpeg相关开发
  7. Python自动化整理文件,还增加了可视化GUI界面
  8. windows理论基础(一)
  9. 禁用Win7自动更新后的重启提示
  10. weblogic部署静态资源文件html,weblogic部署静态html
  11. 大数据SQL如何实现笛卡尔积
  12. 智能RFID电动车防盗管理系统解决方案
  13. latex 两行 大括号_用laTeX排版大括号的三种方法
  14. XMOS 最新 USB 专业录音声卡解决方案
  15. 最新微信公众号采集方案详细介绍
  16. html5 sms短信发送_使用电子邮件免费向手机发送短信(SMS)
  17. js的间隔调用和延迟调用
  18. freessl.cn ssl申请及windows安装
  19. 关于浏览器方向的大厂面试题
  20. LeetCode: 627. 变更性别

热门文章

  1. 用再生龙Clonezilla 来克隆Linux
  2. ASP.NET MVC实践系列5-结合jQuery
  3. 熟悉交换机与路由器组网(图解)
  4. CCNP ONT LAB之PQ WFQ
  5. Flyweight 享元模式
  6. [国际A类会议] 2018最最最顶级的人工智能国际峰会汇总!CCF推荐!
  7. 第88天:HTML5中使用classList操作css类
  8. B2c商城图片尺寸设定研究 尺寸应该多大合适
  9. SQL Server查看错误日志存档编号及其详情
  10. H5中滚动卡顿的问题