日期:2014-05-16  浏览次数:21108 次

用JasperReport实现窗口冻结

以前在新浪博客上发表过一篇<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();

这样即可实现了。

?

在此总结,希望对自己有所提高,对大家有所帮助。

?