使用ireport下载Excel或Pdf报表

       iReport是一个能够创建复杂报表的开源项目,它100%使用Java语言编写,是目前全球最为流行的开源报表设计器之一。由于它丰富的图形界面,你能够很快的创建出任何一种你想要的报表。使用ireport主要分为两步,第一步是只做报表模板,第二步是Java代码里使用模板下载报表。模板可是使用Jaspersoft® Studio来制作,这里附上下载地址:https://community.jaspersoft.com/project/jaspersoft-studio/releases。

Jaspersoft® Studio下载安装好了后,和eclipse的界面风格很相似。

1.制作报表模板

可参考一下两个链接:

制作报表模板

https://blog.csdn.net/weixin_42476601/article/details/80999965

配置数据源:

https://jingyan.baidu.com/article/11c17a2c344321f446e39dcd.html

2.java项目中使用ireport下载报表。

重点讲一下如果在java项目中使用irepot报表模板下载报表。

  • 引入相关jar包
<dependencies>
	<dependency>
		<groupId>net.sf.jasperreports</groupId>
		<artifactId>jasperreports</artifactId>
		<version>6.0.0</version>
	</dependency>
	<dependency>
		<groupId>com.jaspersoft.connectors.mongodb</groupId>
		<artifactId>js-mongodb-datasource</artifactId>
		<version>2.0.9</version>
	</dependency>
	<dependency>
		<groupId>com.itextpdf</groupId>
		<artifactId>itext-asian</artifactId>
		<version>5.2.0</version>
	</dependency>
	<dependency>
		<groupId>com.itextpdf</groupId>
		<artifactId>itext-pdfa</artifactId>
		<version>5.5.0</version>
	</dependency>
	<dependency>
		<groupId>com.itextpdf</groupId>
		<artifactId>itextpdf</artifactId>
		<version>5.5.0</version>
	</dependency>
</dependencies>
<repositories>
	<repository>
		<releases>
			<enabled>true</enabled>
		</releases>
		<id>MongoJasperRepo</id>
		<url>http://jaspersoft.artifactoryonline.com/jaspersoft/jaspersoft-repo</url>
	</repository>
</repositories>
  • 项目跟目录下新建一个文件夹reports,用于存放报表模板文件。

  • 项目当中使用的是mongodb,需要做一下配置。
@Bean
public MongoDbConnectionManager mongoDbConnectionManager(MongoProperties mongoProperties) {
  MongoDbConnectionManager connManager = new MongoDbConnectionManager();
  connManager.setMongoURI(mongoProperties.getUri());
  connManager.setMaxActive(20);
  return connManager;
}
  • 生成报表数据。存储在一张表里。
  • 下载报表
package com.deepflow.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;

import com.jaspersoft.mongodb.connection.MongoDbConnection;
import com.jaspersoft.mongodb.connection.MongoDbConnectionManager;
import com.deepflow.data.domain.ReturnScanReport;
import com.deepflow.domain.UserInfoVO;
import com.deepflow.service.ReturnScanReportService;

import lombok.extern.slf4j.Slf4j;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;

@Slf4j
@Controller
@RequestMapping("/reports")
public class ReportController {

  private static final String COMPILED_REPORT_NAME = "/reports/%s.jasper";

  private static final String EXPORT_FILE_NAME = "attachment; filename=\"%s.%s\"";

  @Inject
  private MongoDbConnectionManager mongoDbConnectionManager;

  @Inject
  private ReportService reportService;

  @RequestMapping(value = "/download", method = RequestMethod.GET)
  public ResponseEntity<StreamingResponseBody> downloadFile( //
      @RequestParam(value = "type", required = true) String type, //
      @RequestParam(value = "reportname", required = true) String reportName, //
      HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 生成报表数据,并存储在一张表里
    Report report = reportService.createReport();
    // 加载报表模板
    Resource reportResource = new ClassPathResource(String.format(COMPILED_REPORT_NAME, reportName));
    // 报表查询条件
    Map<String, Object> params = new HashMap<>();
    params.put("id", report.getId());
    // 打开数据库连接
    MongoDbConnection conn = mongoDbConnectionManager.borrowConnection();
    try {
      JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportResource.getInputStream());
      JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, conn);
      if ("pdf".equals(type)) {
        // 下载pdf
        byte[] bytes = JasperExportManager.exportReportToPdf(jasperPrint);
        return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, String.format(EXPORT_FILE_NAME, reportName, "pdf"))
            .contentType(MediaType.APPLICATION_OCTET_STREAM).body((out) -> out.write(bytes));
      } else if ("excel".equals(type)) {
        // 下载excel
        JRXlsxExporter exporter = new JRXlsxExporter();
        exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
        return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, String.format(EXPORT_FILE_NAME, reportName, "xlsx"))
            .contentType(MediaType.APPLICATION_OCTET_STREAM).body((out) -> {
              SimpleOutputStreamExporterOutput os = new SimpleOutputStreamExporterOutput(out);
              exporter.setExporterOutput(os);
              try {
                exporter.exportReport();
              } catch (JRException e) {
                log.error("export report in excel type with error [{}]", e.getMessage());
              }
            });
      }
      return null;
    } catch (Exception e) {
      throw new IllegalArgumentException("加载报表文件出错", e);
    } finally {
      // 关闭数据库连接
      mongoDbConnectionManager.returnConnection(conn);
      if (report != null) {
        reportService.deleteOne(report.getId());
      }
    }
  }
}

猜你喜欢

转载自blog.csdn.net/zjhcxdj/article/details/95360365