You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动