控制層
@RequestMapping(value="upload") @ResponseBody public String upload(MultipartFile file){ try { String fileName = file.getOriginalFilename(); // 獲取上傳文件的輸入流 InputStream inputStream = file.getInputStream(); // 調用工具類中方法,讀取excel文件中數據 List<Map<String, Object>> sourceList = ImportExcel.readExcel(fileName, inputStream); // 將對象先轉為json格式字符串,然后再轉為List<SysUser> 對象 ObjectMapper objMapper = new ObjectMapper(); String infos = objMapper.writeValueAsString(sourceList); // json字符串轉對象 List<User> list = objMapper.readValue(infos, new TypeReference<List<User>>() {}); // 批量添加 userService.addUsers(list); return "success"; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return e.getMessage(); } }
ImportExcel工具類
package com.example.demo.User.service; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ImportExcel { public static boolean isXls(String fileName){ // (?i)忽略大小寫 if(fileName.matches("^.+\\.(?i)(xls)$")){ return true; }else if(fileName.matches("^.+\\.(?i)(xlsx)$")){ return false; }else{ throw new RuntimeException("格式不對"); } } public static List<Map<String, Object>> readExcel(String fileName, InputStream inputStream) throws Exception{ boolean ret = isXls(fileName); Workbook workbook = null; // 根據后綴創建不同的對象 if(ret){ workbook = new HSSFWorkbook(inputStream); }else{ workbook = new XSSFWorkbook(inputStream); } Sheet sheet = workbook.getSheetAt(0); // 得到標題行 Row titleRow = sheet.getRow(0); int lastRowNum = sheet.getLastRowNum(); int lastCellNum = titleRow.getLastCellNum(); List<Map<String, Object>> list = new ArrayList<>(); for(int i = 1; i <= lastRowNum; i++ ){ Map<String, Object> map = new HashMap<>(); Row row = sheet.getRow(i); for(int j = 0; j < lastCellNum; j++){ // 得到列名 String key = titleRow.getCell(j).getStringCellValue(); Cell cell = row.getCell(j); cell.setCellType(CellType.STRING); map.put(key, cell.getStringCellValue()); } list.add(map); } workbook.close(); return list; } }
【注意】excel每個列名要和數據庫字段名一致!!
對於有date類型的數據,excel輸入2019-12-12會變為日期格式數據,日期類型傳到后台時會轉成字符串,其格式會出錯,就無法轉換Date類型,
所以Excel表格一定要將時間相關數據用文本格式存儲!!!
數據庫對應實體類與時間相關屬性要添加@DateTimeFormat(pattern="yyyy-MM-dd")注解