excel导入导出引入的是poi 4.x包,这个应该是目前java当中用的最为普遍的excel处理工具包,最近比较火的easyexcel实际上也是基于poi封装的
废话不多说,直接上核心代码:
@RequestMapping("budgetImport") @ResponseBody public Response budgetImport(@RequestParam("file") MultipartFile file) throws Exception { String fileName = file.getOriginalFilename(); if (!fileName.matches("^.+\\.(?i)(xls)$") && !fileName.matches("^.+\\.(?i)(xlsx)$")) { return Response.failure("文件格式不正确"); } boolean isExcel2003 = true; if (fileName.matches("^.+\\.(?i)(xlsx)$")) { isExcel2003 = false; } InputStream is = file.getInputStream(); Workbook wb = null; if (isExcel2003) { wb = new HSSFWorkbook(is); } else { wb = new XSSFWorkbook(is); } Sheet sheet = wb.getSheetAt(0); for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { ..... } return Response.success(sheet.getPhysicalNumberOfRows()); }
踩过的坑1:Sheet sheet = wb.getSheetAt(0);
这一行代码实际上很简单,就是get第一个sheet,但是这里会有个坑,就是如果这个excel文件中有很多个sheet,但是有一些隐藏的sheet,那么这一行代码可能并不是你想要get的那个sheet,比如假设有ABC三个sheet,其中B是你想要get的,然后AC被隐藏了(这时候你打开这个excel文件的时候第一眼看到的虽然是B),但是这一行代码实际上获取的是A这个sheet,解决办法是把AC显示出来然后干掉,或者把A跟B调换位置,那么wb.getSheetAt(0)就能取到B这个sheet了,如何显示隐藏的sheet呢,如图:
踩过的坑2:sheet.getLastRowNum() 会出现读取到的行数比实际要少一行,改用sheet.getPhysicalNumberOfRows()即可