文件上传与PDF报表入门2

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 文件上传与PDF报表入门

JasperReport原理

JRXML:报表填充模板,本质是一个XML.

JasperReport已经封装了一个dtd,只要按照规定的格式写这个xml文件,那么jasperReport就可以将其解析最终生成报表,但是jasperReport所解析的不是我们常见的.xml文件,而是.jrxml文件,其实跟xml是一样的,只是后缀不一样。

Jasper:由JRXML模板编译生成的二进制文件,用于代码填充数据。

解析完成后JasperReport就开始编译.jrxml文件,将其编译成.jasper文件,因为JasperReport只可以 对.jasper文件进行填充数据和转换,这步操作就跟我们java中将java文件编译成class文件是一样的

Jrprint:当用数据填充完Jasper后生成的文件,用于输出报表。

这一步才是JasperReport的核心所在,它会根据你在xml里面写好的查询语句来查询指定是数据库,也可以控制在后台编写查询语句,参数,数据库。在报表填充完后,会再生成一个.jrprint格式的文件(读取jasper文件进行填充,然后生成一个jrprint文件)

骚戴理解:Jrprint是JasperReport报表库所生成的报表文档文件格式之一,它包含了报表生成时使用的所有信息,包括设计好的模板、填充数据、用于输出的控件以及生成的样式等等。因此,Jrprint文件中确实包含了数据填充后的内容。在填充数据之后,JasperReport会将结果存储在内存中,并为每一个页面创建一个对应的子报表元素,最终将这些子报表元素合并到一个整体的Jrprint文件中。需要注意的是,Jrprint文件不同于JasperReport的模板文件(.jrxml),它不能作为原始模板来进行编辑和修改。如果您需要调整报表的外观或逻辑,需要打开对应的.jrxml模板文件,并且重新编译和生成报表。

Exporter:决定要输出的报表为何种格式,报表输出的管理类。

Jasperreport可以输出多种格式的报表文件,常见的有Html,PDF,xls等

骚戴理解:Jasper文件和Jrprint文件有什么区别?


Jasper文件和Jrprint文件都是JasperReports报表库所使用的文件格式,但它们在生成和使用上有一些区别。


Jasper文件(.jasper)是由JasperReports编译器将.jrxml文件(JasperReports模板文件)转换为二进制格式的文件。Jasper文件包含了填充后的数据集、样式、和可视化控件等元素,并且可以作为原始的模板来进行编辑和修改。当需要生成报表时,应通过JasperReports API加载Jasper文件,并为其填充数据集,然后使用所提供的输出组件将其导出为所需的格式(如PDF、HTML、Excel等)。

而Jrprint 文件(.jrprint),则是一个二进制格式的文件,其中包含了通过JasperReports API运行报表后生成的完整报表内容,包括所有页面和分页信息、数据以及渲染样式等。这个文件通常被用于在Java应用程序中查看或打印报表,以便在运行时进行一些更复杂的逻辑处理操作。

总之,Jasper文件主要用于设计与编译报表模板,而Jrprint文件用于展示或处理已经生成的完整报表。需要注意的是,Jasper文件和Jrprint文件都不能直接打开或修改,必须通过相关的JasperReports库来进行操作。

开发流程概述

  • 制作报表模板模板编译
  • 构造数据
  • 填充模板数据

模板工具Jaspersoft Studio

概述

Jaspersoft Studio是JasperReports库和JasperReports服务器的基于Eclipse的报告设计器; 它可以作为Eclipse插件或作为独立的应用程序使用。Jaspersoft Studio允许您创建包含图表,图像,子报表,交叉表等的复杂布局。您可以通过JDBC,TableModels,JavaBeans,XML,Hibernate,大数据(如Hive),CSV,XML / A以及自定义来源等各种来源访问数据,然后将报告发布为PDF,RTF, XML,XLS,CSV,HTML,XHTML,文本,DOCX或OpenOffice。


Jaspersoft Studio 是一个可视化的报表设计工具,使用该软件可以方便地对报表进行可视化的设计,设计结果为格式.jrxml 的 XML 文件,并且可以把.jrxml 文件编译成.jasper 格式文件方便 JasperReport 报表引擎解析、显示。

安装配置

到JasperReport官网下载 Download Jaspersoft Business Intelligence Suite | Jaspersoft Community

下载 Library Jar包(传统导入jar包工程需下载)和模板设计器Jaspersoft studio。并安装Jaspersoft studio,安装的过程比较简单,一直下一步直至安装成功即可。

骚戴理解:安装下面这个,别安装错了!

面板介绍

Report editing area (主编辑区域)中,您直观地通过拖动,定位,对齐和通过 Designer palette(设计器调色板)对报表元素调整大小。JasperSoft Studio 有一个多标签编辑器,Design,Source 和 Preview:

Design tab:当你打开一个报告文件,它允许您以图形方式创建报表选中Source tab: 包含用于报表的 JRXML 源代码。

Preview tab: 允许在选择数据源和输出格式后,运行报表预览。

Repository Explorer view:包含 JasperServer 生成的连接和可用的数据适配器列表

Project Explorer view:包含 JasperReports 的工程项目清单

Outline view:在大纲视图中显示了一个树的形式的方式报告的完整结构。

Properties view:通常是任何基于 Eclipse 的产品/插件的基础之一。它通常被填充与实际所选元素的属性的信息。这就是这样,当你从主设计区域(即:一个文本字段)选择一个报表元素或从大纲,视图显示了它的 信息。其中一些属性可以是只读的,但大部分都是可编辑的,对其进行修改,通常会通知更改绘制的元素(如:元素的宽度或高度)。

Problems view:显示的问题和错误,例如可以阻断报告的正确的编译。

Report state summary 提供了有关在报表编译/填充/执行统计用户有用的信息。错误会显示在这里

基本使用

模板制作

  • 打开Jaspersoft Studio ,新建一个project, 步骤: File -> New -> Project-> JasperReports Project


  • 新建一个Jasper Report模板,在 Stidio的左下方Project Explorer 找到刚才新建的Project (我这里新建的是DemoReport),步骤:项目右键 -> New -> Jasper Report

  • 选择 Blank A4 (A4纸大小的模板),然后 Next 命名为DemoReport1.jrxml.

如图所示,报表模板被垂直的分层,每一个部分都是一个Band,每一个Band的特点不同:

Title(标题):只在整个报表的第一页的最上端显示。只在第一页显示,其他页面均不显示。

Page Header(页头):在整个报表中每一页都会显示。在第一页中,出现的位置在 Title的下面。在除了第一页的其他页面中Page Header 的内容均在页面的最上端显示。

Page Footer(页脚):在整个报表中每一页都会显示。显示在页面的最下端。一般用来显示页码。

Detail 1(详细):报表内容,每一页都会显示。

Column Header(列头):Detail中打印的是一张表的话,这Column Header就是表中列的列头。Column Footer(列脚):Detail中打印的是一张表的话,这Column Footer就是表中列的列脚。

Summary(统计):表格的合计段,出现在整个报表的最后一页中,在Detail1后面。主要是用来做报表的合计显示。

骚戴理解:上面的这些都是可以按delete按钮删除的!注意在玩的时候需要先ctrl+s进行保存然后才可以在Preview里面预览到效果!


编译模板

右键单机模板文件 -> compile Report 对模板进行编译,生成.jasper文件


骚戴理解:首先在Jaspersoft Studio 里面通过拖拽的方式设计好模板,设计模板的时候其实就是jrxml文件,然后通过编译变成jasper文件,jasper文件才是Java代码里要用到的,后续会把这个jasper文件放在Resource目录下!在Java代码里对jasper文件填充数据生成jrprint文件,然后以pdf报表的形式展示在前端!


可以看到编译后就会生成jasper文件,然后把这个文件导入项目里即可!

整合工程

新建SpringBoot工程引入坐标

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.olap4j</groupId>
            <artifactId>olap4j</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>

引入配置文件

server:
 port: 8181
spring:
 application:
   name: jasper-demo #指定服务名
 resources:
   static-locations: classpath:/templates/
 datasource:
   driver-class-name: com.mysql.jdbc.Driver
   url: jdbc:mysql://localhost:3306/ihrm?useUnicode=true&characterEncoding=utf8
   username: root
   password: 111111

创建启动类

@SpringBootApplication(scanBasePackages = "cn.itcast")
public class JasperApplication {
    public static void main(String[] args) {
        SpringApplication.run(JasperApplication.class, args);
   }
}

导入生成的.jasper文件

创建测试controller

package cn.itcast.controller;
import net.sf.jasperreports.engine.*;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
@RestController
public class JasperController {
    @GetMapping("/testJasper")
    public void createPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1.引入jasper文件
        Resource resource = new ClassPathResource("templates/test.jasper");
        FileInputStream fis = new FileInputStream(resource.getFile());
        //2.创建JasperPrint,向jasper文件中填充数据
        ServletOutputStream os = response.getOutputStream();
        try {
            /**
             * fis: jasper文件输入流
             * new HashMap :向模板中输入的参数
             * JasperDataSource:数据源(和数据库数据源不同)
             *              填充模板的数据来源(connection,javaBean,Map)
             *               填充空数据来源:JREmptyDataSource
             */
            JasperPrint print = JasperFillManager.fillReport(fis, new HashMap<>(),new JREmptyDataSource());
            //3.将JasperPrint已PDF的形式输出
            JasperExportManager.exportReportToPdfStream(print,os);
        } catch (JRException e) {
            e.printStackTrace();
        }finally {
            os.flush();
        }
    }
}

骚戴理解:下面这句代码是把jasper文件进行填充数据,然后生成jrprint对象(文件),注意这三个参数的含义就好


fis: jasper文件输入流

new HashMap :向模板中输入的参数

JasperDataSource:数据源(和数据库数据源不同)

填充模板的数据来源(connection,javaBean,Map)

填充空数据来源:JREmptyDataSource,如果是没有数据源就new JREmptyDataSource()

 JasperPrint print = JasperFillManager.fillReport(fis, new HashMap<>(),new JREmptyDataSource());

还要一行核心代码就是指定通过什么方式把jrprint文件导出,这里指定通过pdf导出流来导出!

JasperExportManager.exportReportToPdfStream(print,os);

中文处理


  • 通过手动指定中文字体的形式解决中文不现实
  • 添加properties文件:
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml
  • 指定中文配置文件fonts.xml(放Resource目录下)
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
    <!--<fontFamily name="Lobster Two">-->
    <!--<normal>lobstertwo/LobsterTwo-Regular.otf</normal>-->
    <!--<bold>lobstertwo/LobsterTwo-Bold.otf</bold>-->
    <!--<italic>lobstertwo/LobsterTwo-Italic.otf</italic>-->
    <!--<boldItalic>lobstertwo/LobsterTwo-BoldItalic.otf</boldItalic>-->
    <!--<pdfEncoding>Identity-H</pdfEncoding>-->
    <!--<pdfEmbedded>true</pdfEmbedded>-->
    <!--<!–-->
    <!--<exportFonts>-->
    <!--<export key="net.sf.jasperreports.html">'Lobster Two', 'Times New Roman', Times, serif</export>-->
    <!--</exportFonts>-->
    <!--–>-->
    <!--</fontFamily>-->
    <fontFamily name="华文宋体">
        <normal>stsong/stsong.TTF</normal>
        <bold>stsong/stsong.TTF</bold>
        <italic>stsong/stsong.TTF</italic>
        <boldItalic>stsong/stsong.TTF</boldItalic>
        <pdfEncoding>Identity-H</pdfEncoding>
        <pdfEmbedded>true</pdfEmbedded>
        <exportFonts>
            <export key="net.sf.jasperreports.html">'华文宋体', Arial, Helvetica, sansserif</export>
            <export key="net.sf.jasperreports.xhtml">'华文宋体', Arial, Helvetica, sansserif</export>
        </exportFonts>
        <!--
        <locales>
            <locale>en_US</locale>
            <locale>de_DE</locale>
        </locales>
        -->
    </fontFamily>
</fontFamilies>
  • 引入字体库stsong.TTF(放Resource目录下)
目录
相关文章
|
8月前
|
分布式计算 安全 搜索推荐
阿里大牛评:入门到大成!GitHub新上线并发编程深度解析实战PDF
众所周知,在很多一二线互联网公司的面试中,并发编程几乎是必然会问的问题,而绝大部分程序员对并发编程的理解也都停留在使用阶段。 市面上几乎所有有关并发编程的书,通过搜索引擎查找了几乎所有的并发编程学习资料,展现的并发编程这个领域知识体系非常庞大。同时,随着对并发编程的深入研究,会发现里面有大量的设计思想(比如分而治之)非常值得学习和研究。
|
2月前
|
Python
小白入门必备!计科教授的Python精要参考PDF开放下载!
随着互联网产业的高速发展,在网络上早已积累了极其丰富的Python学习资料,任何人都可以基于这些资源,自学掌握 Python。 但实际上,网络上充斥的资源太多、太杂且不成体系,在没有足够的编程/工程经验之前,仅靠“看”线上资源自学,的确是一件非常困难的事。
小白入门必备!计算机科学教程的Python精要参考PDF开放下载!
随着互联网产业的高速发展,在网络上早已积累了极其丰富的Python学习资料,任何人都可以基于这些资源,自学掌握 Python。 但实际上,网络上充斥的资源太多、太杂且不成体系,在没有足够的编程/工程经验之前,仅靠“看”线上资源自学,的确是一件非常困难的事。
|
2月前
|
JSON 前端开发 BI
使用 Pandas, Jinja 和 WeasyPrint,轻松创建一个 PDF 报表
使用 Pandas, Jinja 和 WeasyPrint,轻松创建一个 PDF 报表
使用 Pandas, Jinja 和 WeasyPrint,轻松创建一个 PDF 报表
|
2月前
|
数据安全/隐私保护 Python
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)(下)
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)
49 1
|
2月前
|
数据安全/隐私保护 Python Windows
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)
74 0
|
2月前
|
数据安全/隐私保护 Python Windows
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)(上)
Python办公自动化【Word转换PDF、PDF读取内容、PDF合并文件、PDF拆分文件、PDF加密文件、PPT基本操作-增加幻灯片、增加内容】(六)-全面详解(学习总结---从入门到深化)
85 0
|
10月前
|
分布式计算 大数据 Hadoop
终于学完了阿里云大数据架构师推荐的Flink入门与实战PDF
Flink项目是大数据计算领域冉冉升起的一颗新星。大数据计算引擎的发展经历了几个过程,从第1代的MapReduce,到第2代基于有向无环图的Tez,第3代基于内存计算的Spark,再到第4代的Flink。因为Flink可以基于Hadoop进行开发和使用,所以Flink并不会取代Hadoop,而是和Hadoop紧密结合。
终于学完了阿里云大数据架构师推荐的Flink入门与实战PDF
|
10月前
|
XML Java BI
医疗管理系统-PDF报表生成
医疗管理系统-PDF报表生成
72 0
|
12月前
|
开发框架 前端开发 .NET
ASP.NET Core MVC从入门到精通[PDF版]
ASP.NET Core MVC从入门到精通[PDF版]
255 0