一、默認報表存儲器
UReport2默認提供的名為“服務器文件系統”的報表存儲機制,實際上是實現了UReport2提供的com.bstek.ureport.provider.report.ReportProvider接口。接口源碼如下:
public interface ReportProvider { /** * 根據報表名加載報表文件 * @param file 報表名稱 * @return 返回的InputStream */ InputStream loadReport(String file); /** * 根據報表名,刪除指定的報表文件 * @param file 報表名稱 */ void deleteReport(String file); /** * 獲取所有的報表文件 * @return 返回報表文件列表 */ List<ReportFile> getReportFiles(); /** * 保存報表文件 * @param file 報表名稱 * @param content 報表的XML內容 */ void saveReport(String file,String content); /** * @return 返回存儲器名稱 */ String getName(); /** * @return 返回是否禁用 */ boolean disabled(); /** * @return 返回報表文件名前綴 */ String getPrefix(); }
實現了ReportProvider接口后,只需要將實現類配置到Spring中,讓其成為一個標准的Spring Bean,這樣UReport2就會檢測到它而將其加載。
如果想要禁用系統提供的默認報表存儲器,只需要把 ureport2-core 包下的 ureport.properties 文件拷貝一份放到自己的根目錄下:
配置文件內容如下:
ureport.disableHttpSessionReportCache=false ureport.disableFileProvider=true ureport.fileStoreDir=/WEB-INF/ureportfiles ureport.debug=true
將ureport.disableFileProvider改成true,即可禁用默認報表存儲器。
二、自定義報表存儲器
如果想要定義自己的報表存儲器,只需要實現了ReportProvider接口后,並將實現類配置到Spring中,讓其成為一個標准的Spring Bean,這樣UReport2就會檢測到它而將其加載。
1、表結構設計
字段名 | 類型 | 描述 |
id | varchar(32) primary key | 主鍵 |
name | varchar(100) | 報表名稱 |
content | mediumblob | 報表內容 |
create_time | timestamp | 創建時間 |
update_time | timestamp | 更新時間 |
2、需要的方法
public interface ReportFileService extends IService<UReportFile> { /** * 根據報表名稱檢查報表是否存在 * * @param name 報表名稱 */ boolean checkExistByName(String name); /** * 根據報表名稱查詢報表 * * @param name 報表名稱 */ UReportFile getReportFileByName(String name); /** * 查詢全部報表 */ List<UReportFile> listAllReportFile(); /** * 根據報表名稱刪除報表 * * @param name 報表名稱 */ boolean removeReportFileByName(String name); /** * 保存報表 */ boolean saveReportFile(UReportFile entity); /** * 更新報表 */ boolean updateReportFile(UReportFile entity); }
3、自定義報表存儲器
@Component @Setter public class MySQLProvider implements ReportProvider { /** * 存儲器名稱 */ private static final String NAME = "mysql-provider"; /** * 報表文件名前綴 */ private String prefix = "mysql:"; /** * 是否禁用 */ private boolean disabled = false; @Autowired private ReportFileService reportFileService; /** * 根據報表名加載報表文件 * * @param file 報表名稱 * @return 返回的InputStream */ @Override public InputStream loadReport(String file) { UReportFile reportFile = reportFileService.getReportFileByName(getCorrectName(file)); ByteArrayInputStream stream = null; if (ObjectUtil.isNotEmpty(reportFile)) { try { stream = new ByteArrayInputStream(reportFile.getContent()); } catch (Exception e) { throw new ReportException(e); } } return stream; } /** * 根據報表名,刪除指定的報表文件 * * @param file 報表名稱 */ @Override public void deleteReport(String file) { reportFileService.removeReportFileByName(getCorrectName(file)); } /** * 獲取所有的報表文件 * * @return 返回報表文件列表 */ @Override public List<ReportFile> getReportFiles() { List<UReportFile> list = reportFileService.listAllReportFile(); List<ReportFile> reportList = new ArrayList<>(); for (UReportFile file : list) { reportList.add(new ReportFile(file.getName(), file.getUpdateTime())); } return reportList; } /** * 保存報表文件 * * @param file 報表名稱 * @param content 報表的XML內容 */ @Override public void saveReport(String file, String content) { file = getCorrectName(file); UReportFile reportFile = reportFileService.getReportFileByName(file); if(ObjectUtil.isEmpty(reportFile)){ reportFile = new UReportFile(); reportFile.setName(file); reportFile.setContent(content.getBytes()); reportFileService.save(reportFile); }else{ reportFile.setContent(content.getBytes()); reportFileService.updateReportFile(reportFile); } } /** * @return 返回存儲器名稱 */ @Override public String getName() { return NAME; } /** * @return 返回是否禁用 */ @Override public boolean disabled() { return disabled; } /** * @return 返回報表文件名前綴 */ @Override public String getPrefix() { return prefix; } /** * 獲取沒有前綴的文件名 * * @param name 報表名稱 */ private String getCorrectName(String name){ if(name.startsWith(prefix)){ name = name.substring(prefix.length()); } return name; } }
啟動項目,查看效果