IllegalArgumentException: Unknown margin constant: 4异常的解决方案

 

这段时间在研究POI设置Excel样式。

在对页面打印设置的时候,遇到一个问题,这里记录一下,和大家分享一下我的解决方案。

问题描述:在用POI设置页边距的时候,POI抛出异常:IllegalArgumentException: Unknown margin constant:  4

经过我的研究发现,这是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);  //头页边距 
sheet.setMargin(HSSFSheet.FooterMargin, 0.25);  //脚页边距

在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三个版本存在一样的问题。

我的解决方案:换一种设置方法即可(主要针对于头和脚)

hssfSheet.getPrintSetup().setFooterMargin(0.05);
hssfSheet.getPrintSetup().setHeaderMargin(0.05);

这样就可以很轻松的解决问题了。

 

Thanks

Jack.Li 

Email Address: jackxlee89@yahoo.cn

qq:523072842

2012.08.17

 

转载于:https://www.cnblogs.com/jackxlee/archive/2012/08/17/2643557.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值