tft每日頭條

 > 生活

 > poi導出excel提示錯誤

poi導出excel提示錯誤

生活 更新时间:2024-06-29 16:55:34

poi導出excel提示錯誤?前言:剛開始導入Excel的時候,每次有新的Excel文件需要導入的時候就需要重新再新寫一個對應的工具來導入excel所以,鄙人痛定思痛,覺得有必要寫一個可以萬能導入的Excel工具,現在小編就來說說關于poi導出excel提示錯誤?下面内容希望能幫助到你,我們來一起看看吧!

poi導出excel提示錯誤(利用POI和反射實現Excel自動識别實體類導入)1

poi導出excel提示錯誤

前言:

剛開始導入Excel的時候,每次有新的Excel文件需要導入的時候就需要重新再新寫一個對應的工具來導入excel。所以,鄙人痛定思痛,覺得有必要寫一個可以萬能導入的Excel工具。

private final static String xls = "xls"; private final static String xlsx = "xlsx"; public static Map<String, Object> readExcelPOIT(Object obj) throws Exception { // FileInputStream fis = (FileInputStream) file.getInputStream(); Map<String,Object> jsonObject = new HashMap<>(); String msg = null; List<String> msgList = new ArrayList<>(); //創建輸入流 FileInputStream fis = new FileInputStream(new File("g:\\data\\test.xlsx")); //通過構造函數傳參 Workbook workbook = getWorkBookT(new File("g:\\data\\test.xlsx")); // Workbook workbook = getWorkBook(file); int sheets = workbook.getNumberOfSheets(); if (sheets<1){ msg="内容為空"; msgList.add(msg); jsonObject.put("msg",msgList); return jsonObject; } //獲取工作标名稱 // for (int i=0;i<sheets;i ){ // System.out.println(workbook.getSheetName(i)); // // } //獲取工作表 第一張工作表 Sheet sheet = workbook.getSheetAt(0); //獲取行,行号作為參數傳遞給getRow方法,第一行從0開始計算 //獲取第一行 int firstRowNum = sheet.getFirstRowNum() 2; //獲取第一行的第一個值進行判斷是否為我需要的值 Row row1 = sheet.getRow(firstRowNum); Row row2 = sheet.getRow(firstRowNum-1); Class cl = obj.getClass(); Field[] fs = cl.getDeclaredFields(); StringBuilder stringBuilder = new StringBuilder(); for (Field f : fs ){ if (stringBuilder.length()==0){ stringBuilder.append(f.getName()); }else { stringBuilder.append(","); stringBuilder.append(f.getName()); } } String containsIn = stringBuilder.toString(); if (row1==null){ msg="内容為空"; msgList.add(msg); jsonObject.put("msg",msgList); return jsonObject; } // 判斷 所需字段是否存在 int cellNum = -1; short rowNum = row2.getLastCellNum(); for (int i=0;i<rowNum;i ){ Cell cell1 = row2.getCell(i); cell1.setCellType(CellType.STRING); if (cell1!=null){ String cellValue = cell1.getStringCellValue(); if (!containsIn.contains(cellValue)){ cellNum=i; break; } } } if (cellNum!=-1){ msg="不存在需要的字段"; msgList.add(msg); jsonObject.put("msg",msgList); return jsonObject; } //最後 一列 // short lastCellNum = row.getLastCellNum(); //最後一行 Integer sheetLastRowNum = sheet.getLastRowNum(); List<Object> list = new ArrayList<>(); if (sheetLastRowNum<1){ msg="數據行不存在"; msgList.add(msg); } for (int i=firstRowNum 1;i<sheetLastRowNum 1;i ){ //獲取第i行 Row row = sheet.getRow(i); //獲取該列 Cell cell1 = null; if (row!=null){ Object object = obj.getClass().newInstance(); BeanUtils.copyProperties(obj,object); for (int j=0;j<rowNum;j ){ cell1 = row.getCell(j); // String cellValue = row1.getCell(j).getStringCellValue(); String cellValue = row2.getCell(j).getStringCellValue(); if (cell1==null){ msg="第" i "行第" (j 1) "列值為空"; msgList.add(msg); break; } if (cell1!=null){ cell1.setCellType(CellType.STRING); if (containsIn.contains(cellValue)){ String value = cell1.getStringCellValue(); Class cal = CustomerPoolAddRequest.class; Field field = cal.getDeclaredField(cellValue); field.setAccessible(true); field.set(object,value); } } } Object o =AnnotationUtils.validate(object).get("result"); if (Boolean.TRUE.equals(o)){ list.add(object); } } } logger.warn("msgList={}",msgList); jsonObject.put("list",list); jsonObject.put("msg",msgList); workbook.close(); fis.close(); return jsonObject; } public static Workbook getWorkBookT(File file) { //獲得文件名 // String fileName = file.getOriginalFilename(); String fileName = file.getName(); //創建Workbook工作薄對象,表示整個excel Workbook workbook = null; try { //獲取excel文件的io流 // InputStream is = file.getInputStream(); FileInputStream is = new FileInputStream(file); //根據文件後綴名不同(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; }

Excel導入規則:

注釋:前三行不被讀取

第二行内容字段與接收實體類字段相同

--

name

phone

address

姓名

手機号

地址

張三

11011011000

杭州

本次demo中,前三行是被忽略的。第二行的字段與接受的實體類相對應。

如上:隻需實體類中用name,phone,address就能接收到姓名為張三 手機号為 11011011000 地址為杭州

ps:

這裡我們隻對第一張Excel表進行了處理,需要對所有表進行處理的可自行修改

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved