You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:15:58