java - Apache POI 生成 excel 图表

标签 java excel charts apache-poi

全部:

对 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 比例,现在有没有办法通过 POI 直接调用此 VBA 代码?

谢谢

最佳答案

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

您可以获得XSSFChart列表来自图纸的绘图:XSSFDrawing.getCharts 。从该List 获取所需的XSSFChart。然后通过 XSSFChart.getAxis 获取该图表的轴。然后获取相应的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/

相关文章:

java - 在android中的复选框上设置背景颜色

javascript - "Excel.run"是否不适用于用户定义的函数?

具有多个条件的 Excel DSUM

vba - Excel VBA 隐藏列表列移位

javascript - D3 按名称而不是值对层次结构条进行排序

java - 为什么 Java Swing 程序不能显示变音符号(ä、ö、...)等德语字符?

java - 克隆内部类定义的对象

java - Eclipse JDK 8 配置

charts - 使用 HighCharts 的多系列时间线

c++ - 如何在执行时更新图表中的数据(在 C++ 构建器中)?