package com.bj58.finance.platform.operation.provider.util; import org.apache.log4j.Logger; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.util.ArrayList; import java.util.List; /** * excel讀寫工具類 */ public class POIUtil { private static Logger logger = Logger.getLogger(POIUtil.class); 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<String[]>(); 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.getPhysicalNumberOfCells(); String[] cells = new String[row.getPhysicalNumberOfCells()]; //循環當前行 for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) { Cell cell = row.getCell(cellNum); cells[cellNum] = getCellValue(cell); } list.add(cells); } } workbook.close(); } return list; } public static void checkFile(MultipartFile file) throws IOException { //判斷文件是否存在 if (null == file) { logger.error("文件不存在!"); throw new FileNotFoundException("文件不存在!"); } //得到文件名 String fileName = file.getOriginalFilename(); //判斷文件是不是excel文件 if (!fileName.endsWith(xls) && !fileName.endsWith(xlsx)) { logger.error(fileName + "不是excel文件"); 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) { logger.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.getCellFormula()); break; case Cell.CELL_TYPE_BLANK: //空值 cellValue = ""; break; case Cell.CELL_TYPE_ERROR: //故障 cellValue = "非法字符"; break; default: cellValue = "未知類型"; break; } return cellValue; } public static void main(String[] args) { File file = new File("D://新增產品支持的銀行列表模板.xlsx"); FileInputStream input = null; try { input = new FileInputStream(file); MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); List<String[]> list = readExcel(multipartFile); System.out.println(list); } catch (Exception e) { e.printStackTrace(); } } }
須要引入的Maven依賴:java
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.2.5.RELEASE</version> </dependency>