日期:2014-05-16 浏览次数:21108 次
以前在新浪博客上发表过一篇<jasperreport实现excel的冻结窗口>的思路。由于当时的客户后来不再要求实现该功能,后来就没再多思考。今天偶登录新浪博客,发现有人要例子源码,于是就总结实现了下。
?
先说下原理,jasperreport是没有实现冻结窗口功能的,但其底层用的是POI框架,也就是jasperreport是对poi的一个封装。POI是实现了对窗口冻结功能的,所以我们的思路就是通过对jasperreport的一些修改从而实现该功能。
POI的冻结窗口API(http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Sheet.html):
createFreezePane
(int?colSplit,
int?rowSplit)
??????????Creates a split (freezepane).
?
其使用的例子,在百度文库中有(http://wenku.baidu.com/view/bcc25d0cba1aa8114431d91d.html),这里不再赘述。
?
通过查找jasperreport的源码,发现在net.sf.jasperreports.engine.export.JRXlsExporter类中createReport方法有对Sheet继承类HSSFSheet的操作,可以通过调用该类的createFreezePane(int?colSplit,
int?rowSplit)方法来实现冻结窗口。
?
再查看我们写的导出excel方法(具体代码网上很多,这里也不再粘贴),如下:
????? JRXlsExporter xlsExporter = new JRXlsExporter();
????? xlsExporter.setParameter( JRExporterParameter.JASPER_PRINT, jasperPrint );??
????? xlsExporter.setParameter( JRExporterParameter.OUTPUT_FILE, new File("E:/Workspaces_BJ/workBJ/asf/src/test/report/location_xls4Report.xls") );??
????? xlsExporter.exportReport();
通过调试发现,net.sf.jasperreports.engine.export.JRXlsExporter类的createReport方法在上述代码的xlsExporter.exportReport()后调用,所以我们需要给她加个方法,在exportReport()之前进行设置即可。
?
在尽量不修改源码的前提下,我们重写net.sf.jasperreports.engine.export.JRXlsExporter类的createReport方法,并增加一个设置冻结窗口的方法,如下
package test.report;
public class JRXlsExporter extends
??? ??? net.sf.jasperreports.engine.export.JRXlsExporter {
??? private int colSplit; //冻结行
??? private int rowSplit; //冻结列
??? @Override
??? protected void createSheet(String name) {
??? ??? super.createSheet(name);
??? ??? if(colSplit != 0 && rowSplit!= 0)//在不设置的情况下不调用
??? ??? ??? sheet.createFreezePane(colSplit, rowSplit);
??? }
???
??? public void createFreezePane(int colSplit, int rowSplit) {
??? ??? this.colSplit = colSplit;
??? ??? this.rowSplit = rowSplit;
??? }
}
?
把以上原来导出excel的net.sf.jasperreports.engine.export.JRXlsExporter替换成我们重写后的test.report.JRXlsExporter,在new出实例后,如需设置冻结窗口,调用createFreezePane方法即可。所以最终代码如下:
????? JRXlsExporter xlsExporter = new JRXlsExporter();
????? xlsExporter.createFreezePane(1, 1);//设置冻结窗口
????? xlsExporter.setParameter( JRExporterParameter.JASPER_PRINT, jasperPrint );??
????? xlsExporter.setParameter( JRExporterParameter.OUTPUT_FILE, new File("E:/Workspaces_BJ/workBJ/asf/src/test/report/location_xls4Report.xls") );??
????? xlsExporter.exportReport();
这样即可实现了。
?
在此总结,希望对自己有所提高,对大家有所帮助。
?