历史版本3 :导出API 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:
FineReport提供了强大的输入输出功能,所有的这些输入输出的类都在com.fr.report.io包里面。报表的输入指从报表的模板文件(XML格式的)创建WorkBook对象,在报表调用章节已经介绍过。输出则指将报表保存为各种格式文件,FineReport支持将报表保存为cpt、内置数据cpt、Pdf、Excel、Word、Svg、Csv等多种文件格式,释放导出进程

1. 实现原理编辑

我们以Parameter.cpt模板作为被导出模板,参数为报表参数,且设置默认值为华东
1.1 导出成内置数据集模板
导出成内置数据集模板,故名思意是将原模板的数据源根据参数条件查询出结果并转为内置数据集,然后把模板导出,不需要对原模板进行计算(数据列扩展、公式计算等)。
HTML/XML代码
// 将未执行模板工作薄导出为内置数据集模板  
            outputStream = new FileOutputStream(new File("E:\\EmbExport.cpt"));  
            EmbeddedTableDataExporter templateExporter = new EmbeddedTableDataExporter();  
            templateExporter.export(outputStream, workbook);  
1.2 导出模板文件
我们可以将原模板通过程序编辑后再次导出为模板文件,或者将某一路径下的模板保存至另一路径下。
HTML/XML代码
// 将模板工作薄导出模板文件,在导出前您可以编辑导入的模板工作薄,可参考报表调用章节  
            outputStream = new FileOutputStream(new File("E:\\TmpExport.cpt"));  
            ((WorkBook) workbook).export(outputStream);  
1.3 导出Excel文件
模板工作薄WorkBook执行后为结果工作薄ResultWorkBook,我们可以把计算后的结果导出成Excel文件。
HTML/XML代码
// 将结果工作薄导出为Excel文件  
            outputStream = new FileOutputStream(new File("E:\\ExcelExport.xls"));  
            ExcelExporter ExcelExport = new ExcelExporter();  
            ExcelExport.export(outputStream, workbook.execute(parameterMap,new WriteActor()));  
住:导出Excel的其他格式可以参考文档:Excel导出的多种方式章节
注:如果需要导出2007版excel,需要将ExcelExporter ExcelExport = new ExcelExporter()改成Excel2007Exporter excelexporter = new Excel2007Exporter(),具体代码如下:
HTML/XML代码
// 将结果工作薄导出为Excel文件    
           outputStream = new FileOutputStream(new File("D:\\ExcelExport.xlsx"));    
           Excel2007Exporter ExcelExport = new Excel2007Exporter();    
           ExcelExport.export(outputStream, workbook.execute(parameterMap,new WriteActor()));    
1.4 导出Word文件
HTML/XML代码
// 将结果工作薄导出为Word文件  
            outputStream = new FileOutputStream(new File("E:\\WordExport.doc"));  
            WordExporter WordExport = new WordExporter();  
            WordExport.export(outputStream, workbook.execute(parameterMap,new WriteActor()));  
注:FineReport报表导出Word不支持导出悬浮元素,因此若您需导出的模板中包含有悬浮元素如图表,请将其改为单元格元素。
1.5 导出Pdf文件
HTML/XML代码
// 将结果工作薄导出为Pdf文件  
            outputStream = new FileOutputStream(new File("E:\\PdfExport.pdf"));  
            PDFExporter PdfExport = new PDFExporter();  
            PdfExport.export(outputStream, workbook.execute(parameterMap,new WriteActor()));  
1.6 导出Txt文件
HTML/XML代码
// 将结果工作薄导出为Txt文件(txt文件本身不支持表格、图表等,被导出模板一般为明细表)  
            outputStream = new FileOutputStream(new File("E:\\TxtExport.txt"));  
            TextExporter TxtExport = new TextExporter();  
            TxtExport.export(outputStream, workbook.execute(parameterMap,new WriteActor()));  
1.7 导出Csv文件
HTML/XML代码
// 将结果工作薄导出为Csv文件  
            outputStream = new FileOutputStream(new File("E:\\CsvExport.csv"));  
            CSVExporter CsvExport = new CSVExporter();  
            CsvExport.export(outputStream, workbook.execute(parameterMap,new WriteActor()));  
1.8 释放进程
通过导出API在后台导出excel等文件,会产生很多进程,通过下面的方案释放进程。
在导出完成之后添加下面代码:
HTML/XML代码
outputStream.close();  
ModuleContext.stopModules();  

2. 示例编辑

2.1 完整可执行代码
HTML/XML代码
package com.fr.io;    
    
import java.io.File;    
import java.io.FileOutputStream;    
import com.fr.base.FRContext;   
import com.fr.general.ModuleContext;  
import com.fr.base.Parameter;  
import com.fr.dav.LocalEnv;  
import com.fr.io.exporter.CSVExporter;  
import com.fr.io.exporter.EmbeddedTableDataExporter;  
import com.fr.io.exporter.Excel2007Exporter;  
import com.fr.io.exporter.ExcelExporter;  
import com.fr.io.exporter.PDFExporter;  
import com.fr.io.exporter.TextExporter;  
import com.fr.io.exporter.WordExporter;  
import com.fr.main.impl.WorkBook;  
import com.fr.main.workbook.ResultWorkBook;  
import com.fr.report.module.EngineModule;  
import com.fr.stable.WriteActor;  
  
    
public class ExportApi {    
    public static void main(String[] args) {    
        // 定义报表运行环境,才能执行报表    
        String envpath = "D:\\FineReport_7.1\\WebReport\\WEB-INF";    
        FRContext.setCurrentEnv(new LocalEnv(envpath));    
        ModuleContext.startModule(EngineModule.class.getName());   
        ResultWorkBook rworkbook = null;    
        try {    
            // 未执行模板工作薄    
            WorkBook workbook = (WorkBook) TemplateWorkBookIO    
                    .readTemplateWorkBook(FRContext.getCurrentEnv(),    
                            "\\doc\\Primary\\Parameter\\Parameter.cpt");    
            // 获取报表参数并设置值,导出内置数据集时数据集会根据参数值查询出结果从而转为内置数据集    
            Parameter[] parameters = workbook.getParameters();    
            parameters[0].setValue("华东");    
            // 定义parametermap用于执行报表,将执行后的结果工作薄保存为rworkBook    
            java.util.Map parameterMap = new java.util.HashMap();    
            for (int i = 0; i < parameters.length; i++) {    
                parameterMap.put(parameters[i].getName(), parameters[i]    
                        .getValue());    
            }    
            // 定义输出流    
            FileOutputStream outputStream;    
            // 将未执行模板工作薄导出为内置数据集模板    
            outputStream = new FileOutputStream(new File("D:\\EmbExport.cpt"));    
            EmbeddedTableDataExporter templateExporter = new EmbeddedTableDataExporter();    
            templateExporter.export(outputStream, workbook);    
            // 将模板工作薄导出模板文件,在导出前您可以编辑导入的模板工作薄,可参考报表调用章节    
            outputStream = new FileOutputStream(new File("D:\\TmpExport.cpt"));    
            ((WorkBook) workbook).export(outputStream);  
            // 将结果工作薄导出为2003Excel文件    
            outputStream = new FileOutputStream(new File("D:\\ExcelExport.xls"));    
            ExcelExporter ExcelExport = new ExcelExporter();    
            ExcelExport.export(outputStream, workbook.execute(parameterMap,new WriteActor()));    
            // 将结果工作薄导出为2007Excel文件    
            outputStream = new FileOutputStream(new File("D:\\ExcelExport.xlsx"));    
            Excel2007Exporter ExcelExport1 = new Excel2007Exporter();    
            ExcelExport1.export(outputStream, workbook.execute(parameterMap,new WriteActor()));    
            // 将结果工作薄导出为Word文件    
            outputStream = new FileOutputStream(new File("D:\\WordExport.doc"));    
            WordExporter WordExport = new WordExporter();    
            WordExport.export(outputStream, workbook.execute(parameterMap,new WriteActor()));    
            // 将结果工作薄导出为Pdf文件    
            outputStream = new FileOutputStream(new File("D:\\PdfExport.pdf"));    
            PDFExporter PdfExport = new PDFExporter();    
            PdfExport.export(outputStream, workbook.execute(parameterMap,new WriteActor()));    
            // 将结果工作薄导出为Txt文件(txt文件本身不支持表格、图表等,被导出模板一般为明细表)    
            outputStream = new FileOutputStream(new File("D:\\TxtExport.txt"));    
            TextExporter TxtExport = new TextExporter();    
            TxtExport.export(outputStream, workbook.execute(parameterMap,new WriteActor()));    
            // 将结果工作薄导出为Csv文件    
            outputStream = new FileOutputStream(new File("D:\\CsvExport.csv"));    
            CSVExporter CsvExport = new CSVExporter();    
            CsvExport.export(outputStream, workbook.execute(parameterMap,new WriteActor()));  
            outputStream.close();    
            ModuleContext.stopModules();  
        } catch (Exception e) {    
            e.printStackTrace();    
        }    
    }    
}  
注:最新的代码链接fine-help
编译运行该代码后,就会在E盘下生成不同格式的文件,这样就导出成功了。
注:在使用API导出不同类型文件时,除了需要导入FineReport的fr-third-8.0.jar和fr-report-8.0.jar和fr-core-8.0.jar包之外,还需要导入tomcat\lib下面的serverlet-api.jar。

索引: