需求:在制作模板的过程中,某个字段变量,如果长度不足就正常显示,如果长度太长,就需要将字号变小,并且换行显示,如下图的对比效果,这是同一个模板生成的两张图片。


实现步骤:1 将名称这个位置的变量,替换成如下代码:$P{remark2}.length()>16 ? $P{remark2}.substring(0,16)+"\n"+($P{remark2}.length()>=32 ?$P{remark2}.substring(16,32): $P{remark2}.substring(16)) : $P{remark2}
代码含义:就是超过定长后,需要截取一部分,剩下的换行显示。

步骤2:新建一个styles,并写上条件,这个作用是当满足一定条件后,就会换另外一种样式显示,比如换成小字号的样式



步骤3 ,将这个样式和文本关联起来,选中,然后右侧下拉选择刚才新建的那个样式。

步骤4:在xml面板中,将这个remark2的那块代码的原本的字号给删除掉,不然之前新建的那个styles会不生效,

再次编辑(2024年12月10日17:51:17)
前边两张图裂了,我也不知道啥原因,就那样吧。
然后补充一下,之前的那个需求没变,可是上面的办法有弊端,$P{remark2}.length()>16 ? $P{remark2}.substring(0,16)+"\n"+($P{remark2}.length()>=32 ?$P{remark2}.substring(16,32): $P{remark2}.substring(16)) : $P{remark2} 这个表达是中,length函数对中文有效,但是碰到规格型号字段,掺杂了英文,数字,中文这种情况计算是不准确的。
所以不能单单计算长度,应该计算字符数,比如中文占2,英文数字各占1,不光在字符上体现,就在ireport画模板上,中文显示也要比字母数字宽。
所以上面那招不好用了。
下面的办法是我在家里弄到凌晨一点半,没弄出来,第二天周末去公司弄了一天才弄出来的办法,期间遇到了无数的坑试了很多办法,因为ireport这个软件已经停产,五六年前的软件,其次网上的教程非常少。
费死劲了。如果对大家有帮助的就点个赞吧。
大体思路:
你要写个程序,java程序,编程,获取字符数:代码我贴出来:
package com.util;
public class MyHelper {
/**
* 格式化字符串,按给定长度插入换行符
* @param input 原始字符串
* @param maxLength 每行的最大字符长度(中文字符算2)
* @return 格式化后的字符串
*/
public static String formatStringWithLineBreak(String input, int maxLength) {
if (input == null || input.isEmpty()) return "";
StringBuilder result = new StringBuilder();
int currentLength = 0;
for (char c : input.toCharArray()) {
// 判断字符长度(中文=2,其他=1)
int charLength = Character.toString(c).matches("[\\u4e00-\\u9fa5]") ? 2 : 1;
currentLength += charLength;
result.append(c);
// 如果到达 maxLength,添加换行符
if (currentLength >= maxLength) {
result.append("\n");
currentLength = 0;
}
}
return result.toString();
}
/**
* 获取格式化后的字符串总长度(中文字符算2个字符,其他字符算1个字符)
* @param input 原始字符串
* @return 字符串的最终长度
*/
public static int getFormattedLength(String input) {
if (input == null || input.isEmpty()) return 0;
int totalLength = 0;
for (char c : input.toCharArray()) {
// 判断字符长度(中文=2,其他=1)
int charLength = Character.toString(c).matches("[\\u4e00-\\u9fa5]") ? 2 : 1;
totalLength += charLength;
}
return totalLength;
}
}
两个方法,一个是获取字符数长度,一个是根据传参+换行。
打成jar包,引入ireport。
改表达式:com.util.MyHelper.getFormattedLength($P{remark4}) > 14 ?
com..util.MyHelper.formatStringWithLineBreak($P{remark4}, 24):$P{remark4};

上面style条件这块也要改:
com..util.MyHelper.getFormattedLength($P{remark3}) > 14

别看现在这么好像很简单的样子,当时为了实现这个,甚至研究了好久的ireport的 scriptlets也没成功。
上述办法需要注意,ireport的版本和你程序中ireport的jar包版本一致,这都是当初遇到的问题,其实还有很多,记不住了。

7956

被折叠的 条评论
为什么被折叠?



