Jasper IReport 3.7.6版本Excel报表冻结前两行的实现方案
在Jasper IReport 3.7.6中实现Excel报表前两行冻结的替代方案
JasperReports 3.7.6版本确实不支持net.sf.jasperreports.export.xls.freeze.row这类官方冻结属性(这些属性是4.0及以后版本才添加的),要实现前两行(PDD、Reparto)滚动冻结,最可靠的方法是通过自定义Excel导出处理器操作POI底层API设置冻结窗格,无需升级版本。
方法:自定义Excel导出处理器(JRXlsExporterCustomizer)
1. 编写自定义处理器类
创建一个实现JRXlsExporterCustomizer接口的Java类,利用Apache POI的API直接设置冻结窗格:
import net.sf.jasperreports.engine.export.JRXlsExporterCustomizer; import net.sf.jasperreports.engine.export.JRXlsExporterContext; import org.apache.poi.ss.usermodel.Sheet; public class FreezeTopTwoRowsCustomizer implements JRXlsExporterCustomizer { @Override public void customize(JRXlsExporterContext exporterContext) { Sheet targetSheet = exporterContext.getSheet(); // createFreezePane(冻结列数, 冻结行数):参数2表示从第3行开始滚动,前2行固定 targetSheet.createFreezePane(0, 2); } }
2. 打包并部署类
- 将编译好的类打包成JAR文件。
- 若通过Java代码导出报表:将JAR加入项目依赖。
- 若在IReport Designer中使用:把JAR放到IReport安装目录的
lib文件夹,重启IReport。
3. 配置导出时使用自定义处理器
场景1:Java代码导出
在导出逻辑中绑定自定义处理器:
import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.export.JRXlsExporter; import net.sf.jasperreports.engine.export.JRXlsExporterParameter; public class ReportExporter { public static void exportToExcel(JasperPrint jasperPrint, String outputPath) throws Exception { JRXlsExporter exporter = new JRXlsExporter(); exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRXlsExporterParameter.OUTPUT_FILE_NAME, outputPath); // 绑定自定义冻结处理器 exporter.setParameter(JRXlsExporterParameter.CUSTOMIZER, new FreezeTopTwoRowsCustomizer()); exporter.exportReport(); } }
场景2:IReport Designer直接导出
- 打开报表,点击菜单栏
File > Export > Excel。 - 在导出设置窗口的Advanced标签下,找到
Customizer选项。 - 填入自定义类的全限定名(例如
com.yourcompany.report.FreezeTopTwoRowsCustomizer)。 - 完成设置后导出,生成的Excel文件会自动冻结前两行。
补充说明
- 你之前尝试的
net.sf.jasperreports.export.xls.freeze.row.edge等属性仅在JasperReports 4.0及以上版本生效,3.7.6不支持这些属性,因此无法直接使用。 - 自定义处理器直接操作POI底层API,兼容性强,是旧版本实现Excel冻结的标准方案。
内容的提问来源于stack exchange,提问作者The Deepest Sleep
相关产品推荐
相关产品推荐

