在java导入excel时可能会存在合并单元格的情况,而合并单元格可能会在标题中也可能会在正文中,这个视情况而定。
处理正文存在合并单元格的情况:
正文存在合并单元格会导致读出来的数据,只有第一行的单元格字段有数据。
/**
* 判断指定的单元格是否是合并单元格
* @param sheet
* @param row 行下标
* @param column 列下标
* @return
*/
private boolean isMergedRegion(Sheet sheet,int row ,int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress range = sheet.getMergedRegion(i);
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if(row >= firstRow && row <= lastRow){
if(column >= firstColumn && column <= lastColumn){
return true;
}
}
}
return false;
}
/**
* 获取合并单元格的值
* @param sheet
* @param row
* @param column
* @return
*/
public Object getMergedRegionValue(Sheet sheet ,int row , int column){
int sheetMergeCount = sheet.getNumMergedRegions();
for(int i = 0 ; i < sheetMergeCount ; i++){
CellRangeAddress ca = sheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow();
if(row >= firstRow && row <= lastRow){
if(column >= firstColumn && column <= lastColumn){
Row fRow = sheet.getRow(firstRow);
Cell fCell = fRow.getCell(firstColumn);
return getCellValue(fRow, column) ;
}
}
}
return null ;
}
标题存在单元格的情况:
标题存在单元格会导致,在读取标题的时候,通过固定的一个行的值读取导致标题丢失的情况,而这个时候就需要循环处理一下,根据传递的值,循环从0也就是excel的第一行开始读取,我下面的这个代码是若依导入工具类的代码,我是基于这个改造的。
// 获取表头 由于可能存在表头有合并单元格的情况,所以此时titleNum是一个范围
// 举例 比如传的是1,那就说明表头在第一行和第二行都存在,所以需要将两行的表头全部拿出来
// 注:excel起始行时0
for(int t = 0; t <= titleNum; t++){
Row heard = sheet.getRow(t);
for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++)
{
Cell cell = heard.getCell(i);
if (StringUtils.isNotNull(cell))
{
String value = this.getCellValue(heard, i).toString();
cellMap.put(value, i);
}
else
{
cellMap.put(null, i);
}
}
}
以上代码依赖poi,需要提前导入