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

使用Apache POI设置Excel图表分类轴位置为“在刻度线上”失效的问题求助

使用Apache POI设置Excel图表分类轴位置为“在刻度线上”失效的问题求助

问题背景

各位大佬好,我最近在使用Apache POI生成包含多工作表和复杂图表的Excel工作簿。单元格的数据写入和格式设置都还算顺利,但图表格式调整这块彻底卡壳了——我现在想实现的是:把折线图的分类(X)轴调整成第一个数据点直接落在Y轴上,对应Excel手动操作里的「设置坐标轴格式」→「坐标轴位置」选择「在刻度线上」这个效果。

尝试过的方案及问题

一开始我找AI工具帮忙,结果它给的十多段示例代码全无效:要么调用了protected方法,要么用了已废弃的API,甚至还有根本不存在的方法。最后它建议我用反射操作底层XML Bean,给了这段代码:

public void setAxisCrossing() {
    // 1. Get the axes from your XDDFChart instance
    XDDFCategoryAxis categoryAxis = null;
    XDDFValueAxis valueAxis = null;

    for (XDDFChartAxis axis : chart.getAxes()) {
        if (axis instanceof XDDFCategoryAxis) categoryAxis = (XDDFCategoryAxis) axis;
        if (axis instanceof XDDFValueAxis) valueAxis = (XDDFValueAxis) axis;
    }

    if (categoryAxis != null && valueAxis != null) {
        try {
            // --- PART 1: REMOVE GAP (Start labels/ticks AT the axis) ---
            // Setting MID_CAT on the value axis makes data start exactly on the axis line.
            valueAxis.setCrossBetween(AxisCrossBetween.MIDPOINT_CATEGORY);

            // --- PART 2: SET CROSSING TO FIRST DATA POINT ---
            // Access the protected XML bean via reflection to set precise 'crossesAt'
            Field field = XDDFCategoryAxis.class.getDeclaredField("ctCatAx");
            field.setAccessible(true);
            CTCatAx ctCatAx = (CTCatAx) field.get(categoryAxis);

            // Clear any existing crossing settings to prevent conflicts
            if (ctCatAx.isSetCrosses()) ctCatAx.unsetCrosses();

            // Define crossing at the 1st category (1-based index)
            if (!ctCatAx.isSetCrossesAt()) {
                ctCatAx.addNewCrossesAt().setVal(1.0);
            } else {
                ctCatAx.getCrossesAt().setVal(1.0);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这段代码编译、运行都没报错,但图表的坐标轴设置完全没变化——分类轴还是保持默认的「在刻度线之间」。更糟的是,当我在散点图里用日期作为分类轴尝试这段代码时,直接导致图表损坏了。

我后来还单独测试了关键语句valueAxis.setCrossBetween(AxisCrossBetween.MIDPOINT_CATEGORY);,把代码简化到只剩核心逻辑,但还是没达到预期效果。

补充信息

我已经把简化后的测试代码(包含main.java、pom.xml)以及想要实现目标效果的参考Excel文件整理好了,代码里只保留了调整轴位置的关键逻辑,但依然无效。

求助点

实在搞不懂哪里出问题了,有没有大佬能指点一下?真的快被逼得想转用Python重写整个工具了,但之前已经投入了大量工作量,实在不想推倒重来。提前谢谢各位的帮忙!

火山引擎 最新活动