使用Apache POI组合柱状图与折线图时如何避免双Y轴?
解决Apache POI组合条形图+折线图的双Y轴问题
嘿,我之前也踩过这个一模一样的坑!当你在POI里给已有图表添加第二种类型(比如折线图)时,它默认会自动给新系列分配右侧的副Y轴,这就是你看到双Y轴的原因。咱们只需要手动把折线图的系列绑定到左侧的主Y轴就行,下面是具体的解决方法:
问题根源
Apache POI为了区分不同类型的图表系列,默认会给后续添加的图表类型创建独立的副轴。但咱们的需求是让两个图表共享同一个Y轴,所以需要手动覆盖这个默认行为。
修改你的代码
在你创建完折线图数据并添加系列之后,加入这段关键代码,把折线系列绑定到已有的左侧Y轴:
// 假设你已经创建了条形图的Y轴(yAxis)和折线图数据(lineData) for (XDDFLineChartData.Series series : lineData.getSeries()) { series.setAxis(yAxis); // 将折线系列指定为使用主Y轴 }
如果你是按示例的完整流程写的,这里给你一个更完整的代码参考片段,贴合你的XSSF代码结构:
File file = null; FileOutputStream fos = null; try { XSSFWorkbook workBook = new XSSFWorkbook(); XSSFSheet sheet = workBook.createSheet("ChartData"); // 1. 先填充你的数据到sheet中... // 2. 创建绘图区域和锚点 XSSFDrawing drawing = sheet.createDrawingPatriarch(); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 5, 1, 15, 20); XSSFChart combinedChart = drawing.createChart(anchor); // 3. 设置图表标题 combinedChart.setTitleText("组合图表(条形+折线)"); combinedChart.setTitleOverlay(false); // 4. 创建主X轴和Y轴 XDDFCategoryAxis xAxis = combinedChart.createCategoryAxis(AxisPosition.BOTTOM); XDDFValueAxis yAxis = combinedChart.createValueAxis(AxisPosition.LEFT); yAxis.setCrosses(AxisCrosses.AUTO_ZERO); // 5. 创建并添加条形图数据 XDDFBarChartData barData = (XDDFBarChartData) combinedChart.createData(ChartTypes.BAR, xAxis, yAxis); // 这里添加你的条形图系列数据... // 6. 创建并添加折线图数据 XDDFLineChartData lineData = (XDDFLineChartData) combinedChart.createData(ChartTypes.LINE, xAxis, yAxis); // 这里添加你的折线图系列数据... // ===== 关键修复:绑定折线系列到主Y轴 ===== for (XDDFLineChartData.Series series : lineData.getSeries()) { series.setAxis(yAxis); } // 7. 绘制组合图表 combinedChart.plot(barData, lineData); // 8. 写入文件 file = new File("combined-chart.xlsx"); fos = new FileOutputStream(file); workBook.write(fos); } catch (Exception e) { e.printStackTrace(); } finally { try { if (fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } }
为什么这样有效?
这段代码强制让折线图的所有系列使用已经创建好的左侧主Y轴,而不是让POI自动生成新的右侧副轴。这样条形图和折线图就会共享同一个Y轴,不会再出现双Y轴的问题了。
内容的提问来源于stack exchange,提问作者G.Price




