Vaadin v23下如何在独立视图中展示.jasper报表?
在Vaadin v23独立视图中展示Jasper报表的实现方案
完全可以实现,以下是具体落地步骤:
1. 配置依赖
在项目pom.xml中添加JasperReports核心依赖及字体支持:
<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.20.0</version> <!-- 可选用兼容的最新版本 --> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports-fonts</artifactId> <version>6.20.0</version> </dependency>
2. 生成JasperPrint对象
编写工具类加载.jrxml模板并填充数据,生成可输出的JasperPrint实例:
import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; public class JasperReportUtil { public static JasperPrint generateReport(List<?> dataList, String reportPath) throws Exception { // 加载resources目录下的报表模板 InputStream templateStream = JasperReportUtil.class.getResourceAsStream(reportPath); var jasperReport = JasperCompileManager.compileReport(templateStream); // 构建Bean集合数据源(可替换为JDBC数据源等) var dataSource = new JRBeanCollectionDataSource(dataList); // 设置报表参数 Map<String, Object> params = new HashMap<>(); params.put("ReportTitle", "毕业设计报表"); // 填充数据生成打印对象 return JasperFillManager.fillReport(jasperReport, params, dataSource); } }
3. 在Vaadin独立视图中展示报表
利用Vaadin v23的PdfViewer官方组件,将Jasper报表转为PDF流后展示:
import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.pdfviewer.PdfViewer; import com.vaadin.flow.component.text.Text; import com.vaadin.flow.router.Route; import com.vaadin.flow.server.StreamResource; import net.sf.jasperreports.engine.JasperExportManager; import java.io.ByteArrayInputStream; import java.util.Arrays; @Route("report-display") public class ReportDisplayView extends VerticalLayout { public ReportDisplayView() { try { // 模拟报表数据 List<Project> projectList = Arrays.asList( new Project("学生成绩统计", "已完成", 95), new Project("图书管理系统", "开发中", 80) ); // 生成JasperPrint对象 var jasperPrint = JasperReportUtil.generateReport(projectList, "/templates/project_report.jrxml"); // 导出为PDF字节流 byte[] pdfBytes = JasperExportManager.exportReportToPdf(jasperPrint); // 创建流资源 StreamResource pdfResource = new StreamResource("project_report.pdf", () -> new ByteArrayInputStream(pdfBytes)); // 初始化PDF浏览器组件并设置高度 PdfViewer pdfViewer = new PdfViewer(pdfResource); pdfViewer.setHeight("80vh"); add(pdfViewer); } catch (Exception e) { e.printStackTrace(); add(new Text("报表加载失败:" + e.getMessage())); } } // 模拟数据实体类 private static class Project { private String name; private String status; private int progress; public Project(String name, String status, int progress) { this.name = name; this.status = status; this.progress = progress; } // getter方法 public String getName() { return name; } public String getStatus() { return status; } public int getProgress() { return progress; } } }
关键注意事项
- 确保
.jrxml模板文件放置在项目resources目录下(示例中为/templates/子目录) - 若需导出Excel、Word等格式,替换
JasperExportManager的对应导出方法即可 - Vaadin v23中优先使用官方
PdfViewer组件,替代旧版本的Embedded组件以获得更好的兼容性
内容的提问来源于stack exchange,提问作者ISalcedo
相关产品推荐
相关产品推荐

