ireport画模板,某个字段非定长(需要自适应换行)

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

实现步骤: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包版本一致,这都是当初遇到的问题,其实还有很多,记不住了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值