Jasper实现报表(Java)

2023-11-02

目录

1、TIBCO Jaspersoft Studio安装

2、Jaspersoft Studio使用

2.1 创建一个JasperReports Project

2.2 创建报表模板

2.3 设计报表模板

2.4 导出可执行模板

3、Jaspersoft 汉化注意事项

4、引入JasperReports相关依赖

5、Jasper报表模板数据填充及PDF下载



1、TIBCO Jaspersoft Studio安装

下载地址:Jaspersoft® Studio | Jaspersoft Community

需要JDK环境并且尽量6.0以上,6.0以下兼容性和汉化支持麻烦(这句基本上是废话了),我这里是安装的社(白)区(嫖)版,Jaspersoft Studio这个工具其实跟Eclipse长得非常像,可以单独安装,也可以Eclipse插件方式安装,甚至可以当成Eclipse工具使用.....

安装完成后看看靓照,是不是很Eclipse?




2、Jaspersoft Studio使用




2.1 创建一个JasperReports Project

工具会帮我们自动加载报表开发锁需要的依赖包




2.2 创建报表模板

我们的目标效果是设计一个包含主从表的学生成绩统计报表

下面我们开始表演:

1、首先我们先创建一个空白页主模板,操作还是很Eclipse

模板每个部分都解释一下,看下图

同样的方式创建一个子模版,因为一个主模板一般会对应多个子模版,所以我们弄个包包起来,备用:




2.3 设计报表模板

1、main.jrxml 文件Title板块添加标题,标题我使用标签,拖过去对齐成你喜欢的姿势,并且可以对字体“加大加粗”哦:

2、main.jrxml 文件 Page Header 板块加一个日志信息,使用动态标签

创建一个Parameters变量

3、main.jrxml 文件 Column Header增加列头显示,这里使用静态标签就行

4、Detail模块加上需要展示的内容,这个地方是重中之重,唯独只有Detail模块可以有多个,可以右键点击Detail区域增加:

我们这个地方使用对象实体来填充数据,并且还需要嵌入子模板:

先创建main.jrxml对象实体属性列:

说明一下:

stuNo 类型:java.lang.Integer

stuName 类型:java.lang.String

subjectList 类型:java.util.List

上面两个都好理解,最后一个就是嵌入子模板数据的变量

然后切换到sub1.jrxml文件,我们这个文件仅仅只需要作为一个子表,所以只需要显示学生的科目,老师,分数的Detail内容:

同样的对这三个字段设置实体对象属性:

再切回main.jrxml ,在Detail区域填充我们准备了这么久的实体属性和子模版,填充实体属性使用Text Field,嵌入子模版使用Subreport标签

我们现在来看看Detail板块内容:

前面是学号,姓名,后面是嵌入的子模版

我们还可以对每个学生的各科内容进行平均分的统计:

切回到sub1.jrxml面板,我们定义一个函数:

切回main.jrxml模板,显示sub1.jrxml统计的平均分:

在main.jrxml模板也创建一个函数,用来关联sub1.jrxml模板的平均分函数:

选中Detail中的子模版标签,右侧选择Properties编辑:

ok,到这里基本功能已经实现,列脚,页脚,备注模块以后有时间再补充:

2.4 导出可执行模板

对于Jasper来说,.jrxml文件只是设计文件,就类似于我们Java中的.java,我们需要把它编译成".class",右键.jrxml文件进行编译,生成的.jasper文件就是我们后需要用到的:




3、Jaspersoft 汉化注意事项

大家可能看到上面的标签有警告标志,这可能是这个工具的一个汉化bug,但是不影响使用;

汉化操作:选中所有需要显示中文的标签,在右侧Properties属性编辑中处理如下:

这样我们点击预览,可以正常显示汉字了:




4、引入JasperReports相关依赖

进入JaseprReports开发之前,我们还要处理一个汉化缺陷,官方提供的依赖坐标汉化有问题,但官方也提供了一个补充jar包,需要我们自己打包到maven仓库:

iTextAsian.jar

mvn install:install-file -DgroupId=com.itextasian -DartifactId=itextasian -Dversion=1.0 -Dpackaging=jar -Dfile=iTextAsian.jar

然后pom.xml添加相关依赖:

<!--jasperreports pdf-->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.17.0</version>
            <exclusions>
                <exclusion>
                    <groupId>com.lowagie</groupId>
                    <artifactId>itext</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-lang3</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>commons-collections</artifactId>
                    <groupId>commons-collections</groupId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-databind</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-annotations</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-collections4</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>commons-beanutils</groupId>
                    <artifactId>commons-beanutils</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
        </dependency>

        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-fonts</artifactId>
            <version>6.0.0</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-pdfa</artifactId>
            <version>5.5.0</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.11</version>
        </dependency>

        <dependency>
            <groupId>com.itextasian</groupId>
            <artifactId>itextasian</artifactId>
            <version>1.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.4</version>
        </dependency>
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.4</version>
        </dependency>




5、Jasper报表模板数据填充及PDF下载

业务代码填充非常简单,大家自己看就行,当然不要跟我抬杠为什么不从数据库查询出来,你自己不会吗?

@GetMapping("/exportPdf")
    public void exportPdf(HttpServletRequest request, HttpServletResponse response)
            throws IOException, BizException {
        Resource resource = new ClassPathResource("templates/main.jasper");
        /**
         * parameters集合中传递的key需要和设计模板中使用的name一致
         */
        HashMap parameters = new HashMap();
        parameters.put("date","2021-12-01");
        List<Map> lst = new LinkedList<>();
        HashMap map1 = new HashMap();
        map1.put("stuNo",1);
        map1.put("stuName","张三");
        List<Map> subjectList1 = new LinkedList<>();
        HashMap s1 = new HashMap();
        s1.put("subjectName","语文");
        s1.put("teacherName","赵老师");
        s1.put("score",100d);
        HashMap s11 = new HashMap();
        s11.put("subjectName","数学");
        s11.put("teacherName","钱老师");
        s11.put("score",90d);
        subjectList1.add(s1);
        subjectList1.add(s11);
        map1.put("subjectList",subjectList1);
        HashMap map2 = new HashMap();
        map2.put("stuNo",2);
        map2.put("stuName","李四");
        List<Map> subjectList2 = new LinkedList<>();
        HashMap s2 = new HashMap();
        s2.put("subjectName","语文");
        s2.put("teacherName","赵老师");
        s2.put("score",90d);
        HashMap s22 = new HashMap();
        s22.put("subjectName","数学");
        s22.put("teacherName","钱老师");
        s22.put("score",90d);
        subjectList2.add(s2);
        subjectList2.add(s22);
        map2.put("subjectList",subjectList2);
        HashMap map3 = new HashMap();
        map3.put("stuNo",3);
        map3.put("stuName","王五");
        List<Map> subjectList3 = new LinkedList<>();
        HashMap s3 = new HashMap();
        s3.put("subjectName","语文");
        s3.put("teacherName","赵老师");
        s3.put("score",80d);
        subjectList3.add(s3);
        map3.put("subjectList",subjectList3);
        lst.add(map1);
        lst.add(map2);
        lst.add(map3);
        extracted(request, response, resource, parameters, lst);
    }

    private void extracted(HttpServletRequest request, HttpServletResponse response, Resource resource, HashMap parameters, List<Map> lst) {
        JRDataSource dataSource = new JRBeanCollectionDataSource(lst);
        try {
            File reportFile = resource.getFile();
            response.setContentType("application/pdf");
            String defaultname = "export.pdf";
            String fileName = new String(defaultname.getBytes("GBK"), "ISO8859_1");
            response.setHeader("Content-disposition", "attachment; filename="
                    + fileName);
            ServletOutputStream ouputStream = response.getOutputStream();
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile);
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters,dataSource);
            JasperHelper.exportPdf(jasperPrint,"demo", request, response);
            ouputStream.flush();
            ouputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

最后看一眼折腾半天的效果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jasper实现报表(Java) 的相关文章

  • SWIG 类型映射 uint8_t* 从 C/C++ 到 java.nio.ByteBuffer

    我正在尝试将输入和输出缓冲区从 C 传递给 java 类 出于效率原因 我需要使用 ByteBuffer 这两个缓冲区都是在 C 部分中分配的 我需要将它们传递给一个 java 函数 该函数将使用输入缓冲区进行一些计算并将结果写入输出缓冲区
  • 逐行读取 JTextPane

    有没有办法读取a的内容JTextPane逐行 很像 BufferedReader 吗 Element root textPane getDocument getDefaultRootElement 获得根元素后 您可以检查存在多少个子元素
  • 通过 JDBC 与 CLI 使用 MIT Kerberos 连接到 PostgreSQL 9.4 时出错

    我已经使用 MIT Kerberos 5 设置了 PostgreSQL 9 4 并且可以使用 psql 在 CLI 上连接 提交指纹后 我的委托人是 bgiles postgres REALM pg hba conf 有 host all
  • 如何加载椭圆曲线 PEM 编码的私钥? [复制]

    这个问题在这里已经有答案了 我使用 OpenSSL 生成了椭圆曲线私钥 公钥对 私钥和公钥均采用 PEM 编码 我已经弄清楚如何加载公钥 感谢this https stackoverflow com a 40439081但是 我无法弄清楚如
  • 从 Java 启动外部进程:stdout 和 stderr

    我正在使用标准从 java 启动一个外部进程java lang Process 我试图弄清楚该过程的输出是什么 但是采用结合了两者的格式stdout and stderr 目前 我有Process getInputStream它提供了访问s
  • Eclipse 内容协助无法在枚举常量参数列表中工作

    使用 eclipse 当我输入以下内容时 public enum Foo A Integer private final Integer integer private Foo Integer integer this integer in
  • JSF 错误 - IllegalStateException:PWC3999:提交响应后无法创建会话[重复]

    这个问题在这里已经有答案了 我是 JSF 新手 正在构建一个使用 Facelet 创建的应用程序 这是我的模板master xhtml
  • 从另一个类添加 Swing 组件

    我正在学习java 我正在尝试从另一个类向我的框架添加一个菜单栏 练习将代码划分为多个类以更好地组织程序 这是我的代码示例 public class MainApp public static void main String args C
  • 当用户使用相同的凭据登录两次时如何使用户会话无效

    我正在使用带有 Richfaces 和 Facelets 的 JSF 1 2 我有一个应用程序 其中包含许多会话范围的 Bean 和一些应用程序 Bean 假设用户使用 Firefox 登录 创建一个会话 ID A 然后他打开 Chrome
  • Android 上的自定义视图和窗口属性

    我想要做的是在我的应用程序顶部添加一个视图 该视图类似于过滤器视图 我想操纵屏幕的颜色 并且我还希望能够同时更改屏幕的亮度时间 这两件事似乎是分开起作用的 但不能一起起作用 这是我的代码 添加视图 colourView new Layer
  • 在 JSF 自定义验证器中区分 ajax 请求和完整请求

    我的验证器需要知道它是完整请求还是 ajax 请求 在我当前的解决方案中 我检查 http 请求标头X Requested With元素 public void validate FacesContext context UICompone
  • 添加和完成 PHP 源代码文档的工具 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有几个已完成的较旧的 PHP 项目 其中有很多内容 我想以 javadoc phpDocumentor
  • 更改 Spring Web 应用程序的默认会话超时

    我必须测试一个由 spring 和 jsp 编写的 Web 应用程序 应用程序的默认会话超时为 30 分钟 我想减少会话超时 为此 我改变了web xml文件输入tomcatInstallationLocation conf 但这不起作用
  • 基于Java模式分割字符串

    您好 我有以下模式的日志文件 2014 03 06 03 21 45 432 ERROR mfs pool 3 thread 19 dispatcher StatusNotification Error processing notific
  • APACHE POI 从 Java 中的 Excel 获取精确的字体颜色

    在 Excel 工作表中 如何使用 Java 中的 Apache POI 获取准确的字体颜色值 我试图通过使用来获取字体颜色 org apache poi ss usermodel Font f book getFontAt style g
  • Android 以编程方式停止 toast 通知?

    有没有办法以编程方式停止 Toast 消息 假设我有一个按钮 单击它可以滚动 toast 消息 并且在 onclick 事件中我想停止队列中的所有消息并只显示新消息 我该怎么做 我的代码的简化版本如下 代码 public class Hel
  • 飞碟 - html 实体未呈现

    我正在使用 Flying saucer lib 生成 pdf 但我对一些 html 实体有问题 我已经在寻找解决方案 我在这个论坛和其他地方找到了很多提示 但仍然存在问题 我尝试过这种方法 http sdtidbits blogspot c
  • System.out.println("嗨"+6+10);打印Hi610?

    为什么要这样做 太令人困惑了 运算符优先级和结合性 两点 操作员 如果一个或两个参数都是字符串 则进行字符串连接 操作员 从左到右工作 所以在你的例子中 Hi 6 is Hi6 and Hi6 10 is Hi610 编辑 正如您在对另一个
  • JSF - 实施受限页面过滤器

    我正在关注 BalusC 的回答JSF 2 0 如何获取在浏览器地址栏中输入的 URL https stackoverflow com questions 4105263 jsf 2 0 how to get the url that is
  • JavaFX 中的 MVC 模式与场景生成器

    我是 JavaFX 新手 根据我当前的设置 正在努力创建合适的 MVC 架构 我使用 Scene Builder 单击了一个 UI 并指定了一个 Controller 类 Startup public class Portal extend

随机推荐

  • UniApp中如何实现APP页面横竖屏切换?

    前段时间做了一个驾考项目 该项目是使用UniApp搭建的 其中就遇到的一个需求就是横竖屏切换 用横屏来模拟驾照考试 通过查阅文档发现 在UniApp中 要实现横竖屏切换可以由以下步骤来实现 一 通过配置页面的 manifest json 文
  • 数据属性WEKA学习总结

    首先声明 我是一个菜鸟 一下文章中现出技术误导情况盖不负责 1 Weka理处的数据表格中 一个横行称为一个例实 Instance 竖行代表一个属性 Arrtibute 数据表格称为一个数据集 在weka看来 现呈了属性之间的一种关系 Rel
  • Postman发送post请求

    Postman发送post请求 在服务器开发过程中 要经常对get post接口进行测试 get请求 浏览器就可以完成 而post请求浏览器用起来有点麻烦 有的浏览器支持的不太好 个人用过火狐 还可以 今天介绍一下Postman发送post
  • Linux学习之shell bash

    一 硬件 内核 与shell 有操作系统就会离不开shell这个东西 操作系统实际上是一组软件 由于这组软件在控制整个硬件与管理系统的活动检测 如果能被随意操作那就乱套了 所以不能被非管理员用户所随意使用 但是对于用户来说也是需要体验的 用
  • 用python统计字母个数_如何用python统计字符串中字母个数?

    如何用python统计字符串中字母个数 python统计字符串中字母个数的方法 先使用这三种代码dic dict d s set s helloworld 1 d dict for x in s if x not in d keys d x
  • 编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存)

    在Linux命令行中执行top命令 可以查询到所有进程使用的VIRT虚拟内存 RES常驻内存和共享内存SHR 那么 什么是VIRT虚拟内存 RES常驻内存和共享内存SHR 我们编写的Linux C 程序如何影响它们呢 查阅资料后 归纳一下
  • cadence allegro绘制原理图库

    前言 为什么投向了allegro 本科毕业于电子信息工程专业 相信很多学生也和我一样 在一个类似于叫EDA的课上通过DXP Altium Designer学习绘制PCB电路 因此大多数学生应该是会用AD这款软件的 至少最基本的流程不会出问题
  • C++学习1-vector学习

    https blog csdn net m0 59924193 article details 122535504 1 push back 2 pop back 3 size 4 clear 5 insert 6 erase vector变
  • 用abp vNext快速开发Quartz.NET定时任务管理界面

    用abp vNext快速开发Quartz NET定时任务管理界面 今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp net core的快速开发框架来进行Quartz net定时任务调度的管理界面的开发 大伙最好跟
  • uniapp使用自带【刷新方法】与使用【scroll-view】实现下拉刷新上拉加载

    前言 uniapp自带下拉刷新 上拉加载功能基本可以满足刷新需求 但是顶部有状态栏的页面就得进行特殊处理 使用scroll view解决 状态栏会连带被下拉问题 1 uniapp自带下拉刷新 上拉加载 在page json中对应页面路由设置
  • Flex弹性盒子的项目属性

    1 align self 项目对齐方式 1 align self属性表示当前项目可以和其他项目拥有不一样的对齐方式 2 取值 auto 默认值 和父元素align self的值一致 具有继承性 flex start 该项目顶端对齐 flex
  • PyTorch——解决报错“RuntimeError: running_mean should contain *** elements not ***”

    1 问题描述 在使用PyTorch编程的时候 经常遇到一种报错就是 RuntimeError running mean should contain elements not 这次我具体的报错信息是 File home software p
  • Unity性能优化之Resources System

    目录 1 什么是Resources System 2 关于Resources System的使用相关 1 官方强烈建议不要使用它 2 如何适当的使用Resources System 3 当项目中Resources文件夹结构复杂 内容多会对应
  • C++模板元编程基础之“std::enable_if”的使用

    std enable if典型用法 代码示例 通过返回值使用 template
  • 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符

    我们经常会碰到需要fork子进程的情况 而且子进程很可能会继续exec新的程序 这就不得不提到子进程中无用文件描述符的问题 fork函数的使用本不是这里讨论的话题 但必须提一下的是 子进程以写时复制 COW Copy On Write 方式
  • c++关于类成员函数中 参数列表中参数访问自身的私有变量

    本人的第四篇CSDN文章 有错误一定要指出啊啊啊啊啊啊啊啊啊啊 C 关于类的成员函数中 参数列表中访问参数的自身的私有变量 在做作业时候 在写类函数的时候遇到了问题 当参数列表为本类的参数时候 可以直接访问参数的私有变量 于是自己探究了下用
  • cppcheck支持MISRA C 2012

    1 从官网下载cppcheck安装包然后安装 cppcheck官网 https sourceforge net projects cppcheck 下载windows平台的安装包后 双击安装包文件 安装 默认会安装GUI版本 安装完成后 需
  • 【华为OD机试】找朋友【2023 B卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 在学校中 N个小朋友站成一队 第i个小朋友的身高为height i 第i个小朋友可以看到的第一个比自己身高更高的小朋友j 那么j是i的好朋友 要
  • IP组播 —— IGMP协议与组播路由选择协议

    一 IGMP协议 组播路由器通过 IGMP 协议了解每个接口连接的网段上是否存在组播组的接收者 也就是组成员 如果存在成员 组播路由器应将组播数据包转发到这个网段 如果没有成员则应停止转发 IGMP使用IP数据报传递报文 GMP工作的两个阶
  • Jasper实现报表(Java)

    目录 1 TIBCO Jaspersoft Studio安装 2 Jaspersoft Studio使用 2 1 创建一个JasperReports Project 2 2 创建报表模板 2 3 设计报表模板 2 4 导出可执行模板 3 J