四、页面边距bug
这个bug一般人是真没有发现的,但是对我来说就是差点要了老命....我们公司项目导出的excel报表比较大,一张A3纸都只是勉勉强强够打印。所以平常边距要设定得很小,这个边距的bug就是你在模板中设定的页面边距并不会拷贝进你导出的文件的。
你可能试验了一下说,没有啊,我的没问题啊。我说的不会拷贝仅是在分页分sheet导出时候出现的问题。我举个例子,你在模板中设定了页面边距,然后导出,JXLS会先把你的模板复制进导出的文件中,然后建立一个新的sheet,然后在根据模板的设定把内容拷贝进新sheet中,然后再建立新sheet不断循环。
问题就出现在把模板拷进新sheet的过程中,如果你改变了模板的页面边距,再进行一个分sheet导出,不要用POi删除导出文件第一页空的模板sheet,你查看第一页的页边距你发现是已经修改过的页边距,而你查看后面其他sheet的页边距就会是excel默认的页边距了。
不明白不要紧,你只要知道我已经解决了就好(新版本2.4.2我不知道作者有没有修复)。
问题就出现在这个PoiUtil的文件上,我们打开看看,看到copySheetProperties(Sheet src, Sheet dest)这个方法,这个方法就是拷贝sheet属性的。
public static void copySheetProperties(Sheet src, Sheet dest){
dest.setAutobreaks(src.getAutobreaks());
dest.setDisplayGridlines(src.isDisplayGridlines());
dest.setVerticallyCenter(src.getVerticallyCenter());
dest.setFitToPage(src.getFitToPage());
dest.setForceFormulaRecalculation(src.getForceFormulaRecalculation());
dest.setRowSumsRight(src.getRowSumsRight());
dest.setRowSumsBelow( src.getRowSumsBelow() );
//增加页边距保存
dest.setMargin(Sheet.TopMargin, src.getMargin(Sheet.TopMargin));
dest.setMargin(Sheet.LeftMargin, src.getMargin(Sheet.LeftMargin));
dest.setMargin(Sheet.RightMargin, src.getMargin(Sheet.RightMargin));
dest.setMargin(Sheet.BottomMargin, src.getMargin(Sheet.BottomMargin));
copyPrintSetup(src, dest);
}
这个方法内少写了对sheet页边距的拷贝,加上就行。加上后怎么放回包里?你可以自行打包....你也可以在你的项目目录上建立一个与PoiUtil类一模一样的路径,然后在里面放上修改后的类。Java在找包时候会优先找你写的路径,这样就覆盖掉了包路径了。
在src的根目录上,和com同级。
好了,这一篇文章就写到这里,写这篇文章时候我是懒的,我懒得再去做案例验证了,特别是最后的那个页边距的bug,我在当初我在网络上根本找不到和我一样的问题。我也是花了些功夫才找到这个原因的。本来我应该做下案例把这个bug讲清楚些,但是我写到这里我已经有些懒了.....说白了这个bug就是只有在分sheet导出时候才会出现的问题,能自己复现的就自己研究下,不能的,知道怎么解决了就行了。