所有:

对于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")


我找不到任何与Chart相关的API可以这样工作吗?

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

谢谢,

最佳答案

回答当前最新的稳定版本apache poi 3.17。注意XSSFChart正在开发中。因此,对于更高版本,我们应该使用XDDFChart

您可以通过XSSFChart从图纸的图形中获得XSSFDrawing.getChartsList。从该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();

 }
}

关于java - Apache POI生成Excel图表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49116931/

10-12 17:23