JasperReport 一种实现横向循环展示的方法

目录

具体实现步骤:

1、根据需求展示数据设计原始数据查询sql

2、数据处理

3、jasperReport操作:

4、字体配置:

5、保存后,重新Rebuild下,加载上resource中新加入的文件。开启项目进行导出pdf。

总结:


具体实现步骤:

1、根据需求展示数据设计原始数据查询sql

2、数据处理

        对原始数据进行处理,将其放入一个拼接的String中,并进行String.format 对齐处理,最后放入List<StringVo>中。StringVo类中只有一个String字段lineVal。

3、jasperReport操作:

        3.1 在detail中拖入table组件,并选择java传过来的数据源,具体数据源怎么对应,请查看专栏的其他文章,这个网上资料较多,多看就会了。

        3.2 进入table后,设置lineVal的字体格式为:Conrier New,其他字体格式根据需求设置。

        3.3 保存,并编译成jasper文件,放入idea项目中待用。

4、字体配置:

        4.1 进入C:\\windows\\fonts目录下 找到Conrier New字体,复制到idea项目中为展示jasperReport导出PDF的中文字体而进行另外配置的文件夹下。我只用了普通字体,没有斜体加粗什么的,故有用的文件就cour.ttf,其他的文件可以不复制进来

        4.2 修改fonts.xml 中增加curier new字体的配置,如下:

<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
    <fontFamily name="微软雅黑">
        <normal>jaspers/fonts/msyh.ttf</normal>
        <bold>jaspers/fonts/msyh.ttf</bold>
        <italic>jaspers/fonts/msyh.ttf</italic>
        <boldItalic>jaspers/fonts/msyh.ttf</boldItalic>
        <pdfEncoding>Identity-H</pdfEncoding>
        <pdfEmbedded>true</pdfEmbedded>
        <exportFonts>
            <export key="net.sf.jasperreports.html">'微软雅黑', Arial, Helvetica, sans-serif</export>
            <export key="net.sf.jasperreports.xhtml">'微软雅黑', Arial, Helvetica, sans-serif</export>
        </exportFonts>
    </fontFamily>
    <fontFamily name="Courier New">
        <normal>jaspers/fonts/cour.ttf</normal>
        <bold>jaspers/fonts/cour.ttf</bold>
        <italic>jaspers/fonts/cour.ttf</italic>
        <boldItalic>jaspers/fonts/cour.ttf</boldItalic>
        <pdfEncoding>Identity-H</pdfEncoding>
        <pdfEmbedded>true</pdfEmbedded>
        <exportFonts>
            <export key="net.sf.jasperreports.html">'Courier New', Arial, Helvetica, sans-serif</export>
            <export key="net.sf.jasperreports.xhtml">'Courier New', Arial, Helvetica, sans-serif</export>
        </exportFonts>
    </fontFamily>
</fontFamilies>

5、保存后,重新Rebuild下,加载上resource中新加入的文件。开启项目进行导出pdf。

横向循环展示,最终实现效果如下:

下面是这个需求的具体实现步骤历程。

数据库中查询出来List数据为:

[
	{
		"deviceName": "N92",
		"deviceNo": "801092",
		"tempVal1Avg": "24.80"
	},
	{
		"deviceName": "N94",
		"deviceNo": "801094",
		"tempVal1Avg": "24.66"
	},
	{
		"deviceName": "N93",
		"deviceNo": "801093",
		"tempVal1Avg": "24.58"
	},
...
]

要想实现上图的横向循环展示效果,需要将list数据循环处理下,只保留deviceName和tempVal1Avg的值。

int countSize = 0;
StringBuffer lineVal = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
	StringVo avgInfo = list.get(i);
    //事先估算好展示数据的长度,此处只是粗略估算的,如果出现数据太长的情况,需要进行其他的处理
    //根据数据查看 每行展示4个数据,多了就会出现后面的展示不出来的情况
	if (countSize == 4 || i == list.size() - 1) {
		System.out.println(lineVal.toString());
		lineList.add(new StringVo(lineVal.toString()));
		countSize = 0;
		lineVal = new StringBuffer();
	} else if (countSize > 0) {
        //数据与数据之间使用 --> 间隔
		lineVal.append("  --> ");
	}
    //对数据进行format对齐处理,如果要左对齐可以改成%-8s,详细用法请搜索String.format方法使用
	lineVal.append(String.format("%8s :  %5s", avgInfo.getDeviceName(), avgInfo.getTempVal1Avg()));
	countSize++;
}

System.out打印出来的内容如下:

 虽然sout打印出来的内容是对齐的,但是jasperReport如果不做处理展示出来的数据并不是对齐的,因为字体不一样空格展示的宽度也不一样,所以要对展示数据的字体进行设置下。

jasperReport 模板配置完成后,要进行展示还需要再项目中配置展示字体Courier New。具体配置上面已经写了,这里不再赘述。

总结:

        尝试过list、crosstab、table 没有找到实现方法,最终相当于曲线救国,通过处理好字符串后,在jasperReport直接展示,虽然碰到了字体导致无法对齐问题,但最终还是通过chatgpt找到了解决方法,感谢。

如有小伙伴找到list或者table或者crosstab可以实现横向循环展示的,还请告知下,万分感谢。

JasperReport 复杂处理资料甚少,欢迎交流,共同进步。Q 335381879  W18660409166 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值