以前在新浪博客上发表过一篇<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();
这样即可实现了。
在此总结,希望对自己有所提高,对大家有所帮助。