在我们进行导入的时候难免不会遇到合并行的导入,如果在没有遇到合并行的导入的时候我们使用easypoi做导入是最方便的,因为它为我们提供了很多现成的类进行导入,去除了一些麻烦的解析判断操作,但是它没有为我们提供如果存在合并行的情况下的导入操作(当然也许是我没有发现),需要我们自己调用poi包来实现,我这里使用了4.0.1的包
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version> </dependency>
使用poi-ooxml是因为可以同时解析xls和xlsx这两种情况。
下面我们看看具体的合并行代码的实现
/** * 获取合并行的数据 * * @param sheet * @param row * @param column * @return */ private static String getMergedRegionValue(Sheet sheet, int row, int column) { // 获得该sheet所有合并单元格数量 int sheetMergeCount = sheet.getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { // 获得合并区域 CellRangeAddress cellAddresses = sheet.getMergedRegion(i); int firstColumn = cellAddresses.getFirstColumn(); int lastColumn = cellAddresses.getLastColumn(); int firstRow = cellAddresses.getFirstRow(); int lastRow = cellAddresses.getLastRow(); /*判断传入的单元格的行号列号是否在合并单元格的范围内, 如果在合并单元格的范围内,择返回合并区域的首单元格格值 */ if (row >= firstRow && row <= lastRow) { if (column >= firstColumn && column <= lastColumn) { Row firRow = sheet.getRow(firstRow); Cell firCell = firRow.getCell(firstColumn); return getCellValue(firCell); } } } // 如果该单元格行号列号不在任何一个合并区域,择返回null return null; }
在上面代码中我们可以看到通过判断一共有多少合并区域,然后通过循环合并区域中的起始和结束行列来判断当前行和列是否在该合并区域里面,如果在该区域就获取当前区域的第一行中表格中的值来作为当前行列的值。我们来看下获取表格值的代码片段
/** * 获取单元格值 * * @param cell * @return */ private static String getCellValue(Cell cell) { String cellValue = ""; if (cell == null) { return cellValue; } // 把数字当成String来读,避免出现1读成1.0的情况 if (cell.getCellType() == CellType.NUMERIC) { cell.setCellType(CellType.STRING); } // 判断数据的类型 switch (cell.getCellType()) { // 文本 case STRING: cellValue = cell.getStringCellValue(); break; // 数字、日期 case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { sdf = new SimpleDateFormat("yyyy/MM/dd"); // 日期型 cellValue = sdf.format(cell.getDateCellValue()); } else { // 数字 cellValue = String.valueOf(cell.getNumericCellValue()); } break; // 布尔型 case BOOLEAN: cellValue = String.valueOf(cell.getBooleanCellValue()); break; // 空白 case BLANK: cellValue = cell.getStringCellValue(); break; // 错误 case ERROR: cellValue = ""; break; // 公式 case FORMULA: cellValue = ""; break; default: cellValue = ""; } return cellValue; }
以上就是主要的一些片段,具体的代码可以参考上传文件。