jasperreoport
[jaspersoft studio](https://pan.baidu.com/s/1rB25QbZsD2HAMfhsmaXELA
提取码:nl5o
它是什么
jasperreoport是一个java 开源的报表引擎,用于做各种统计报表。
业务场景
需要进行报表统计功能,并有xml,excle,pdf等格式要求的业务场景都适用。
如何使用
根据业务需要设计报表模板文件
这里使用的是jaspersoft studio
这个工具设计,设计好后,保存即可生成需要的.jasper文件
pom.xml引入 jasperreoprt 相关的依赖
net.sf.jasperreports
jasperreports
6.3.0
net.sf.jasperreports
jasperreports-fonts
6.0.0
org.codehaus.groovy
groovy-all
2.2.2
com.itextpdf
itext-asian
5.2.0
封装工具类进行导出
public class ReportUtils {
private static final Logger logger= LogManager.getLogger(ReportUtils.class);
private ReportUtils(){}
public static byte[] generatePDF(Map param,String jasperFilePath,Collection data){
try {
JasperReport jasperReport=null;
JasperPrint print=null;
JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(data);
if(jasperFilePath.endsWith(".jrxml")){
jasperReport=JasperCompileManager.compileReport(jasperFilePath);
print=JasperFillManager.fillReport(jasperReport,setParameter(param,jasperFilePath),beanColDataSource);
}else {
InputStream inputStream=new FileInputStream(jasperFilePath);
print=JasperFillManager.fillReport(inputStream,setParameter(param,jasperFilePath),beanColDataSource);
}
return JasperExportManager.exportReportToPdf(print);
}catch (Exception e){
e.printStackTrace();
logger.error("jasper 导出PDF 异常:{}",e.getMessage());
return null;
}
}
public static JRXlsxExporter generateExcel(Map param, Collection data, HttpServletResponse response,Integer freezeRow){
try {
JasperReport jasperReport=null;
JasperPrint print=null;
JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(data);
String jasperFilePath=param.get("jasperFilePath").toString();
if(jasperFilePath.endsWith(".jrxml")){
jasperReport=JasperCompileManager.compileReport(jasperFilePath);
print=JasperFillManager.fillReport(jasperReport,param,beanColDataSource);
}else {
InputStream inputStream=new FileInputStream(jasperFilePath);
print=JasperFillManager.fillReport(inputStream,param,beanColDataSource);
}
SimpleXlsxReportConfiguration config=new SimpleXlsxReportConfiguration();
config.setRemoveEmptySpaceBetweenColumns(true);
config.setRemoveEmptySpaceBetweenRows(true);
config.setWhitePageBackground(false);
config.setDetectCellType(true);
config.setFreezeRow(freezeRow);
config.setCollapseRowSpan(true);
config.setSheetNames(new String[]{param.get("sheetName").toString()});
JRXlsxExporter exporter = new JRXlsxExporter();
exporter.setConfiguration(config);
//设置输入项
ExporterInput exporterInput = new SimpleExporterInput(print);
exporter.setExporterInput(exporterInput);
//设置输出项
OutputStreamExporterOutput exporterOutput = new SimpleOutputStreamExporterOutput(response.getOutputStream());
exporter.setExporterOutput(exporterOutput);
String fileName=param.get("fileName").toString();
String generateFileName = fileName+".xlsx";
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment; filename="+ URLEncoder.encode(generateFileName,"utf8"));
return exporter;
}catch (Exception e){
e.printStackTrace();
logger.error("jasper 导出Excel 异常:{}",e.getMessage());
return null;
}
}
private static Map setParameter(Map parameters,String jasperFilePath){
String imagePath=jasperFilePath.substring(0,jasperFilePath.lastIndexOf(File.separator))+File.separator+"img"+File.separator;
String qrCode="erweim.png";
String logo="logo.jpg";
parameters.put("image_path",imagePath);
parameters.put("qrCode",qrCode);
parameters.put("logo",logo);
return parameters;
}
}
Controller层进行导出
/**
* 收费流水报表
* @param response
* @param startTime
* @param endTime
*/
@WyOperationLogAnnotation(moduleName = OperationEnum.MODULE_REPORT_EXPORT,businessName = "导出收费流水",operationType = OperationEnum.Export)
@GetMapping("exportOrderStreamV1")
public void exportOrderStreamV1(HttpServletResponse response,String startTime, String endTime){
StreamReportDtoV1 streamReportDto=new StreamReportDtoV1();
if(StringUtils.isEmpty(startTime)&&StringUtils.isEmpty(endTime)){
return ;
}
startTime = solveTimeStr(startTime);
endTime = solveTimeStr(endTime);
streamReportDto.setStartTime(startTime);
streamReportDto.setEndTime(endTime);
RemoteModelResult remoteModelResult=streamReportApi.findExportDataV1(streamReportDto);
if(remoteModelResult.isSuccess()){
StreamReportDtoV1 reportData= (StreamReportDtoV1) remoteModelResult.getModel();
Map param=new HashMap<>();
String projectName=reportData.getProjectName();
try {
String reportName="收费流水报表";
File jasperFile= ResourceUtils.getFile("classpath:pdf/income_stream.jasper");
param.put("projectName",projectName);
param.put("startTime",startTime);
param.put("endTime",endTime);
param.put("jasperFilePath",jasperFile.getAbsolutePath());
String fileName=reportName+startTime+"-"+endTime;
param.put("fileName",fileName);
param.put("sheetName",reportName);
Exporter exporter=ReportUtils.generateExcel(param,reportData.getSteamDetails(),response,4);
exporter.exportReport();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JRException e) {
e.printStackTrace();
}
}
}
}
注:项目中只使用到了导出EXCLE 和 PDF,若需要其他格式的报表,自行查看对应的API。
初探后记
本次也是项目中第一次使用该工具,期间遇到一些问题,在此记录一下,给后面的兄dei少走点弯路。
空报表也导出报表
设置报表时,利用工具自适应容器大小
这里首先选中你需要进行排列的组件,然后右键选择上图所示选项,这样,组件就会根据容器大小进行自动计算每一个组件的宽度,自适应。起初自己是一个组件的进行拖拉、那叫一个慢。
心得体会
对待新事物永远抱着一颗好奇的心态,遇到问题也不要慌张,基本上你能遇到的问题,早已有人遇到过,只是你还没有找到它而已。