/** * 转换为pdf展示,也就是在线预览 * * @param reportName * @param parameters * @param response * @throws SQLException * @throws ClassNotFoundException * @throws JRException * @throws IOException */ @GetMapping("/{reportName}") public void getReportByParam( @PathVariable("reportName") final String reportName, @RequestParam(required = false) Map parameters, HttpServletRequest request, HttpServletResponse response) throws SQLException, ClassNotFoundException, JRException, IOException { parameters = parameters == null ? new HashMap() : parameters; if (reportName.equals("query2")){ parameters.put("wave_code",parameters.get("waveCode")); }else if (reportName.equals("queryByWaveCode")){ parameters.put("wave_code",parameters.get("waveCode")); } Connection connection = dataSource.getConnection(); //获取文件流 ClassPathResource resource = new ClassPathResource(reportName + ".jasper"); InputStream in = resource.getInputStream(); JasperReport jasperReport = (JasperReport) JRLoader.loadObject(in); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters,connection ); // JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, new JREmptyDataSource()); response.setContentType("application/pdf"); /*response.setContentType("text/html;");*/ response.setHeader("Content-Disposition", "inline;"); final OutputStream outputStream = response.getOutputStream(); JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream); try { connection.close(); in.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } }
//打印功能 @GetMapping("/printReport/{reportName}") public void printReport( @PathVariable("reportName") final String reportName, @RequestParam(required = false) Map parameters, HttpServletRequest request, HttpServletResponse response) throws SQLException, ClassNotFoundException, JRException, IOException { parameters = parameters == null ? new HashMap() : parameters; if (reportName.equals("query2")){ parameters.put("wave_code",parameters.get("waveCode")); }else if (reportName.equals("queryByWaveCode")){ parameters.put("wave_code",parameters.get("waveCode")); } //获取文件流 ClassPathResource resource = new ClassPathResource(reportName + ".jasper"); InputStream in = resource.getInputStream(); JasperReport jasperReport = (JasperReport) JRLoader.loadObject(in); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource.getConnection()); //打印 JasperPrintManager.printReport(jasperPrint,true); }}这里面可以看到有两个方法,第一个方法是在线查看报表,也就是在线预览,第二个方法就是打印报表,接下来我大致解释一下: 首先,接收参数就不用多说了,这里采用了变量名作为路径,也就是jasper文件名字,请求后台路径也就是这样子的/jasperReport/printReport/query2。当然,这里我自己使用的jasper文件名字是query2。参数中reportName也就是文件名字,parameters中可以放需要传递的参数,比如说所要查的报表要有参数传递,参数就可以放到parameters中,在这里我是传递了一个参数,就是waveCode,接下来我又判断了一下,重新又赋了一下值wave_code,直接传递waveCode是有问题的,具体原理我认为可能是报表的sql语句的我用的参数就是wave_code,页面上传过来的是waveCode。
接下来的代码就是利用输入输出流以及JasperReport对象提供的方法来返回一个pdf文件,放到response中,因为是把文件放到连接池中的,所以最后要关闭,不然在线预览点几下连接池就崩溃了,很麻烦的。
第二个方法是打印报表,因为请求路径用了变量来传,所以又多加了一层,不然他没办法请求到的。然后利用JasperReport对象内置的打印方法,然后调出打印机进行打印。
要注意一点就是,idea中要设置VMoptions,如同所示:但是在服务器上只运行jar包的话就会有一个问题,也就是linux系统上,这个VMoptions没办法设置的,但是可以通过启动传参运行,nohup java -Djava.awt.headless=false -jar jeecg-boot-module-system-2.1.1.jar >catalina.out 2>&1 & (jar包名字自己做对应修改)