全部:
对 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/