如何通过JasperReports API获取JasperReport 5.9.0 TextField的拉伸后高度
解决方案
你之前直接调用getHeight()拿到的是TextField的设计时静态高度,Stretch with Overflow的高度是报表运行时填充阶段才会动态计算的,所以无法直接从设计态对象拿到数值。
方法1:使用内置文本测量工具直接计算(推荐)
直接用JasperReports核心包提供的JRTextMeasurer工具类计算,不需要构造完整报表结构,性能更高:
import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.fill.JRTextMeasurer; import net.sf.jasperreports.engine.fill.JRTextMeasurerUtil; import net.sf.jasperreports.engine.util.JRStyledText; // 你的已有参数 JRDesignTextField textField = new JRDesignTextField(); textField.setWidth(183); textField.setHeight(38); textField.setStyle(normalStyle); textField.setStretchWithOverflow(true); textField.setExpression(expression); // 补充:从expression中取出你要显示的实际文本内容,此处假设已拿到文本为textContent String textContent = "你要显示的实际文本"; // 初始化测量器 JRTextMeasurer measurer = JRTextMeasurerUtil.getInstance(JasperReportsContext.getInstance()).createTextMeasurer(textField); // 构造带样式的文本,如果你使用的是普通无格式文本直接传值即可 JRStyledText styledText = JRStyledText.parseText(textContent, textField.getStyle(), JasperReportsContext.getInstance()); // 测量固定宽度下的文本实际高度 int textHeight = measurer.measure(styledText, textField.getWidth(), true).getHeight(); System.err.println("文本实际需要的高度:" + textHeight);
注意:要确保你用到的字体已经在JasperReports上下文里正确注册,否则会出现字体fallback导致的高度计算误差。
方法2:通过临时Band填充反算高度(适合复杂样式场景)
如果你的TextField带复杂的样式规则、条件格式等,用测量器可能会漏算参数,可以用临时报表填充的方式拿到实际高度:
import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.design.JRDesignBand; import net.sf.jasperreports.engine.design.JRDesignReport; import java.util.Collections; // 构造临时测试报表 JRDesignReport tempReport = new JRDesignReport(JasperReportsContext.getInstance()); JRDesignBand tempDetailBand = new JRDesignBand(); // 把你的TextField添加到临时Band中 tempDetailBand.addElement(textField); tempReport.setDetail(tempDetailBand); // 编译并填充临时报表 JasperReport compiledReport = JasperCompileManager.compileReport(tempReport); JasperPrint print = JasperFillManager.fillReport(compiledReport, Collections.emptyMap(), new JREmptyDataSource(1)); // 取出填充后元素的实际高度 int realHeight = print.getPages().get(0).getElements().get(0).getHeight(); System.err.println("文本实际拉伸后的高度:" + realHeight);
内容的提问来源于stack exchange,提问作者hotcat
相关产品推荐
相关产品推荐

