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

Page tree

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

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

前言

FineReport默认提供了将报表导出成图片、PDF、Excel、Word等格式的文件,但是在某些情况下,我们需要导出成其他更多类型的文件,比如XML、PPT、CSV等。

关键接口

1.在设计器中模板工具栏设置界面提供一个新类型的导出按钮接口com.fr.design.fun.ToolbarItemProvider

2.报表在浏览器端预览时的工具栏上的导出按钮接口com.fr.report.fun.ExtensionButtonProvider。

3.自定义的导出方式的接入接口com.fr.report.fun.ExportOperateProvider

4.要给contentPane对象添加新导出类型的JavaScript函数,需要用到接口com.fr.stable.fun.JavaScriptFileHandler

具体实现

我们以导出XML为例子,ExportIOperateProvider的实现:

public class XmlExportOperate extends DefaultOperate {

    @Override
    public void setContent(HttpServletRequest req, HttpServletResponse res, String fileName, boolean isEmbed) {
        res.setContentType("application/octet-stream");
        res.setHeader("extension", "xml");
        res.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xml");
    }

    @Override
    public ExportCollection createCollection(HttpServletRequest req, HttpServletResponse res, ReportSessionIDInfor sessionIDInfor, String fileName) {
        ExportCollection collection = ExportCollection.create();
        collection.setExporter(new XmlExporter());
        return collection;
    }
}

实现导出功能的类需要继承com.fr.io.exporter.AbstractAppExporter:

导出XML的实际实现类
public class XmlExporter extends AbstractAppExporter {

    @Override
    public void export(OutputStream out, ResultWorkBook book) throws Exception {
        // 不分页导出的实现
    }

    @Override
    public void export(java.io.OutputStream out, PageSetProvider pageSet) throws Exception {
        // 分页导出的实现
    }
}

给contentPane(分页预览、填报预览)的web对象增加导出函数:

panel.export.js
(function($){
    // 你好啊,导出
    $.extend(FR.WritePane.prototype, {
        exportReportToXML : function() {
            if (this.fireEvent("beforexml") === false) {
                return;
            }
            var self = this;
            this.saveReport(function () {
                window.location = FR.servletURL + "?op=export&sessionID=" + self.currentSessionID + "&format=xml";
                FR.progressBar(self.currentSessionID,"xml");
                self.fireEvent("afterxml");
            });
        }
    });
    $.extend(FR.PagePane.prototype, {
        exportReportToXML : function() {
            if (this.fireEvent("beforexml") === false) {
                return;
            }
            window.location = FR.servletURL + "?op=export&sessionID=" + this.currentSessionID + "&format=xml";
            FR.progressBar(this.currentSessionID, "xml");
            this.fireEvent("afterxml");
        }
    });
})(jQuery); 

上面的JavaScript代码通过接入点JavaScriptFileHandler引入到报表模块后,前端预览时contentPane就会增加一个exportReportToXML方法了。

再补充完其他几个接入点接口的实现,在plugin.xml中注册即可

<extra-core>
    <LocaleFinder class="com.fr.plugin.export.xml.XmlLocaleFinder"/>
</extra-core>
<extra-report>
    <ExtensionButtonProvider class="com.fr.plugin.export.xml.core.XmlExtensionButton"/>
    <ExportOperateProvider class="com.fr.plugin.export.xml.core.XmlExport"/>
    <JavaScriptFileHandler class="com.fr.plugin.export.xml.XmlFileHandler"/>
</extra-report>
<extra-designer>
    <ToolbarItemProvider class="com.fr.plugin.export.xml.ui.XmlExportToolbarUI"/>
</extra-designer>

完成上面的所有工作后,打包好插件并安装上,就可以在设计器中Web属性配置界面添加XML导出按钮了,预览模板的时候,就可以直接点击这个按钮将报表导出成xml文件,同样的,也可以和其他的url直接导出方式一样,给url后加参数&format=xml,直接将报表导出成xml文件。

源码 

完整的示例源码参照这里:http://www.finedevelop.com:2015/projects/FS/repos/plugin-xml-export

  • No labels