我这两天,因为客户对Excel导出格式有高要求,因为想做的灵活,不想用模板,所有样式,页面打印设置用POI代码实现所以遇到POI设置页边距的一个怪问题,于是下载了POI的源码研究了一下,结果发现肯定是POI的一个Bug。现列出来,大家讨论讨论,如何解决。
sheet.setMargin(HSSFSheet.BottomMargin, 0.5);// 页边距(下)
sheet.setMargin(HSSFSheet.LeftMargin, 0.25);// 页边距(左)
sheet.setMargin(HSSFSheet.RightMargin, 0.25);// 页边距(右)
sheet.setMargin(HSSFSheet.TopMargin, 0.5);// 页边距(上)
sheet.setMargin(HSSFSheet.HeaderMargin, 0.25);// Header 边距
sheet.setMargin(HSSFSheet.FooterMargin, 0.25);// Footer 边距
在org.apache.poi.ss.usermodel.Sheet接口里定义了如下6个常量值
public static final short LeftMargin = 0;
public static final short RightMargin = 1;
public static final short TopMargin = 2;
public static final short BottomMargin = 3;
public static final short HeaderMargin = 4;
public static final short FooterMargin = 5;
但一直跟下去,在org.apache.poi.hssf.record.aggregates.PageSettingsBlock里有这样一个方法:
public void setMargin(short margin, double size) {
Margin m = getMarginRec(margin);
if (m == null) {
switch (margin) {
case InternalSheet.LeftMargin:
_leftMargin = new LeftMarginRecord();
m = _leftMargin;
break;
case InternalSheet.RightMargin:
_rightMargin = new RightMarginRecord();
m = _rightMargin;
break;
case InternalSheet.TopMargin:
_topMargin = new TopMarginRecord();
m = _topMargin;
break;
case InternalSheet.BottomMargin:
_bottomMargin = new BottomMarginRecord();
m = _bottomMargin;
break;
default :
throw new IllegalArgumentException( "Unknown margin constant: " + margin );
}
}
m.setMargin( size );
}
这里只判断了前四种页边距,没有判断设置HeaderMargin 和FooterMargin 两种类型,所以编译期间没有错误。但在运行期间就抛出了IllegalArgumentException: Unknown margin constant: 4;
异常。
我在POI3.6, POI3.7, POI3.8beta3三个版本都试过。这个Bug都没有解决。请问是否有其他的解决办法?