有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Apache POI生成excel图表

全部:

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

Excel中的VBA代码:

Sheets("Sheet 1").ChartObjects("Line Chart")
.Chart.Axes(xlValue).MaximumScale = Sheets("Sheet 1").Range("A37")

我找不到任何与图表相关的API像这样工作,有什么想法吗

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

谢谢


共 (1) 个答案

  1. # 1 楼答案

    回答当前最新稳定版本apache poi 3.17。注XSSFChart正在开发中。所以我们应该在以后的版本中使用XDDFChart

    您可以通过XSSFDrawing.getCharts从图纸的绘图中获得ListXSSFChart。从那List得到你需要的XSSFChart。然后通过XSSFChart.getAxis获取图表的轴。然后从该List中获取适当的XSSFValueAxis。然后通过XSSFChartAxis.setMaximum改变它的最大值

    例如:

    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();
    
     }
    }