文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

关于ireport中传入list的处理方式

2023-02-14 12:02

关注

ireport中传入list的处理

今天在度娘怀里一整天,依然摸不到怎样处理对于后台的list传到ireport的方法,最后还是踏踏实实地乱打乱撞ireport这个软件,最后问题竟然解决了,再次贴出来,希望能帮到有需要的朋友。

根据需求在后台创建 list 集合

创建list

给 list 添加元素

给 list 添加元素

把 list 放到需要传到 ireport 中的参数集合中

ireport中定义一个 TOTAL_LIST 和上面 param 参数键同名

这里写图片描述

修改 TOTAL_LIST 的属性为 java.util.List

新建变量 INDEX

这里写图片描述

修改 INDEX 属性 默认为 0

这里写图片描述

把 TOTAL_LIST 拖到需要放置的地方

这里写图片描述

把 INDEX 拖到需要放置的地方,这里要和 TOTAL_LIST 同一行

这里写图片描述

对着 TOTAL_LIST 的单元格右键选 Edit expression

这里写图片描述

修改表达式

这里写图片描述

最后保存编译就 OK 了

iReport简单使用+实际应用

iReport 是什么

iReport是一个能够创建复杂报表的开源项目,并且它能调用JasperReports库应用于任何一种java应用程序。本身是分布式的且由符合GNU通用公共许可的百分之百纯java编写。

由于它丰富的图形界面,能够很快的创建出任何一种想要的报表。iReport能够让我们提高技术方面的信心,比如它能降低学习JasperReports的XML语法的难度,而且能够为熟练的技术人员节省大量的时间并能开发出非常精细的报表。

一、使用iReport软件

1. 先创建一个iReport模板

根据自己的需要来创建模板(左上角文件->new 进行创建)

2.对模板进行命名

3. 下一步 -> finish完成新建

4. 创建

5. 静态文本框、变量

6. 使用HTML语言

7. 使用背景图

使用图片时java传参样例 iReport

new ByteArrayInputStream(new Base64().decodeBase64(new StringBuffer($F{photoBase64}).toString().getBytes("UTF-8")))

java

//ep.getData() 二进制类型数据
 String s = Base64.getEncoder().encodeToString(ep.getData());
 //转base64
 //String base64 = ep.getBase64Header() + "," + s;
 if (ep.getData() == null){
     throwMsg("无照片,请先上传");
 }
 e.put("photoBase64", ep.getData());

二、java Demo示例

1. redisUtil工具类

import com.alibaba.fastjson.JSON;
import com.bjupi.utils.Utils;
import com.hyjs.examination.manage.system.action.PdfController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {

    private final StringRedisTemplate redisTemplate;

    @Autowired
    public RedisUtil(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    
    public Boolean expire(String key, long timeout, TimeUnit unit) {
        return redisTemplate.expire(key, timeout, unit);
    }

    public void hPut(String key, String hashKey, String value) {
        redisTemplate.opsForHash().put(key, hashKey, value);
    }
    
    
    public Object hGet(String key, String field) {
        return redisTemplate.opsForHash().get(key, field);
    }

    
    public String getPdfToken(String jasperName, Map<String,Object> pageData, List<Map<String,Object>> iterationData){

        String token = Utils.createUid();

        hPut(PdfController.PDF_PRINT+token, PdfController.JASPER_NAME,jasperName);
        if(pageData != null && pageData.size() > 0) {
            hPut(PdfController.PDF_PRINT+token, PdfController.PAGE_DATA, JSON.toJSONString(pageData));
        }
        if(iterationData != null && iterationData.size() > 0) {
            hPut(PdfController.PDF_PRINT+token, PdfController.ITERATION_DATA, JSON.toJSONString(iterationData));
        }
        expire(PdfController.PDF_PRINT+token, 300, TimeUnit.SECONDS);
        return token;
    }
    
}

2. controller使用

先调用 /getPrintToken 得到token

再将token作为参数传入/public/pdf-v1

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.hyjs.examination.manage.dict.ResponseData;
import io.swagger.annotations.ApiOperation;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import com.hyjs.examination.manage.util.RedisUtil;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Component
public class PdfController {

    @Autowired
    private RedisUtil redisUtil;

    //路径名称
    public static final String JASPERS_LOCAL = "jaspers";
    public static final String PDF_PRINT = "PDF:";
    public static final String JASPER_NAME = "JASPER_NAME";
    public static final String PAGE_DATA = "PAGE_DATA";
    public static final String ITERATION_DATA = "ITERATION_DATA";

    @ApiOperation("PDF打印v1版本")
    @GetMapping(value = "/public/pdf-v1")
    public String getReportByParam(@RequestParam String token, HttpServletResponse response) {
        if (StringUtils.isBlank(token)) {
            return "缺少必要参数[token]";
        }
        Object o = redisUtil.hGet(PDF_PRINT + token, JASPER_NAME);
        if (o == null || StringUtils.isBlank(o.toString())) {
            return "等待打印时间超时,请重新操作";
        }
        String jasperName = o.toString();
        String pageData = null;
        Object o1 = redisUtil.hGet(PDF_PRINT + token, PAGE_DATA);
        if (o1 != null) {
            pageData = JSON.toJSONString(o1);
        }
        String iterationData = null;
        Object o2 = redisUtil.hGet(PDF_PRINT + token, ITERATION_DATA);
        if (o2 != null) {
            iterationData = o2.toString();
        }
        return getReportByParam(jasperName, pageData, iterationData, response);
    }


    private String getReportByParam(String jasperName, String pageData, String iterationData, HttpServletResponse response) {
        String msg = "";
        if (StringUtils.isBlank(jasperName)) {
            msg = "缺少必要参数[jasperName]";
        } else {
            ClassPathResource resource = new ClassPathResource(JASPERS_LOCAL + File.separator + jasperName + ".jasper");
            InputStream jasperStream = null;

            List<Map<String, Object>> data = new ArrayList<>();
            try {

                if (StringUtils.isNotBlank(iterationData)) {
                    List<Map<String, Object>> list1 = JSON.parseObject(iterationData, new TypeReference<List<Map<String, Object>>>() {
                    });
                    if (list1 != null && list1.size() > 0) {
                        data.addAll(list1);
                    }
                }

                JSONObject page = null;
                if (StringUtils.isNotBlank(pageData)) {
                    page = JSONObject.parseObject(pageData);
                }

                if (page != null) {
                    if (data.size() > 0) {
                        for (Map<String, Object> mapInner : data) {
                            mapInner.putAll(page);
                        }
                    } else {
                        data.add(page);
                    }
                }


                JRDataSource source = new JRBeanCollectionDataSource(data);

                jasperStream = resource.getInputStream();
                JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperStream);
                JasperPrint jasperPrint = null;
                if (data.size() > 0) {
                    jasperPrint = JasperFillManager.fillReport(jasperReport, null, source);
                } else {
                    jasperPrint = JasperFillManager.fillReport(jasperReport, null, new net.sf.jasperreports.engine.JREmptyDataSource());
                }
                // pdf
                response.setContentType("application/pdf");
                response.setHeader("Content-Disposition", "inline;");
                OutputStream outputStream = response.getOutputStream();

                JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);
            } catch (Exception e) {
                e.printStackTrace();
                msg = e.getMessage();
            }
        }

        return msg;
    }

    @ApiOperation("给考生打印证书(批量or单个)")
    @PostMapping(value = "/getPrintToken")
    public ResponseData getPrintToken(@RequestBody String data){
        JSONObject jsonObject = null;
        try {
            jsonObject = JSON.parseObject(data);
        } catch (Exception e) {
            return ResponseData.warnWithMsg("错误的JSON格式。");
        }
        if (jsonObject == null) {
            return ResponseData.warnWithMsg("错误的JSON格式。");
        }
        String planUuids = jsonObject.getString("planUuids");
        String examUuids = jsonObject.getString("examUuids");
        if (StringUtils.isBlank(examUuids)) {
            return ResponseData.warnWithMsg("缺少必要参数[examUuids]。");
        }
        //ResponseData自己封装的返回类   printService.getPrintToken:数据
        ResponseData examPrintDatas = printService.getPrintToken(planUuids, examUuids);
        List<Map<String, Object>> printInfoDatas = (List<Map<String, Object>>)examPrintDatas.getData();
        String jasperName = jsonObject.getString("jasperName");
        if (StringUtils.isBlank(jasperName)) {
            return ResponseData.warnWithMsg("缺少必要参数[jasperName]。");
        }
        String token = redisUtil.getPdfToken(jasperName, null, printInfoDatas);

        return ResponseData.success(token);
    }

}

3. pom

		<!--jasper-->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.6.0</version>
        </dependency>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯