前言
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
2 Comments
Anonymous
源码参考的那个地址是需要登陆的?
finedev
在dev.fanruan.com导航上面的开源代码仓库里找一找