execl判断合并单元格并没有直接的方法,只能通过获取所有合并单元格并循环所有合并单元格,判断当前单元格的行数和列数是否在某一个合并单元格内,如果在的话则取合并单元格的第一行数据(因为合并单元格只有第一行数据有值,其他都为空) 。
话不多说直接上代码:
<!--xls-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!--xlsx-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
首先导入相关依赖包
下面是代码示例
public static void main(String[] args) throws IOException {
//获取文件输入流
FileInputStream fis = new FileInputStream("asd.xlsx");
//创建工作簿对象,也就是execl文件对象
Workbook workbook = new XSSFWorkbook(fis);
//获取第一个sheet页
Sheet sheet = workbook.getSheetAt(1);
for (int i = 0; i <= sheet.getLastRowNum(); i++) {
String rowStr="";
//循环获取sheet页的每一行
Row row = sheet.getRow(i);
//循环每一行的每一个单元格
for (Cell cell : row) {
//判断是否是合并单元格并返回值
String value = getValue(sheet, i, cell.getColumnIndex());
//数值为空说明不是合并单元格或者当前单元格为空,则直接获取当前单元格值
if("".equals(value)){
value=cell.getStringCellValue();
}
rowStr+="--"+value;
}
System.out.println(rowStr);
}
}
private static String getValue(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) && (column >= firstColumn && column <= lastColumn)) {
Row fRow = sheet.getRow(firstRow);
Cell fCell = fRow.getCell(firstColumn);
//获取合并单元格首格的值
return fCell.getStringCellValue();
}
}
//非合并单元格个返回空
return "";
}
下面是execl表格内容和输出的内容
**值得注意的是判断行列的时候只要编辑过的单元格就算删除内容也会包含进去,除非删除单元格 。
注:案例仅供参考