环境:
jdk1.8
Jaspersoft Studio 6.5.0
Jasperreport 6.5.0
Springboot 1.5.x
一 用Jaspersoft Studio报表设计器设计一个报表test.jrxml
此处省略
二 整合springboot实现pdf预览报表数据 采用javabean数据方式
pom.xml增加
<dependency> <groupId>net.sf.jasperreportsgroupId> <artifactId>jasperreportsartifactId> <version>6.5.0version> dependency> <dependency> <groupId>net.sf.jasperreportsgroupId> <artifactId>jasperreports-fontsartifactId> <version>6.0.0version> dependency> <dependency> <groupId>com.itextpdfgroupId> <artifactId>itextpdfartifactId> <version>5.5.0version> dependency> <dependency> <groupId>com.itextpdfgroupId> <artifactId>itext-pdfaartifactId> <version>5.5.0version> dependency> <dependency> <groupId>com.itextpdfgroupId> <artifactId>itext-asianartifactId> <version>5.2.0version> dependency> <dependency> <groupId>cn.lespergroupId> <artifactId>iTextAsianartifactId> <version>3.0version> dependency> <dependency> <groupId>org.codehaus.groovygroupId> <artifactId>groovy-allartifactId> <version>2.4.11version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-context-supportartifactId> dependency>
在src/main/resources下增加jasperreport文件夹 并将test.jrxml文件放入此处
控制器部分代码
@Autowired private ApplicationContext appContext; public ListgetProductList() { List list = new ArrayList<>(); for (int i = 1; i <= 20; i++) { list.add(new Product(String.valueOf(i), "名称" + i)); } return list; } @RequestMapping(path = "/pdfPreview", method = RequestMethod.GET) public ModelAndView pdfPreview() { JasperReportsPdfView view = new JasperReportsPdfView(); view.setUrl("classpath:jasperreport/test.jrxml"); view.setApplicationContext(appContext); Map params = new HashMap<>(); //列表数据源 数据源字段名称和类型需要和报表设计的字段一致 params.put("datasource", getProductList()); //给参数赋值 params.put("Parameter1", "hello 你好"); return new ModelAndView(view, params); } //html预览 前端调用 @RequestMapping(path = "/htmlPreview", method = RequestMethod.GET) public void reportHtml(HttpServletRequest request, HttpServletResponse response) throws Exception { JRDataSource jrBeanCollectionDataSource = new JRBeanCollectionDataSource(getProductList()); Map params = new HashMap(); params.put("Parameter1", "hello 你好"); //编译jrxml文件,生成jasper文件 URL url = this.getClass().getClassLoader().getResource("jasperreport/test.jrxml"); JasperCompileManager.compileReportToFile(url.getPath()); File jasperFile = ResourceUtils.getFile("classpath:jasperreport/test.jasper"); JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, jrBeanCollectionDataSource); JasperExportManager.exportReportToHtmlFile(jasperPrint, request.getServletContext().getRealPath("/") + "reportPreviewTemp.html"); response.sendRedirect("reportPreviewTemp.html"); } @RequestMapping(path = "/pdfExport", method = RequestMethod.GET) public String pdfExport(HttpServletRequest request, HttpServletResponse response) throws Exception { JRDataSource jrBeanCollectionDataSource = new JRBeanCollectionDataSource(getProductList()); Map params = new HashMap(); params.put("Parameter1", "hello 你好"); //编译jrxml文件,生成jasper文件 URL url = this.getClass().getClassLoader().getResource("jasperreport/test.jrxml"); JasperCompileManager.compileReportToFile(url.getPath()); File jasperFile = ResourceUtils.getFile("classpath:jasperreport/test.jasper"); JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, jrBeanCollectionDataSource); JRPdfExporter pdf = new JRPdfExporter(); pdf.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); pdf.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream()); String fileName = new String("测试.pdf".getBytes("utf-8"), "ISO_8859_1"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setContentType("application/pdf"); response.setCharacterEncoding("utf-8"); pdf.exportReport(); return null; } //预览并浏览器自动弹出打印 @RequestMapping(path = "/previewPrint", method = RequestMethod.GET) public void previewPrint(HttpServletRequest request, HttpServletResponse response) throws Exception { JRDataSource jrBeanCollectionDataSource = new JRBeanCollectionDataSource(getProductList()); Map params = new HashMap(); params.put("Parameter1", "hello 你好"); //编译jrxml文件,生成jasper文件 URL url = this.getClass().getClassLoader().getResource("jasperreport/test.jrxml"); JasperCompileManager.compileReportToFile(url.getPath()); File jasperFile = ResourceUtils.getFile("classpath:jasperreport/test.jasper"); JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile); byte[] pdfStream = JasperRunManager.runReportToPdf(jasperReport, params, jrBeanCollectionDataSource); PdfReader reader = new PdfReader(pdfStream); ByteArrayOutputStream bos = new ByteArrayOutputStream(pdfStream.length); try { // 给pdf加上脚本实现自动打印 StringBuffer script = new StringBuffer(); script.append("this.print({bUI:false,bSilent:true,bShrinkToFit:false});"); PdfStamper stamp = new PdfStamper(reader, bos); stamp.setViewerPreferences(PdfWriter.HideMenubar | PdfWriter.HideToolbar | PdfWriter.HideWindowUI); stamp.addJavaScript(script.toString()); stamp.close(); } catch (Exception e) { } // 输出pdf byte[] bytes = bos.toByteArray(); if (bytes != null && bytes.length > 0) { response.setContentType("application/pdf"); response.setContentLength(bytes.length); response.setHeader("Expires", "0"); response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); response.setHeader("Pragma", "public"); ServletOutputStream ouputStream = response.getOutputStream(); try { ouputStream.write(bytes, 0, bytes.length); ouputStream.flush(); } finally { if (ouputStream != null) { try { ouputStream.close(); } catch (IOException ex) { } } } } } //连接打印机打印 @RequestMapping(path = "/print1", method = RequestMethod.GET) public void print1(HttpServletRequest request, HttpServletResponse response) throws Exception { JRDataSource jrBeanCollectionDataSource = new JRBeanCollectionDataSource(getProductList()); Map params = new HashMap(); params.put("Parameter1", "hello 你好"); //编译jrxml文件,生成jasper文件 URL url = this.getClass().getClassLoader().getResource("jasperreport/test.jrxml"); JasperCompileManager.compileReportToFile(url.getPath()); File jasperFile = ResourceUtils.getFile("classpath:jasperreport/test.jasper"); JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, jrBeanCollectionDataSource); //设置打印方向 LANDSCAPE横向 PORTRAIT竖向 jasperPrint.setOrientation(OrientationEnum.LANDSCAPE); //withPrintDialog表示在打印的时候是否显示打印机设置对话框 JasperPrintManager.printReport(jasperPrint, false); }
访问可以看到实现了pdf预览,但是中文没有显示
可以在报表设计器设置对应字段元素属性
pdfFontName设置成"STSong-Light"
pdfEncoding设置成"UniGB-UCS2-H"
isPdfEmbedded设置成"true"
字段元素太多一个个设置 太麻烦 可以在test.jrxml文件统一设置默认属性
在property节点后面增加一行自定义样式
<style name="myStyle" isDefault="true" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>
再次拷贝该jrxml文件到项目中,重启应用再访问 可以看到显示了中文
附上test.jrxml内容
xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="test" pageWidth="683" pageHeight="397" columnWidth="643" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="5e3bdc2e-17e7-44d3-bf7e-c714ccba4acd"> <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/> <style name="myStyle" isDefault="true" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/> <subDataset name="Dataset1" uuid="117df1fc-65c8-4b6e-ac00-35ce27f2173f"> <queryString> queryString> subDataset> <parameter name="Parameter1" class="java.lang.String" isForPrompting="false"/> <queryString> queryString> <field name="id" class="java.lang.String"/> <field name="name" class="java.lang.String"/> <background> <band splitType="Stretch"/> background> <pageHeader> <band height="56" splitType="Stretch"> <staticText> <reportElement positionType="Float" x="240" y="10" width="100" height="30" uuid="4be77cf7-7531-4f83-8f55-f5c04ede9136"/> <textElement> <font size="18"/> textElement> <text>单 据]]>text> staticText> <textField> <reportElement x="340" y="10" width="110" height="30" uuid="fac9ba58-f08b-4010-b22b-da3e61c3935e"/> <textElement textAlignment="Right"/> <textFieldExpression>"Page " + $V{PAGE_NUMBER}]]>textFieldExpression> textField> <textField evaluationTime="Report"> <reportElement x="450" y="10" width="100" height="30" uuid="825fa517-39e6-4618-a96d-a9b1b1a10ec6"/> <textElement textAlignment="Left"/> <textFieldExpression>" of " + $V{PAGE_NUMBER}]]>textFieldExpression> textField> <textField isBlankWhenNull="true"> <reportElement x="73" y="25" width="100" height="30" uuid="b6308366-897f-4472-8ab8-19d2f8ca7424"/> <textFieldExpression>$P{Parameter1}]]>textFieldExpression> textField> band> pageHeader> <columnHeader> <band height="30" splitType="Stretch"> <staticText> <reportElement x="162" y="10" width="70" height="20" backcolor="#FFFFFF" uuid="10e12ad7-e1c5-4008-be59-e69474063d8d"/> <box> <topPen lineWidth="1.0"/> <leftPen lineWidth="1.0"/> <bottomPen lineWidth="1.0"/> <rightPen lineWidth="1.0"/> box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font isBold="true"/> textElement> <text>序号]]>text> staticText> <staticText> <reportElement x="232" y="10" width="70" height="20" backcolor="#FFFFFF" uuid="c5a567e9-8fa1-4393-9bcf-c5764414813b"/> <box> <topPen lineWidth="1.0"/> <leftPen lineWidth="1.0"/> <bottomPen lineWidth="1.0"/> <rightPen lineWidth="1.0"/> box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font isBold="true"/> <paragraph lineSpacing="Single"/> textElement> <text>编号]]>text> staticText> <staticText> <reportElement stretchType="RelativeToBandHeight" x="302" y="10" width="70" height="20" backcolor="#FFFFFF" uuid="5c24a436-285f-45f6-bccb-d31cd40128f9"/> <box> <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font isBold="true"/> textElement> <text>名称]]>text> staticText> band> columnHeader> <detail> <band height="20" splitType="Stretch"> <textField> <reportElement x="162" y="0" width="70" height="20" uuid="60afe658-137c-429e-9951-ce9cfdc7696d"> <property name="com.jaspersoft.studio.spreadsheet.connectionID" value="61453adc-a515-4954-bc49-44fc1e3bb7af"/> <property name="com.jaspersoft.studio.unit.height" value="px"/> reportElement> <box> <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> box> <textElement textAlignment="Center" verticalAlignment="Middle"/> <textFieldExpression>$V{REPORT_COUNT}]]>textFieldExpression> textField> <textField isBlankWhenNull="true"> <reportElement x="232" y="0" width="70" height="20" uuid="f8367ae9-a695-45e3-bd1c-cb4392a44754"> <property name="com.jaspersoft.studio.spreadsheet.connectionID" value="61453adc-a515-4954-bc49-44fc1e3bb7af"/> reportElement> <box> <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> box> <textElement textAlignment="Center" verticalAlignment="Middle"/> <textFieldExpression>$F{id}]]>textFieldExpression> textField> <textField isBlankWhenNull="true"> <reportElement x="302" y="0" width="70" height="20" uuid="fa59b15a-3e81-4354-b0cd-0240618fe99f"> <property name="com.jaspersoft.studio.spreadsheet.connectionID" value="77533d37-8f7a-46b5-b629-15f7cea898ca"/> reportElement> <box> <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> box> <textElement textAlignment="Center" verticalAlignment="Middle"/> <textFieldExpression>$F{name}]]>textFieldExpression> textField> band> detail> <columnFooter> <band height="56" splitType="Stretch"> <staticText> <reportElement positionType="Float" x="240" y="10" width="100" height="30" uuid="d9b9e6f5-2bb1-4c07-bda5-19c358c7d49f"/> <textElement> <font size="18"/> textElement> <text>column foot]]>text> staticText> band> columnFooter> <pageFooter> <band height="81" splitType="Stretch"> <staticText> <reportElement positionType="Float" x="240" y="10" width="100" height="30" uuid="1eb55c2c-320e-47bd-8373-23fe8bc4d07d"/> <textElement> <font size="18"/> textElement> <text>page foot]]>text> staticText> <line> <reportElement positionType="Float" x="177" y="64" width="200" height="1" uuid="ef26a332-3079-4745-9af1-232a24281bc9"> <property name="com.jaspersoft.studio.unit.width" value="px"/> reportElement> <graphicElement> <pen lineWidth="5.0" lineStyle="Solid"/> graphicElement> line> band> pageFooter> jasperReport>
导出excel 需要增加maven poi
<dependency> <groupId>org.apache.poigroupId> <artifactId>poiartifactId> <version>3.15version> dependency> <dependency> <groupId>org.apache.poigroupId> <artifactId>poi-ooxmlartifactId> <version>3.15version> dependency>
//导出到excel文件 @RequestMapping(path = "/exportExcel", method = RequestMethod.GET) public void exportExcel(HttpServletRequest request, HttpServletResponse response) throws Exception { JRDataSource jrBeanCollectionDataSource = new JRBeanCollectionDataSource(getProductList()); Map params = new HashMap(); params.put("Parameter1", "hello 你好"); //编译jrxml文件,生成jasper文件 URL url = this.getClass().getClassLoader().getResource("jasperreport/test.jrxml"); JasperCompileManager.compileReportToFile(url.getPath()); File jasperFile = ResourceUtils.getFile("classpath:jasperreport/test.jasper"); JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, jrBeanCollectionDataSource); ByteArrayOutputStream outPut=new ByteArrayOutputStream(); FileOutputStream outputStream=null; File file=new File("F:/temp/report.xls"); try { JRAbstractExporter exporter = new JRXlsExporter(); //创建jasperPrint exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint); //生成输出流 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,outPut); //去除两行之前的空白 exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE); //设置所有页只打印到一个Sheet中 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE); //设置Excel表格的背景颜色为默认的白色 exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE); String[] sheetNames = {"自定义1","自定义2","自定义3"}; //自定义sheet名称 exporter.setParameter(JRXlsExporterParameter.SHEET_NAMES, sheetNames); exporter.exportReport(); outputStream=new FileOutputStream(file); outputStream.write(outPut.toByteArray()); }catch (Exception e) { e.printStackTrace(); }finally{ try { outPut.flush(); outPut.close(); } catch (Exception e) { e.printStackTrace(); } } } //直接下载excel文件 @RequestMapping(path = "/exportDownload", method = RequestMethod.GET) public void exportDownload(HttpServletRequest request, HttpServletResponse response) throws Exception { JRDataSource jrBeanCollectionDataSource = new JRBeanCollectionDataSource(getProductList()); Map params = new HashMap(); params.put("Parameter1", "hello 你好"); //编译jrxml文件,生成jasper文件 URL url = this.getClass().getClassLoader().getResource("jasperreport/test.jrxml"); JasperCompileManager.compileReportToFile(url.getPath()); File jasperFile = ResourceUtils.getFile("classpath:jasperreport/test.jasper"); JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, jrBeanCollectionDataSource); response.setContentType("application/vnd.ms-excel"); String fileName="导出文件.xlsx"; fileName = new String( fileName.getBytes("gb2312"), "ISO8859-1" ); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment; filename="+ fileName); ServletOutputStream ouputStream = response.getOutputStream(); try { JRXlsxExporter exporter = new JRXlsxExporter(); SimpleXlsxReportConfiguration configuration = new SimpleXlsxReportConfiguration(); configuration.setOnePagePerSheet(false); configuration.setWhitePageBackground(false); configuration.setIgnorePageMargins(true); String[] sheetNames = {"sheet1"}; configuration.setSheetNames(sheetNames); exporter.setExporterInput(new SimpleExporterInput(jasperPrint)); exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(ouputStream)); exporter.setConfiguration(configuration); exporter.exportReport(); } catch (Exception e) { e.printStackTrace(); }finally{ try { ouputStream.flush(); ouputStream.close(); } catch (Exception e) { e.printStackTrace(); } } }