【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

一、特殊名词介绍

二、接口/方法/对象源码——【FineReport V10 2018-07-30】

ExportCollection.java
package com.fr.io.collection;

import com.fr.common.annotations.Open;
import com.fr.general.DeclareRecordType;
import com.fr.general.RecordType;
import com.fr.io.exporter.AppExporter;
import com.fr.log.FineLoggerFactory;
import com.fr.log.LogUtils;
import com.fr.web.core.ErrorHandlerHelper;
import com.fr.web.core.ReportRepositoryDeal;
import com.fr.web.core.ReportSessionIDInfor;
import com.fr.web.core.utils.ExportUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;

/**
 * Created by richie on 15/11/30.
 * 导出操作器的一个封装
 */
@Open
public class ExportCollection {
    private AppExporter exporter;
    private RecordType recordType;

    public static ExportCollection create() {
        return new ExportCollection();
    }

    private ExportCollection() {
    }

    public AppExporter getExporter() {
        return exporter;
    }

    public void setExporter(AppExporter exporter) {
        this.exporter = exporter;
    }

    public RecordType getRecordType() {
        return recordType;
    }

    public void setRecordType(RecordType recordType) {
        this.recordType = recordType;
    }
    
    /**
     * 兼容方法
     * 可用同名方法。
     */
    @Deprecated
    public void setRecordType(DeclareRecordType recordType) {
        this.recordType = recordType;
    }

    public void doExport(HttpServletRequest req, HttpServletResponse res, ReportSessionIDInfor sessionIDInfor, String format)
            throws Exception {

        if (getRecordType() == null) {
            ErrorHandlerHelper.getErrorHandler().error(req, res,
                    "Cannot recognize the specifed export format:" + format +
                            ",\nThe correct format can be PDF,Excel,Word,SVG,CSV,Text or Image.");
            return;
        }

        OutputStream outputStream = res.getOutputStream();
        try {
            // 导出并且记录下来
            LogUtils.exportAndLogRecordType(exporter, outputStream, new ReportRepositoryDeal(req, sessionIDInfor), recordType);
        } catch (Exception e) {
            ExportUtils.resetContent(res);
            ErrorHandlerHelper.getErrorHandler().error(req, res, e);
            FineLoggerFactory.getLogger().error(e.getMessage(), e);
        }
        try {
            outputStream.flush();
            outputStream.close();
        } catch (IOException ignored) {
        }
    }
}

三、接口/方法/对象说明

ExportCollection不是一个接口类,而是一个申明操作器的封装类。主要用于配合导出类场景插件的开发。

在使用时,需要申明一个实际的导出对象AppExporter,真正的把报表转换成对应的文件流就在AppExporter对象中进行。【点击看例子

同时需要额外申明一个该导出操作行为的埋点类型RecordType。如果开发者开发的导出是全新的类型,则可以自己实现RecordType接口。如果只是对产品本身的某种导出进行覆盖,则可以引用DeclareRecordType中的相关类型。

注:插件中如果是新增的导出类型,则对应的RecordType中的getTypeMark接口返回值,只能使用20000以后的值,以避免跟产品本身的埋点产生冲突。getTypeString接口返回值必须使用 plugin_ 开头。getProductType接口默认返回空即可。【点击看例子

四、常用链接

com.fr.report.fun.ExportOperateProvider

com.fr.report.fun.ExportExtensionProcessor

五、开源案例

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。



  • No labels