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报表模板下载报表。
<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>
@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());
}
}
}
}