關于ireport中傳入list的處理方式
ireport中傳入list的處理
今天在度娘懷里一整天,依然摸不到怎樣處理對于后臺的list傳到ireport的方法,最后還是踏踏實實地亂打亂撞ireport這個軟件,最后問題竟然解決了,再次貼出來,希望能幫到有需要的朋友。
根據(jù)需求在后臺創(chuàng)建 list 集合
給 list 添加元素
把 list 放到需要傳到 ireport 中的參數(shù)集合中
ireport中定義一個 TOTAL_LIST 和上面 param 參數(shù)鍵同名
修改 TOTAL_LIST 的屬性為 java.util.List
新建變量 INDEX
修改 INDEX 屬性 默認為 0
把 TOTAL_LIST 拖到需要放置的地方
把 INDEX 拖到需要放置的地方,這里要和 TOTAL_LIST 同一行
對著 TOTAL_LIST 的單元格右鍵選 Edit expression
修改表達式
最后保存編譯就 OK 了
iReport簡單使用+實際應用
iReport 是什么
iReport是一個能夠創(chuàng)建復雜報表的開源項目,并且它能調(diào)用JasperReports庫應用于任何一種java應用程序。本身是分布式的且由符合GNU通用公共許可的百分之百純java編寫。
由于它豐富的圖形界面,能夠很快的創(chuàng)建出任何一種想要的報表。iReport能夠讓我們提高技術方面的信心,比如它能降低學習JasperReports的XML語法的難度,而且能夠為熟練的技術人員節(jié)省大量的時間并能開發(fā)出非常精細的報表。
一、使用iReport軟件
1. 先創(chuàng)建一個iReport模板
根據(jù)自己的需要來創(chuàng)建模板(左上角文件->new 進行創(chuàng)建)
2.對模板進行命名
Repoet name
:模板名Location
:文件存放地址File
:模板文件全路徑
3. 下一步 -> finish完成新建
4. 創(chuàng)建
5. 靜態(tài)文本框、變量
6. 使用HTML語言
7. 使用背景圖
使用圖片時java傳參樣例 iReport
new ByteArrayInputStream(new Base64().decodeBase64(new StringBuffer($F{photoBase64}).toString().getBytes("UTF-8")))
java
//ep.getData() 二進制類型數(shù)據(jù) String s = Base64.getEncoder().encodeToString(ep.getData()); //轉(zhuǎn)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); } /** * 獲取PDF打印臨時token * @param jasperName 報表名稱(無需帶后綴) * @param pageData 頁面數(shù)據(jù)(非迭代數(shù)據(jù)) * @param iterationData 迭代數(shù)據(jù) * @return * @throws Exception */ 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使用
先調(diào)用 /getPrintToken 得到token
再將token作為參數(shù)傳入/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 "缺少必要參數(shù)[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 = "缺少必要參數(shù)[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("缺少必要參數(shù)[examUuids]。"); } //ResponseData自己封裝的返回類 printService.getPrintToken:數(shù)據(jù) 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("缺少必要參數(shù)[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>
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Mybatis中的mapper是如何和XMl關聯(lián)起來的
這篇文章主要介紹了Mybatis中的mapper是如何和XMl關聯(lián)起來的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06Intelli IDEA安裝Scala插件并安裝Scala軟件和配置環(huán)境變量的詳細教程
這篇文章主要介紹了Intelli IDEA安裝Scala插件并安裝Scala軟件和配置環(huán)境變量的詳細教程,需要的朋友可以參考下2020-10-10