如何在Apache POI生成的Stacked Bar Chart中实现Y轴标签不增宽换行
实现Apache POI堆叠条形图Y轴标签换行(不增加宽度)
要解决这个问题,我们需要从标签文本处理和轴属性配置两个方面入手,既让标签内容能自动拆分换行,又确保Excel渲染时不额外增加图表宽度。
步骤1:为Y轴标签添加换行符
首先,你需要在设置需求名称(Y轴标签)时,手动插入换行符\n拆分过长文本,或者根据文本长度自动拆分。比如修改你填充数据的代码:
// 填充数据时处理Y轴标签换行 if(!estimationDelays.isEmpty){ for(e <- estimationDelays){ cnt = cnt + 1 var row = sheet.createRow(cnt); var name = e.requirement_name // 示例:每15个字符自动插入换行(可根据需求调整长度) val maxLabelLength = 15 if (name.length > maxLabelLength) { name = name.grouped(maxLabelLength).mkString("\n") } var initial = e.initial_delayed_days.get.toString() + " " // ... 其他单元格赋值逻辑 ... row.createCell(0).setCellValue(name) // ... 其他单元格设置 ... } }
这样Excel渲染标签时,会识别\n作为换行标记,将长文本拆分为多行。
步骤2:配置Y轴(分类轴)允许自动换行
接下来需要在分类轴(Y轴)的配置中开启自动换行属性,确保Excel支持标签换行显示。在你创建ctCatAx的代码之后,添加以下配置:
//cat axis var ctCatAx = ctPlotArea.addNewCatAx(); ctCatAx.addNewAxId().setVal(123456); //id of the cat axis var ctScaling = ctCatAx.addNewScaling(); ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX); ctCatAx.addNewDelete().setVal(false); ctCatAx.addNewAxPos().setVal(STAxPos.B); ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO); // 新增:配置Y轴标签自动换行属性 val ctTxPr = ctCatAx.addNewTxPr() val ctBodyPr = ctTxPr.addNewBodyPr() // 开启自动换行功能 ctBodyPr.addNewWrap().setVal(STTextWrap.SQUARE) // 设置文本锚点为顶部,保证换行后对齐美观 ctBodyPr.addNewAnchor().setVal(STTextAnchorType.TOP) // 配置默认文本样式(可选,确保标签样式统一) val ctP = ctTxPr.addNewP() val ctPPr = ctP.addNewPPr() ctPPr.addNewDefRPr()
这段代码通过操作OOXML的CT(Core Type)层级对象,开启了Y轴标签的自动换行权限,让Excel能够正确渲染带换行符的标签内容。
原理说明
Apache POI的XSSF图表基于Office Open XML规范,高级样式需要直接操作CT层级对象。通过开启轴的Wrap属性,再配合标签文本中的\n换行符,Excel会自动将长标签拆分为多行显示,且不会额外增加图表的宽度。
内容的提问来源于stack exchange,提问作者ankita lembhe
相关产品推荐
相关产品推荐

