报表在JavaWeb中是个非常常用的技术,本文介绍使用SpringBoot+AngularJS+Jaspersoft Studio对报表打印进行实现
一.使用Jaspersoft Studio进行报表的绘制后,存放在src/main/resources/reports文件夹下。
二.实现多张报表生成后台代码详解
此方法应用了JasperReport和JRAbstractExporter包对报表进行无脑化编译。
@RestController
@RequestMapping(LevyDetailController.BASE_URL)
public class LevyDetailController {
public static Logger LOGGER = LoggerFactory.getLogger(LevyDetailController.class);
/** 根路径 */
public final static String BASE_URL = "/reports/levy";
/** 报表打印服务接口类 */
@Resource
private LevyDetailService levyDetailService;
@SuppressWarnings("unchecked")
@RequestMapping(method = RequestMethod.GET)
public void printReport(@RequestParam("format") String format, @RequestParam("companyId") Long companyId,
@RequestParam(required = false) Long issue, @RequestParam(required = false) Long pageIndex,
HttpServletRequest request, HttpServletResponse response) {
String requestFullUri = request.getRequestURI() + "?" + request.getQueryString();
OrganizationApplyService organizationApplyService = (OrganizationApplyService) SpringContextUtils
.getApplicationContext().getBean("organizationApplyServiceImpl");
OrganizationApply company = organizationApplyService.findByOrgId(companyId);
// 获取报表数据
CompanyLevyListDTO result = levyDetailService.getLevyDetail(company, issue);
// result.setList(null);测试空报表
// 打印控制获取上下文
ApplicationContext ctx = SpringContextUtils.getApplicationContext();
org.springframework.core.io.Resource resource = null;
if (result.getList() == null) {
// 生成空白报表
resource = ctx.getResource("classpath:/reports/rptEmpty.jrxml");
} else {
resource = ctx.getResource("classpath:/reports/rptLevyDetailx.jrxml");
}
InputStream inputStream;
try {
// 译为输入流
inputStream = resource.getInputStream();
// 编译报表
JasperReport jasperReport = JasperCompileManager.compileReport(inputStream);
JRAbstractExporter exporter = new JRPdfExporter();
List<JasperPrint> list = new ArrayList<>();
// 多张报表打印实现
if (result.getList() != null) {
for (CompanyLevyDTO dto : result.getList()) {
// 获取报表数据map源
JasperPrint jasperprint = JasperFillManager.fillReport(jasperReport,
LevyDetaiFactorySolitary.getReportData(format, requestFullUri, dto, issue,
company.getName(), company.getCompanyNumber()),
LevyDetaiFactorySolitary.mapData(dto.getLevyBodyListDTO()));
list.add(jasperprint);
}
} else {
JasperPrint jasperprint = JasperFillManager.fillReport(jasperReport,
(Map<String, Object>) DefaultEmptyFactory.getReportData(format, requestFullUri),
DefaultEmptyFactory.mapData());
list.add(jasperprint);
}
// 设置前台编译格式
ServletOutputStream baos = response.getOutputStream();
exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, list);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
exporter.exportReport();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三.单张报表生成后台代码详解
此方法使用最基本SpringBooot response传入字节数组方式生成报表,代码如下:
@RestController
@RequestMapping(LevyDetailController.BASE_URL)
public class LevyDetailController {
public static Logger LOGGER = LoggerFactory.getLogger(LevyDetailController.class);
/** 根路径 */
public final static String BASE_URL = "/reports/levy";
/** 报表打印服务接口类 */
@Resource
private LevyDetailService levyDetailService;
@Autowired
private PileStamperClient pileStamperClient;
@RequestMapping(method = RequestMethod.GET)
public void printReport(@RequestParam("format") String format,