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:
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对象增加导出函数:
(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