Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApachePOI生成excel图表_Java_Excel_Charts_Apache Poi - Fatal编程技术网

Java ApachePOI生成excel图表

Java ApachePOI生成excel图表,java,excel,charts,apache-poi,Java,Excel,Charts,Apache Poi,全部: 对于Apache POI和excel VBA来说,这是一个非常新的概念,如何使用Apache POI或任何其他Java库在Java中实现类似的内容: Excel中的VBA代码: 表格(“表格1”)。图表对象(“折线图”) .图表.轴(xlValue).最大刻度=图纸(“图纸1”).范围(“A37”) 我找不到任何与图表相关的API像这样工作,有什么想法吗 另一种方法是:我的目标是使用Java自动更新单元格A37,并将其值作为“折线图”的xAxis Max scale,现在有没有办法通过

全部:

对于Apache POI和excel VBA来说,这是一个非常新的概念,如何使用Apache POI或任何其他Java库在Java中实现类似的内容:

Excel中的VBA代码:

表格(“表格1”)。图表对象(“折线图”)
.图表.轴(xlValue).最大刻度=图纸(“图纸1”).范围(“A37”)
我找不到任何与图表相关的API像这样工作,有什么想法吗

另一种方法是:我的目标是使用Java自动更新单元格A37,并将其值作为“折线图”的xAxis Max scale,现在有没有办法通过POI直接调用此VBA代码


谢谢,

回答当前最新的稳定版本
ApachePOI3.17
。注:正在开发中。所以我们应该在以后的版本中使用

您可以通过获取图纸图形中的
列表
。从该
列表中
获取所需的
XSSFChart
。然后,通过获取图表的轴。然后从
列表中获取相应的代码。然后通过改变它的最大值

例如:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.xssf.usermodel.charts.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;

class ReadAndWriteExcelXSSFChart {

 public static void main(String[] args) throws Exception {

  Workbook workbook = WorkbookFactory.create(new FileInputStream("WBWithLineChart.xlsm"));
  Sheet sheet = workbook.getSheetAt(0);

  Row row = sheet.getRow(36); if (row == null) row = sheet.createRow(36);
  Cell cell = row.getCell(0); if (cell == null) cell = row.createCell(0);

  cell.setCellValue(10);

  double valueA37 = cell.getNumericCellValue();

  Drawing drawing = sheet.getDrawingPatriarch();
  if (drawing instanceof XSSFDrawing) {
   for (XSSFChart chart : ((XSSFDrawing)drawing).getCharts()) {
System.out.println(chart.getPackagePart().getPartName().getName());
    if (chart.getPackagePart().getPartName().getName().endsWith("chart1.xml")) { //first chart in sheet
     for (XSSFChartAxis axis : chart.getAxis()) { //all axes
System.out.println(axis);
      if (axis instanceof XSSFValueAxis) { //value axis
       axis.setMaximum(valueA37); // maximum = same value as in A37
System.out.println(axis.getMaximum());
      }
     }
    }
   }
  }

  workbook.write(new FileOutputStream("WBWithLineChart.xlsm"));
  workbook.close();

 }
}

上次我使用ApachePOI时,它对图表的支持是有限的(几年前的事了。请看这里的例子。正如POI文档所指出的。。。“但是,您可以使用命名范围在Excel中创建图表,使用HSSF修改图表数据值并写出新的电子表格。这是可能的,因为POI会尽可能保持现有记录的完整性。”。“@AlanHay谢谢,但很抱歉,我对POI还是很陌生,你能举个例子吗?我可以看到折线图已经存在于该表中,我知道如何更新单元格A37,但我不知道如何在Java中将该值传递给该图表对象