数据分析软件FineReport教程:[7]导出API

2025-09-28 05:05:21

1、在导出章节中我们介绍了Excel导出方式ExcelExporter,此为原样导出。若是您先前学习过FineReport学习教程,您会知道,在FineReport中,除原样导出外还有另外三种导出方式:分页导出、分页分sheet导出、大数据量导出。在程序中有不同的接口来实现:

原样导出

 outputStream = new FileOutputStream(new File("E:\\ExcelExport.xls"));  

 ExcelExporter excel = new ExcelExporter();  

 //导出2007版 outputStream = new FileOutputStream(new File("E:\\ExcelExport.xlsx"));  excel Excel2007Exporter excel = new Excel2007Exporter();

 excel.export(outputStream, rworkbook);

2、分页导出

 outputStream = new FileOutputStream(new File("E:\\PageExcelExport.xls"));

 PageExcelExporter page = new PageExcelExporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook));

//导出2007版 outputStream = new FileOutputStream(new File("E:\\PageExcelExport.xlsx")); excel  PageExcel2007Exporter page = new PageExcel2007Exporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook));

 page.export(outputStream, rworkbook);

3、分页分sheet导出

 outputStream = new FileOutputStream(new File("E:\\PageSheetExcelExport.xls"));

 PageToSheetExcelExporter sheet = new PageToSheetExcelExporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook));

 //导出2007版outputStream = new FileOutputStream(new File("E:\\PageSheetExcelExport.xlsx")); excel PageToSheetExcel2007Exporter sheet = new PageToSheetExcel2007Exporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook));

 sheet.export(outputStream, rworkbook);

4、大数据量导出,50000行为一个excel文件

 outputStream = new FileOutputStream(new File("E:\\LargeExcelExport.zip"));

 LargeDataPageExcelExporter large = new LargeDataPageExcelExporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook), true);

 //导出2007版outputStream = new FileOutputStream(new File("E:\\LargeExcelExport.xlsx")); excel LargeDataPageExcel2007Exporter large = new LargeDataPageExcel2007Exporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook), true);

 large.export(outputStream, rworkbook);

1、实现原理

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

2、实现步骤

下面以%/WebReport%/WEB-INF/reportlets/doc\Primary/Parameter/Parameter.cpt目录下参数模板为例。

3、参数值组合

由于我们需要对模板输入参数对应的值才能够计算得到最终的结果,因此我们需要所有可能的参数值组合,可以来源于数据库中某个表,或者某个文件。这里我们假设所需的参数值组合保存在WebReport\WEB-INF\para.txt中。如下图新建para.txt

数据分析软件FineReport教程:[7]导出API

4、如果模板有两个参数格式如下:

数据分析软件FineReport教程:[7]导出API

5、批量导出程序

完整代码如下:

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.base.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();    

    }    

          }    

注:如果导出的excel只有模板的格式,却没有数据,请确认上述代码段中关于定义报表环境的代码是否正确或者存在,如果不正确或者不存在,则会导致excel中没有数据。

6、上述为示例程序,其中报表运行环境与模板名称等需要根据您实际环境进行修改。编译运行该程序您便可以得到结果,在E盘根目录下将生成3个Excel文件,如下

数据分析软件FineReport教程:[7]导出API

7、内容分别为

数据分析软件FineReport教程:[7]导出API

8、这样批量导出便成功了

1、问题描述

存在很多Excel文件,要将它们转成cpt模板,不想通过设计器手动一张张导入,希望用程序在后台批量转换。

2、解决方案

通过程序读取Excel文件转为模板TemplateWorkBook,然后把模板输出为cpt文件。

3、读取Excel文件转为模板TemplateWorkBook

File excelFile = new File("D:\\aa.xls"); // 获取EXCEL文件

FileInputStream a = new FileInputStream(excelFile);

4、再输出成cpt文件

TemplateWorkBook tpl = new ExcelReportImporter().generateWorkBookByStream(a);

OutputStream outputStream = new FileOutputStream(new File("E:\\abc.cpt")); // 转换成cpt模板

((WorkBook) tpl).export(outputStream);

5、 完整代码如下

package com.fr.io;    

    

import java.io.File;    

import java.io.FileInputStream;    

import java.io.FileOutputStream;    

import java.io.OutputStream;    

import com.fr.main.impl.WorkBook;   

import com.fr.base.ModuleContext;  

import com.fr.io.importer.ExcelReportImporter;  

import com.fr.main.TemplateWorkBook;    

import com.fr.page.stable.ReportPageAttr;  

import com.fr.report.module.EngineModule;  

    

public class ExcelToCpt {    

    public static void main(String[] args) throws Exception {    

        File excelFile = new File("D:\\API.xls"); // 获取EXCEL文件    

        FileInputStream a = new FileInputStream(excelFile);    

        ModuleContext.startModule(EngineModule.class.getName());  

        TemplateWorkBook tpl = new ExcelReportImporter().generateWorkBookByStream(a);    

        OutputStream outputStream = new FileOutputStream(new File("D:\\abc.cpt")); // 转换成cpt模板    

        ((WorkBook) tpl).export(outputStream);  

        outputStream.close();  

        ModuleContext.stopModules();

    }    

}

6、注:如果excel是2007版本的,需要将TemplateWorkBook tpl = new ExcelReportImporter().generateWorkBookByStream(a)改成 TemplateWorkBook tpl = new Excel2007ReportImporter().generateWorkBookByStream(a)并修改import包,具体代码如下:

package com.fr.io;    

    

import java.io.File;    

import java.io.FileInputStream;    

import java.io.FileOutputStream;    

import java.io.OutputStream;    

import com.fr.main.impl.WorkBook;   

import com.fr.base.ModuleContext;  

import com.fr.io.importer.ExcelReportImporter;  

import com.fr.main.TemplateWorkBook;    

import com.fr.page.stable.ReportPageAttr;  

import com.fr.report.module.EngineModule;  

    

public class ExcelToCpt {    

    public static void main(String[] args) throws Exception {    

        File excelFile = new File("D:\\API.xls"); // 获取EXCEL文件    

        FileInputStream a = new FileInputStream(excelFile);    

        ModuleContext.startModule(EngineModule.class.getName());  

        TemplateWorkBook tpl = new Excel2007ReportImporter().generateWorkBookByStream(a);      

        OutputStream outputStream = new FileOutputStream(new File("D:\\abc.cpt")); // 转换成cpt模板    

        ((WorkBook) tpl).export(outputStream);  

        outputStream.close(); 

        ModuleContext.stopModules();

    }    

}

编译并运行

编译并运行该程序,就会在E盘下导出abc.cpt模板文件,我们用设计器打开模板,可以看到,EXCEL里面的数据已经保存至模板文件里面了。

1、问题描述

在报表统计分析中,常常希望将某类报表或者不同参数的同一报表汇总到一个Excel中,每个报表为一个sheet,如销售量统计表,根据不同地区进行统计分析,最终将每个地区的数据单独作为一个sheet汇总于一个Excel中,像这样的需求如何在程序中实现呢?如怎样实现下图效果:

实例:我们有一张多个地区的客户销售表,希望根据地区名称,每个地区的数据作为一个sheet导出至一个excel中。

数据分析软件FineReport教程:[7]导出API

2、读入模板

// 未执行模板工作薄

TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(),

"Gettingstarted.cpt");

3、 给参数赋值

// 参数值为China计算结果,将结果保存至rworkbook

Parameter[] parameters = workbook.getParameters();

java.util.Map parameterMap = new java.util.HashMap();

for (int i = 0; i < parameters.length; i++) {

parameterMap.put(parameters[i].getName(), "华东");

}

PageWorkBook rworkbook = (PageWorkBook)workbook.execute(parameterMap,new PageActor());    

rworkbook.setReportName(0, "华东");

4、我们以第一个执行后的结果工作薄rworkbook作为容器,添加其他地区的统计报表,因此先将rworkbook中的第一个sheet重命名为华东,表示华东地区的数据。

rworkbook.setReportName(0, "华东");

改变参数值为华北,执行获得结果报表PageReport,加入结果工作薄

// 清空parametermap,将参数值改为华北,计算后获得ResultReport

parameterMap.clear();

for (int i = 0; i < parameters.length; i++) {

parameterMap.put(parameters[i].getName(), "华北");

}

PageWorkBook rworkbook2 = (PageWorkBook)workbook.execute(parameterMap,new PageActor());

PageReport rreport2 = rworkbook2.getPageReport(0);

rworkbook.addReport("华北", rreport2);

5、导出结果工作薄

// 定义输出流

FileOutputStream outputStream;

// 将结果工作薄导出为Excel文件

outputStream = new FileOutputStream(new File("E:\\ExcelExport.xls"));PageExcelExporter excelExport = new PageExcelExporter(ReportUtils.getPaperSettingListFromWorkBook(workbook));  

ExcelExport.export(outputStream, workbook.execute(parameterMap));

6、完整代码如下

package com.fr.io;   

  

import java.io.File;  

import java.io.FileOutputStream;  

import java.io.OutputStream;  

import com.fr.base.FRContext;    

import com.fr.base.ModuleContext;  

import com.fr.base.Parameter;      

import com.fr.dav.LocalEnv;  

import com.fr.io.exporter.PageExcelExporter;  

import com.fr.main.TemplateWorkBook;       

import com.fr.main.workbook.PageWorkBook;

import com.fr.report.core.ReportUtils;  

import com.fr.report.module.EngineModule;  

import com.fr.report.report.PageReport;

import com.fr.stable.PageActor;

    

public class ExportReports {    

    public static void main(String[] args) {    

        // 定义报表运行环境,才能执行报表    

        String envpath = "D:\\FineReport\\develop\\code\\build\\package\\WebReport\\WEB-INF";    

        FRContext.setCurrentEnv(new LocalEnv(envpath));    

        ModuleContext.startModule(EngineModule.class.getName());    

        // 进行程序的一些必要初始化    

        try {    

            // 未执行模板工作薄    

            TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(),    

                    "Gettingstarted.cpt");    

            // 参数值为China计算结果,将结果保存至rworkbook    

            Parameter[] parameters = workbook.getParameters();    

            java.util.Map parameterMap = new java.util.HashMap();    

            for (int i = 0; i < parameters.length; i++) {    

                parameterMap.put(parameters[i].getName(), "华东");    

            }    

            PageWorkBook rworkbook = (PageWorkBook)workbook.execute(parameterMap,new PageActor());    

            rworkbook.setReportName(0, "华东");    

            // 清空parametermap,将参数值改为华北,计算后获得ResultReport    

            parameterMap.clear();    

            for (int i = 0; i < parameters.length; i++) {    

                parameterMap.put(parameters[i].getName(), "华北");    

            }    

            PageWorkBook rworkbook2 = (PageWorkBook)workbook.execute(parameterMap,new PageActor());    

            PageReport rreport2 = rworkbook2.getPageReport(0);    

            rworkbook.addReport("华北", rreport2);    

            // 将结果工作薄导出为Excel文件    

            OutputStream outputStream = new FileOutputStream(new File("D:\\ExcelExport1.xls"));    

            PageExcelExporter excelExport = new PageExcelExporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook));      

            excelExport.export(outputStream, rworkbook); 

            outputStream.close();  

            ModuleContext.stopModules();

              

        } catch (Exception e) {    

            e.printStackTrace();    

        }    

    }    

 编译并运行

编译并运行该程序,就会在E盘下导出文件E:\\ExcelExport.xls,打开该文件,便可以看到,不同地区的数据已经分别作为一个sheet保存至一个Excel中了

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢