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

Page tree

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

Skip to end of metadata
Go to start of metadata

前言

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://git.fanruan.com/fanruan/demo-export-xml

  • No labels

2 Comments

  1. Anonymous

    源码参考的那个地址是需要登陆的?

    1. 在dev.fanruan.com导航上面的开源代码仓库里找一找