springMVC之解析excel xls 和 xlsx格式
阿新 • • 發佈:2018-12-17
一、pom.xml
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.10-FINAL</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.10-FINAL</version> </dependency>
二、工具類
/** * @Descriptiony: 讀取Excel * @Author XIAOHUI.XU * @Date: Created in 2018/10/23_17:39 */ @Slf4j public class ReadExcelUtils { private final static String xls = "xls"; private final static String xlsx = "xlsx"; /** * 讀入excel檔案,解析後返回 * * @param file * @throws IOException */ public static List<String[]> readExcel(MultipartFile file) throws IOException { //檢查檔案 checkFile(file); //獲得Workbook工作薄物件 Workbook workbook = getWorkBook(file); //建立返回物件,把每行中的值作為一個數組,所有行作為一個集合返回 List<String[]> list = new ArrayList<>(); if (workbook != null) { for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) { //獲得當前sheet工作表 Sheet sheet = workbook.getSheetAt(sheetNum); if (sheet == null) { continue; } //獲得當前sheet的開始行 int firstRowNum = sheet.getFirstRowNum(); //獲得當前sheet的結束行 int lastRowNum = sheet.getLastRowNum(); //迴圈除了第一行的所有行 for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++) { //為了過濾到第一行因為我的第一行是資料庫的列 //獲得當前行 Row row = sheet.getRow(rowNum); if (row == null) { continue; } //獲得當前行的開始列 int firstCellNum = row.getFirstCellNum(); //獲得當前行的列數 //為空列獲取 int lastCellNum = row.getLastCellNum(); String[] cells = new String[row.getLastCellNum()]; //迴圈當前行 for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) { Cell cell = row.getCell(cellNum); cells[cellNum] = getCellValue(cell); } list.add(cells); } } } return list; } public static void checkFile(MultipartFile file) throws IOException { //判斷檔案是否存在 if (null == file) { throw new FileNotFoundException("檔案不存在!"); } //獲得檔名 String fileName = file.getOriginalFilename(); //判斷檔案是否是excel檔案 if (!fileName.endsWith(xls) && !fileName.endsWith(xlsx)) { throw new IOException(fileName + "不是excel檔案"); } } public static Workbook getWorkBook(MultipartFile file) { //獲得檔名 String fileName = file.getOriginalFilename(); //建立Workbook工作薄物件,表示整個excel Workbook workbook = null; try { //獲取excel檔案的io流 InputStream is = file.getInputStream(); //根據檔案字尾名不同(xls和xlsx)獲得不同的Workbook實現類物件 if (fileName.endsWith(xls)) { //2003 workbook = new HSSFWorkbook(is); } else if (fileName.endsWith(xlsx)) { //2007 workbook = new XSSFWorkbook(is); } } catch (IOException e) { log.info(e.getMessage()); } return workbook; } public static String getCellValue(Cell cell) { String cellValue = ""; if (cell == null) { return cellValue; } //把數字當成String來讀,避免出現1讀成1.0的情況 if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { cell.setCellType(Cell.CELL_TYPE_STRING); } //判斷資料的型別 switch (cell.getCellType()) { case Cell.CELL_TYPE_NUMERIC: //數字 cellValue = String.valueOf(cell.getNumericCellValue()); break; case Cell.CELL_TYPE_STRING: //字串 cellValue = String.valueOf(cell.getStringCellValue()); break; case Cell.CELL_TYPE_BOOLEAN: //Boolean cellValue = String.valueOf(cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_FORMULA: //公式 cellValue = String.valueOf(cell.getStringCellValue()); break; case Cell.CELL_TYPE_BLANK: //空值 cellValue = ""; break; case Cell.CELL_TYPE_ERROR: //故障 cellValue = "非法字元"; break; default: cellValue = "未知型別"; break; } return cellValue; } }