POI一Bug详谈,大家讨论一下,有没有解决办法
我这两天,因为客户对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都没有解决。请问是否有其他的解决办法?