使用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重写整个工具了,但之前已经投入了大量工作量,实在不想推倒重来。提前谢谢各位的帮忙!




