在平常使用报表过程当中,会有这样一种状况,你将Excel表分发给各个员工,员工填完后,统一整理成多个Excel,你须要将这些数据,用报表的填报功能,提交录入到数据库中,这样一来可避免到服务器机房录数据的繁琐步骤,可是不管是批量导入和仍是导出Excel,这对诸多报表软件或称集成报表功能的系统来讲都是不容易的。java
解决Excel导入的性能问题,能够利用FineReport开发的op=excel_submit功能,来实现不预览报表便可对填报表导入Excel。数据库
根据报表工程的使用方式不一样,批量导入Excel中权限控制方式有所不一样。数组
报表工程通常有如下两种方式:服务器
一、使用FineReport自主开发的数据决策系统op=fs使用报表工程;性能
二、将报表工程集成到本身的系统中。excel
1.1 直接使用op=fscode
用户使用数据决策系统op=fs查看报表,那么全部的权限都是经过op=fs进行认证,用户也都是添加在op=fs中。orm
1.2 集成FR报表工程接口
用户将FR报表工程集成到本身的系统中,经过本身的系统查看报表,那么FR全部的权限都是经过报表平台管理op=fr_platform进行认证,详细请查权限管理。图片
除了批量导入,还有批量导出。一张报表能够根据不一样的条件统计出不一样的数据结果,有时但愿将每一种条件下的结果都保存下来如导出成Excel文件至磁盘,能够在后台调用FineReport的导出接口ExcelExporter将每种状况下的结果批量保存起来。
实现的原理是遍历读取para.txt中的每组参数值,将该参数值组合传入模板进行计算,而后将结果导出excel,循环直至最后一条参数组合。
例如:
因为咱们须要对模板输入参数对应的值才可以计算获得最终的结果,所以咱们须要全部可能的参数值组合,能够来源于数据库中某个表,或者某个文件。这里咱们假设所需的参数值组合保存在WebReport\WEB-INF\para.txt中。以下图新建para.txt
若是模板有两个参数格式以下:
批量导出程序,完整代码以下:
package com.fr.io; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Arrays; import com.fr.base.FRContext; import com.fr.general.ModuleContext; import com.fr.dav.LocalEnv; import com.fr.io.exporter.ExcelExporter; import com.fr.main.TemplateWorkBook; import com.fr.main.workbook.ResultWorkBook; import com.fr.report.module.EngineModule; import com.fr.stable.StableUtils; import com.fr.stable.WriteActor; public class ExportBatch { public static void main(String[] args) { try { // 定义报表运行环境,用于执行报表 String envpath = "D:\\FineReport_7.1\\WebReport\\WEB-INF"; FRContext.setCurrentEnv(new LocalEnv(envpath)); ModuleContext.startModule(EngineModule.class.getName()); // 读取环境下的模板文件 TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(), "doc\\Primary\\DetailReport\\Details.cpt"); // 读取用于保存的参数值的txt文件 File parafile = new File(envpath + "\\para.txt"); FileInputStream fileinputstream; fileinputstream = new FileInputStream(parafile); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileinputstream)); // 定义保存参数的map,用于执行报表 java.util.Map paramap = new java.util.HashMap(); /* * 遍历参数值所在txt文件,txt文件中参数保存形式为 para1,para2 江苏,陈羽 江苏,安娜 首先取出第一行保存参数名称 * 遍历每一个参数组合,如para1=江苏、para2=陈羽,根据参数执行模板,并将结果导出excel excel文件名为名称+导出编号 */ // 读第一行,保存参数名称 String lineText = bufferedReader.readLine(); lineText = lineText.trim(); String[] paraname = StableUtils.splitString(lineText, ","); System.out.println(Arrays.toString(paraname)); // 遍历每一个参数组合,执行模板,导出结果 int number = 0; while ((lineText = bufferedReader.readLine()) != null) { lineText = lineText.trim(); String[] paravalue = StableUtils.splitString(lineText, ","); for (int j = 0; j < paravalue.length; j++) { paramap.put(paraname[j], paravalue[j]); } ResultWorkBook result = workbook.execute(paramap,new WriteActor()); OutputStream outputstream = new FileOutputStream(new File("E:\\ExportEg" + number + ".xls")); ExcelExporter excelexporter = new ExcelExporter(); excelexporter.export(outputstream, result); // 最后要清空一下参数map,用于下次计算 paramap.clear(); number++; outputstream.close(); } ModuleContext.stopModules(); } catch (Exception e) { e.printStackTrace(); } } }
上述为示例程序,其中报表运行环境与模板名称等须要根据您实际环境进行修改。编译运行该程序您即可以获得结果,在E盘根目录下将生成3个Excel文件,以下
内容分别为
这样批量导出便成功了。