You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:50:22