PDF报表操作04~~使用JasperReport制作动态报表(数据库交互)案例

时间:2024-03-08 10:32:02

1. 需求

2. 数据直接从数据库中获取

2.1 制作模板

2.1.1 创建新模板,删除不需要的Band

在这里插入图片描述

2.1.2 配置数据连接

使用JDBC数据源填充数据:使用Jaspersoft Studio 先要配置一个数据库连接
填写数据源的类型,选择“DatabaseJDBC Connection”

在这里插入图片描述
在这里插入图片描述

1.给创建的这个数据连接起个名字
2.根据数据库选择驱动类型;
Jaspersoft Studio 已经内置了很多常用数据库的驱动,使用的时候直接选就可以了。当然,如果这还满足不了你的话,你还可以添加你指定的 JDBC 驱动 jar 包。

选择完数据库和驱动后测试以下,如果不通过请选择相应的jar包
在这里插入图片描述
c
测试如果失败,请选择对应驱动的jar包
在这里插入图片描述
如果时MySql请自行导入jar包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1.3 读取表中属性

左下角右击模板名称选择 Dataset and Query

在这里插入图片描述

选择刚才配置的数据源

在这里插入图片描述

查询表数据

在这里插入图片描述
点击“OK”按钮

左下角的Fields中就有了我们想要的属性字段了

在这里插入图片描述

2.1.4 模板如下

修改标题,并且要使用华文宋体
双击空白处,可以自适应大小

在这里插入图片描述
效果预览
在这里插入图片描述

2.2 编译后的.jasper放入到项目中

在这里插入图片描述
在这里插入图片描述

2.3 测试代码

2.3.1 Controller中添加方法

@GetMapping(value = "/downLoadPDF",name = "导出PDF")
public void  downLoadPDF(HttpServletResponse response) throws Exception{
    userService.downLoadPDFByDB(response);
}

2.3.1 Service添加方法

	@Autowired
    private HikariDataSource hikari;

    public void downLoadPDF(HttpServletResponse response) throws Exception {
        //1.获取模板文件  获取项目的更目录
        File rootFile = new File(ResourceUtils.getURL("classpath:").getPath());
        File templateFile = new File(rootFile,"/pdf_template/DataAndModel.jasper");
        //2.准备数据库的链接
        Map params = new HashMap();
        JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(templateFile),params,hikari.getConnection() );

        ServletOutputStream outputStream = response.getOutputStream();
        String filename= "用户列表数据.pdf";
        response.setContentType("application/pdf");
        response.setHeader("content-disposition","attachment:filename="+new String(filename.getBytes(),"ISO-8859-1"));
        //3.打印
        JasperExportManager.exportReportToPdfStream(jasperPrint,outputStream);
    }

2.4 效果图

在这里插入图片描述

3. 数据从后台获取

从上面效果来看,导出的日期格式有问题,其实数据库表中的数据很多情况下都需要做一些业务处理才能被使用的,所以再学习一下数据经过处理后再导出。

3.1. 创建模板

3.1.1 创建新模板,删除不需要的Band

在这里插入图片描述

3.1.2 创建4个field

这4个field的名称要和User实体类中的属性名称要保持一致
在这里插入图片描述
在这里插入图片描述

3.2. 编译后的.jasper放入到项目中

在这里插入图片描述

3.3 修改UserController中的代码

	//导出pdf
    @GetMapping("/downLoadPDF")
    public void downLoadPDF(HttpServletResponse response) throws Exception {
        //userService.downLoadPDF(response);
        userService.downLoadPDF02(response);
    }

3.4 完成UserService代码

 	@JsonIgnore     //转json时不考虑这个字段
    @Transient      //表示非数据库字段
    private String hireDateStr; //日期
 public void downLoadPDF02(HttpServletResponse response)throws Exception {
        //1.获取模板文件  获取项目的更目录
        File rootFile = new File(ResourceUtils.getURL("classpath:").getPath());
        File templateFile = new File(rootFile,"/pdf_template/UserList.jasper");
        //2.准备数据库的链接
        Map params = new HashMap();
        List<User> users = userMapper.selectAll();
        //给hirDateStr赋值
        users = users.stream().map(user -> {
            user.setHireDateStr(new SimpleDateFormat("yyyy-MM-dd").format(user.getHireDate()));
            return user;
        }).collect(Collectors.toList());

        //将JasperPrint已PDF的形式输出
        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(users);
        JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(templateFile),params,dataSource);

        //获取输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //设置导入名称
        String filename= "用户列表数据.pdf";
        //设置导出的字符编码
        response.setContentType("application/pdf");
        response.setHeader("content-disposition","attachment:filename="+new String(filename.getBytes(),"ISO-8859-1"));
        //3.打印
        JasperExportManager.exportReportToPdfStream(jasperPrint,outputStream);
 }

3.5 效果图

在这里插入图片描述

4. 导出用户详细信息

4.1 创建模板

4.1.1 创建空模板

在这里插入图片描述

4.1.2 创建parameter在这里插入图片描述

4.1.3 设置模板基本信息

在这里插入图片描述

4.1.4 选择图片

弹出 create new image element选择Image creation mode 中的最后一个No image

在这里插入图片描述

选中刚才添加的image . 在右侧Properties -> Image中,Expression 设置刚才定义的photo

在这里插入图片描述

4.2 把编译后的模板放入到项目中

在这里插入图片描述

4.3 代码实现

修改UserController中下载个人信息的方法

    //导出用户详细信息
    @GetMapping("/download")
    public void downLoadUserInfoWithTempalte(Long id, HttpServletResponse response, HttpServletRequest request) throws Exception{
        userService.downLoadUserInfoPDF(id,request,response);
    }

在UserService中添加方法

	public void downLoadUserInfoPDF(Long id, HttpServletRequest request, HttpServletResponse response) throws Exception{
        //1.获取模板文件  获取项目的更目录
        File rootFile = new File(ResourceUtils.getURL("classpath:").getPath());
        File templateFile = new File(rootFile,"/pdf_template/userInfo.jasper");
        //2.准备数据库的链接
        User user = userMapper.selectByPrimaryKey(id);
        Map<String, Object> params = EntityUtils.entityToMap(user);
        params.put("salary",user.getSalary().toString());

        //将JasperPrint已PDF的形式输出
        JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(templateFile),params,new JREmptyDataSource());

        //获取输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //设置导入名称
        String filename= "用户详细数据.pdf";
        //设置导出的字符编码
        response.setContentType("application/pdf");
        response.setHeader("content-disposition","attachment:filename="+new String(filename.getBytes(),"ISO-8859-1"));
        //3.打印
        JasperExportManager.exportReportToPdfStream(jasperPrint,outputStream);
    }

4.4 效果图

在这里插入图片描述