Skip to content

报表存储

默认报表存储器

LuckReport 内置默认报表存储器,存储目录由 application-环境.yaml 配置文件中的 luck-report.fileStoreDir 指定,默认为 D:/report

yaml
luck-report:
  # 报表文件存储目录,请根据您的实际存储路径修改,确保该目录存在且有读写权限
  fileStoreDir: D:/report

自定义报表存储器

LuckReport 支持自定义扩展报表存储器,实现 ReportProvider 接口即可快速接入自定义报表存储方案,适用于需要将报表文件存储到数据库、Minio、FTP 等外部系统的场景。

配置步骤

  1. 实现接口:创建类实现 com.luck.report.core.provider.report.ReportProvider 接口
  2. 注册 Bean:将实现类注册为 Spring Bean(使用 @Component@Service 等注解)
  3. 实现方法:实现报表的加载、保存、删除、列表获取等核心方法
  4. 配置前缀:通过 getPrefix() 方法返回报表文件名前缀,用于区分不同存储器

接口方法说明

ReportProvider 接口核心方法:

方法名返回类型说明
loadReport(String file)InputStream根据报表名加载报表文件
saveReport(String file, String content)void保存报表文件
deleteReport(String file)void删除指定的报表文件
getReportFiles()List<ReportFile>获取所有报表文件列表
getName()String返回存储器名称(在设计器中显示)
getPrefix()String返回报表文件名前缀(如 local:
disabled()boolean返回是否禁用该存储器

配置示例

以下示例实现了本地文件系统报表存储器,将报表文件存储到指定目录:

LocalReportProvider.java

java
package com.luck.report.web.test;

import com.luck.report.core.provider.report.ReportFile;
import com.luck.report.core.provider.report.ReportProvider;
import org.springframework.stereotype.Component;

import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 本地文件系统报表存储器
 * 将报表文件存储到本地指定目录
 */
@Component
public class LocalReportProvider implements ReportProvider {

    private String prefix = "local:";
    private static final String REPORT_DIR = "E:/local/report";

    public LocalReportProvider() {
        // 确保目录存在
        File dir = new File(REPORT_DIR);
        if (!dir.exists()) {
            dir.mkdirs();
        }
    }

    /**
     * 根据报表名加载报表文件
     * @param file 报表名称
     * @return 报表文件输入流
     */
    @Override
    public InputStream loadReport(String file) {
        if (file.startsWith(prefix)) {
            file = file.substring(prefix.length(), file.length());
        }
        File reportFile = new File(REPORT_DIR, file);
        if (reportFile.exists()) {
            try {
                return new FileInputStream(reportFile);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 根据报表名删除指定的报表文件
     * @param file 报表名称
     */
    @Override
    public void deleteReport(String file) {
        if (file.startsWith(prefix)) {
            file = file.substring(prefix.length(), file.length());
        }
        File reportFile = new File(REPORT_DIR, file);
        if (reportFile.exists()) {
            reportFile.delete();
        }
    }

    /**
     * 获取所有的报表文件
     * @return 报表文件列表
     */
    @Override
    public List<ReportFile> getReportFiles() {
        List<ReportFile> files = new ArrayList<>();
        File dir = new File(REPORT_DIR);
        File[] listFiles = dir.listFiles();
        if (listFiles != null) {
            for (File file : listFiles) {
                if (file.isFile()) {
                    ReportFile reportFile = new ReportFile(file.getName(), new Date(file.lastModified()));
                    files.add(reportFile);
                }
            }
        }
        return files;
    }

    /**
     * 保存报表文件
     * @param file 报表名称
     * @param content 报表的XML内容
     */
    @Override
    public void saveReport(String file, String content) {
        if (file.startsWith(prefix)) {
            file = file.substring(prefix.length(), file.length());
        }
        File reportFile = new File(REPORT_DIR, file);
        try (FileWriter writer = new FileWriter(reportFile)) {
            writer.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 返回存储器名称(在设计器中显示)
     * @return 存储器名称
     */
    @Override
    public String getName() {
        return "本地文件系统";
    }

    /**
     * 返回是否禁用该存储器
     * @return 是否禁用
     */
    @Override
    public boolean disabled() {
        return false;
    }

    /**
     * 返回报表文件名前缀
     * @return 文件名前缀
     */
    @Override
    public String getPrefix() {
        return prefix;
    }
}

设计器配置

注册完成后,打开报表设计器可以看到自定义的本地文件系统目录:

选择文件目录

禁用默认报表存储器

如果您定义了自己的报表存储器,同时不想使用系统默认的"服务器文件系统"存储器,可以在配置文件中禁用:

yaml
luck-report:
  # 禁用默认报表存储器
  disableFileProvider: true

Luck-Report 报表引擎