由XLSTransformer类的方法:
transformMultipleSheetsList(is,objects,newSheetNames,beanName,beanParams,startSheetNum;
产生的,是源码存在bug引起的。
解决方法一:
在Workbook输出之前调用以下方法,可以去除重复的单元格合并
//去除重复的单元格合并
private void mergeNoRepeat(Workbook workbook){
Map<String,CellRangeAddress> map=new HashMap<String,CellRangeAddress>();
for(int i=0;i<workbook.getNumberOfSheets();i++){
Sheet sheet = workbook.getSheetAt(i);
int mergeNum=sheet.getNumMergedRegions();
for(int j=0;j<mergeNum;j++){
CellRangeAddress mergedRegion =sheet.getMergedRegion(0);
map.put(mergedRegion.toString(),mergedRegion);
sheet.removeMergedRegion(0);
}
for(String key:map.keySet()){
sheet.addMergedRegion(map.get(key));
}
map.clear();
}
}
解决方法二:
修改源码:
Util类
1、 areRegionsEqual(CellRangeAddress region1, CellRangeAddress region2)方法,
region2改为region1
2、 copyRow(Sheet srcSheet, Sheet destSheet, Row srcRow, Row destRow, String expressionToReplace, String expressionReplacement) 方法
注释掉Set语句,改为形参 , 如下图
3、 copySheets(Sheet newSheet, Sheet sheet,String expressionToReplace, String expressionReplacement)方法
加参数 如下图
XLSTransformer类
transformMultipleSheetsList(InputStreamis, List objects, List newSheetNames, String beanName, Map beanParams,int startSheetNum)方法
添加Set语句,如下图
很显然,产生bug的原因是因为Set集合创建的时机不对,若按照原先copyRow方法内创建Set集合来存储Merge Cell,那么只能存储本行内的合并,而跨行合并的就不能存储了。而areRegionEqual方法出现的却是很低级的错误了,很显然四个属性在比较相等性嘛,就不必多说了!
强烈建议呢,使用方法一比较好,原因有以下几点:
1、 源码本身就比较杂乱,没有必要的注解,胡乱添加更会乱上加乱,
2、 修改源码要涉及到重新编译等,很繁琐
修改源码最好是方法重载,不要修改原有的方法,但这样一来修改幅度有些大了,划不来