SpringBoot讀取excel表格的示例程式碼
阿新 • • 發佈:2020-10-25
SpringBoot讀取excel表格
共同探討,向各位大佬學習
走向CEO,迎娶白富美
pom.xml依賴
<!--springboot核心依賴--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </parent> <dependencies> <!--springboot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--excel--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.11</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.11</version> </dependency> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
POIUtils工具類
public class POIUtils { private final static String xls = "xls"; private final static String xlsx = "xlsx"; private final static String DATE_FORMAT = "yyyy/MM/dd"; /** * 讀入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[]>(); 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;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); String cellValue = getCellValue(cell); list.add(cellValue); } } } workbook.close(); } 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) { e.printStackTrace(); } return workbook; } public static String getCellValue(Cell cell){ String cellValue = ""; if(cell == null){ return cellValue; } //如果當前單元格內容為日期型別,需要特殊處理 String dataFormatString = cell.getCellStyle().getDataFormatString(); if(dataFormatString.equals("m/d/yy")){ cellValue = new SimpleDateFormat(DATE_FORMAT).format(cell.getDateCellValue()); 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; } }
controller測試
@RestController @RequestMapping("/excel") public class ExcelController { @PostMapping("/look") public void look(@RequestParam("excelFile") MultipartFile excelFile){ try { List<String> list = POIUtils.readExcel(excelFile); // list.removeIf(Objects::isNull);去掉null值 //去掉空字串 Iterator<String> iterator = list.iterator(); while (iterator.hasNext()){ if (iterator.next() == ""){ iterator.remove(); } } //遍歷list,檢視資料 for (String s : list) { System.out.println(s); } //建立map物件或者pojo類存入所需的資料, Map<String,Object> map = new HashMap<>(); map.put("plan",list.get(0)); map.put("er",list.get(2)); map.put("date",list.get(4)); System.out.println(map); } catch (IOException e) { e.printStackTrace(); } } }
訪問測試
控制檯輸出
2020年度稽核計劃
編制人:
張三
時間:
2020/10/10
稽核依據:
1233211234567
稽核目的:
12345555556984552368
內審組長:
張器
內審副組長:
漲吧
稽核分組:
第一組
張四
李有
里爾
三點
第二組
張五
王柳
王琦
士大夫
{date=2020/10/10,plan=2020年度稽核計劃,er=張三}
注意問題
在excel表格中,日期或者時間在java讀取時會以數值的型別讀取,得到的是10-十月-2020,所以在excel表格日期型別的資料用自定義型別,並設定格式。(親測)
到此這篇關於SpringBoot讀取excel表格的示例程式碼的文章就介紹到這了,更多相關SpringBoot讀取excel表格內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!