`
ajian528
  • 浏览: 19267 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics