历史版本13 :后台批量导出Excel 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 描述编辑

一张报表可以根据不同的条件统计出不同的数据结果,若您希望将每一种条件下的结果都保存下来如导出成Excel文件至磁盘,您可以在后台调用FineReport的导出接口ExcelExporter将每种情况下的结果批量保存起来。以下我们就这种需求详细介绍其制作过程。

2. 原理编辑

通过程序批量导出结果至excel,首先是遍历读取para.txt中的每组参数值,将该参数值组合传入模板进行计算,然后将结果导出excel,循环直至最后一条参数组合。

3. 实现步骤编辑

下面以%FR_HOME%/webapps/webroot/WEB-INF/reportlets/doc/Primary/Parameter/Parameter.cpt目录下参数模板为例。
3.1 参数值组合
由于我们需要对模板输入参数对应的值才能够计算得到最终的结果,因此我们需要所有可能的参数值组合,可以来源于数据库中某个表,或者某个文件。这里我们假设所需的参数值组合保存在%FR_HOME%/webapps/webroot/WEB-INF/para.txt中。如下图新建para.txt
222
注:如果模板有两个参数,格式如下:
222
3.2 批量导出程序
完整代码如下:
package com.fr.io; import com.fr.config.activator.BaseDBActivator; import com.fr.config.activator.ConfigurationActivator; import com.fr.data.impl.config.activator.RestrictionActivator; import com.fr.general.ModuleContext; import com.fr.io.exporter.ExcelExporter; import com.fr.main.TemplateWorkBook; import com.fr.main.workbook.ResultWorkBook; import com.fr.module.Module; import com.fr.module.tool.ActivatorToolBox; import com.fr.report.ReportActivator; import com.fr.report.module.ReportBaseActivator; import com.fr.serialization.SerializationActivator; import com.fr.stable.StableUtils; import com.fr.stable.WriteActor; import com.fr.startup.WorkspaceRegister; import com.fr.store.StateServerActivator; import com.fr.workspace.engine.WorkspaceActivator; import com.fr.workspace.server.ServerWorkspaceRegister; import com.fr.workspace.simple.SimpleWork; 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; public class ExportBatch { public static void main(String[] args) { try { // 定义报表运行环境,用于执行报表 Module module = ActivatorToolBox.simpleLink(new BaseDBActivator(), new ConfigurationActivator() ,new StateServerActivator() ,new ReportBaseActivator(), new RestrictionActivator(), new ReportActivator()); String envpath = "C:\\FineReport_10.0\\webapps\\webroot\\WEB-INF";//工程路径 SimpleWork.checkIn(envpath); module.start(); // 读取环境下的模板文件 TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook( "doc\\Primary\\Parameter\\Parameter.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("C:\\test\\ExportEg" + number + ".xls")); ExcelExporter excelexporter = new ExcelExporter(); excelexporter.export(outputstream, result); // 最后要清空一下参数map,用于下次计算 paramap.clear(); number++; outputstream.close(); } ModuleContext.stopModules(); } catch (Exception e) { e.printStackTrace(); } } }
注:如果导出的excel只有模板的格式,却没有数据,请确认上述代码段中关于定义报表环境的代码是否正确或者存在,如果不正确或者不存在,则会导致excel中没有数据。
上述为示例程序,其中报表运行环境与模板名称等需要根据您实际环境进行修改。编译运行该程序您便可以得到结果,在E盘根目录下将生成2个Excel文件,如下:
222
内容为:
222

这样批量导出便成功了。