后台批量导出Excel

编辑
  • 文档创建者:印然
  • 浏览次数:10628次
  • 编辑次数:16次
  • 最近更新:susie 于 2019-03-27
  • 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

    注:如果模板有两个参数,格式如下:

    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.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.stable.StableUtils;
    import com.fr.stable.WriteActor;
    import com.fr.store.StateServerActivator;
    import com.fr.workspace.simple.SimpleWork;
    import com.fr.chart.activator.ChartBaseActivator;
    import com.fr.base.operator.common.CommonOperator;
    import com.fr.env.operator.CommonOperatorImpl;
    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(),
                        new ChartBaseActivator());
                SimpleWork.supply(CommonOperator.class, new CommonOperatorImpl());
                String envpath = "//Applications//FineReport10_325//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("//Users//susie//Downloads//ExportEg" + number + ".xls"));
                    ExcelExporter excelexporter = new ExcelExporter();
                    excelexporter.export(outputstream, result);
                    // 最后要清空一下参数map,用于下次计算
                    paramap.clear();
                    number++;
                    outputstream.close();
                }
                module.stop();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    注:如果导出的excel只有模板的格式,却没有数据,请确认上述代码段中关于定义报表环境的代码是否正确或者存在,如果不正确或者不存在,则会导致excel中没有数据。
    上述为示例程序,其中报表运行环境与模板名称等需要根据您实际环境进行修改。
    启动设计器,编译运行该程序您便可以得到结果,下载目录下将生成2个Excel文件,如下:



    这样批量导出便成功了。

    附件列表


    主题: 二次开发
    如果您认为本文档还有待完善,请编辑

    文档内容仅供参考,如果你需要获取更多帮助,付费/准付费客户请咨询帆软技术支持
    关于技术问题,您还可以前往帆软社区,点击顶部搜索框旁边的提问按钮
    若您还有其他非技术类问题,可以联系帆软传说哥(qq:1745114201

    此页面有帮助吗?只是浏览 [ 去社区提问 ]