首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

POI一Bug详谈,大家讨论一下,有没有解决方法

2012-06-28 
POI一Bug详谈,大家讨论一下,有没有解决办法我这两天,因为客户对Excel导出格式有高要求,因为想做的灵活,不

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都没有解决。请问是否有其他的解决办法?

热点排行