一、添加依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.17</version> </dependency>
二、工具类
import lombok.extern.slf4j.Slf4j; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile; import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.text.SimpleDateFormat; import java.util.*; @Slf4j public class ExcelHelper<T> { //构造方法 public ExcelHelper() { } Class<T> clazz; public Class<T> getClazz() { return clazz; } public void setClazz(Class<T> clazz) { this.clazz = clazz; } /** * 读EXCEL文件,获取信息集合 *filePath:文件所在目录;name:文件名称;fieldmap:目标类需要导入的字段 * @param filePath * @return */ public List<T> getExcelInfo(String filePath,String name,Map fieldmap,MultipartFile Mfile) { //把spring文件上传的MultipartFile转换成CommonsMultipartFile类型 CommonsMultipartFile cf = (CommonsMultipartFile) Mfile; //获取本地存储路径 File file = new File(filePath); //创建一个目录 (它的路径名由当前 File 对象指定,包括任一必须的父路径。) if (!file.exists()) file.mkdirs(); //新建一个文件 String newFilePath=filePath+name; File file1 = new File(newFilePath); //将上传的文件写入新建的文件中 try { cf.getFileItem().write(file1); } catch (Exception e) { log.error("ReadExcel:" + e); e.printStackTrace(); } List<T> dist = new ArrayList<T>(); try { FileInputStream in = new FileInputStream(file1); HSSFWorkbook book = new HSSFWorkbook(in); // // 得到第一页 HSSFSheet sheet = book.getSheetAt(0); // // 得到第一面的所有行 Iterator<Row> row = sheet.rowIterator(); // 获取标题map Map titlemap = getTitleMap(row); while (row.hasNext()) { T tObject = clazz.newInstance(); // 标题下的第一行 Row rown = row.next(); int k = 0; // 遍历一行的列 for (int j = 0; j < rown.getLastCellNum() + 1; j++) { Cell cell = rown.getCell(j); if (cell == null) { k++; continue; } // 得到此列的对应的标题 String titleString = (String) titlemap.get(k); // 如果这一列的标题和类中的某一列的Annotation相同,那么则调用此类的的set方法,进行设值 if (fieldmap.containsKey(titleString)) { Method setMethod = (Method) fieldmap.get(titleString); setData(tObject, cell, setMethod); } k++; } dist.add(tObject); } } catch (Exception e) { log.error(e.toString()); } return dist; } private Map getTitleMap(Iterator<Row> row) { Row title = row.next(); // 得到第一行的所有列 Iterator<Cell> cellTitle = title.cellIterator(); // 将标题的文字内容放入到一个map中。 Map titlemap = new HashMap(); // 从标题第一列开始 int i = 0; // 循环标题所有的列 while (cellTitle.hasNext()) { Cell cell = cellTitle.next(); String value = cell.getStringCellValue(); // 还是把表头trim一下 value = value.trim(); titlemap.put(i, value); i = i + 1; } return titlemap; } private void setData(T tObject, Cell cell, Method setMethod) throws IllegalAccessException, InvocationTargetException { // 得到setter方法的参数 Type[] ts = setMethod.getGenericParameterTypes(); // 只要一个参数 String xclass = ts[0].toString(); // 判断参数类型 try { switch (cell.getCellTypeEnum()) { // 数字 case NUMERIC: if ("class java.lang.String".equals(xclass)) { if ((cell.getNumericCellValue() + "").indexOf(".") > 0) { setMethod.invoke(tObject, (cell.getNumericCellValue() + "").substring(0, (cell.getNumericCellValue() + "").lastIndexOf("."))); } } else if ("class java.lang.Integer".equals(xclass)) { setMethod.invoke(tObject, (int) cell.getNumericCellValue()); } else if ("int".equals(xclass)) { setMethod.invoke(tObject, (int) cell.getNumericCellValue()); } else if ("class java.lang.Long".equals(xclass)) { Long temp = (long) cell.getNumericCellValue(); setMethod.invoke(tObject, temp); } break; // 字符串 case STRING: if ("class java.lang.Integer".equals(xclass)) { setMethod.invoke(tObject, Integer.parseInt(cell.getStringCellValue())); } else if ("class java.lang.String".equals(xclass)) { setMethod.invoke(tObject, cell.getStringCellValue().trim()); } else if ("int".equals(xclass)) { int temp = Integer.parseInt(cell.getStringCellValue()); setMethod.invoke(tObject, temp); } else if ("class java.lang.Long".equals(xclass)) { Long temp = Long.parseLong(cell.getStringCellValue()); setMethod.invoke(tObject, temp); } break; // Boolean case BOOLEAN: Boolean boolname = true; if ("否".equals(cell.getStringCellValue())) { boolname = false; } setMethod.invoke(tObject, boolname); break; // 公式 case FORMULA: log.info(cell.getCellFormula() + " "); break; // 空值 case BLANK: log.info(" "); break; // 故障 case ERROR: log.info(" "); break; default: log.info("未知类型 "); break; } } catch (Exception e) { // 转换出错 log.error(e.toString()); throw e; } } // 得到目标类需要导入的字段 public Map getFieldMap(String[] fileds) throws NoSuchMethodException { Field[] filed = clazz.getDeclaredFields(); Map fieldmap = new HashMap(); // 循环读取所有字段 for (int i = 0; i < filed.length; i++) { Field f = filed[i]; for(int j=0;j<fileds.length;j++){ String fd=fileds[j]; if(f.getName().equals(fd)){ String setMethodName = "set" + f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1); Method setMethod = clazz.getMethod(setMethodName, new Class[]{f.getType()}); fieldmap.put(f.getName(), setMethod); } } } return fieldmap; } //导出EXCEL public String export(String basePath,String excelPath,String [][] content,String[] title,String sheetName,String fileName){ OutputStream os=null; try { fileName=new SimpleDateFormat("yyyy-MM-dd").format(new Date())+"/"+fileName; File folderFile=new File(basePath+excelPath+new SimpleDateFormat("yyyy-MM-dd").format(new Date())); if(!folderFile.exists()){ folderFile.mkdir(); } os = new FileOutputStream(new File(basePath+excelPath + fileName)); HSSFWorkbook wb = getHSSFWorkbook(sheetName, title, content, null); wb.write(os); os.flush(); os.close(); }catch (Exception e){ e.printStackTrace(); }finally { os=null; } return excelPath+fileName; } /** * 导出Excel * @param sheetName sheet名称 * @param title 标题 * @param values 内容 * @param wb HSSFWorkbook对象 * @return */ private HSSFWorkbook getHSSFWorkbook(String sheetName,String []title,String [][]values, HSSFWorkbook wb){ // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 if(wb == null){ wb = new HSSFWorkbook(); } // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet HSSFSheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 HSSFRow row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 HSSFCellStyle style = wb.createCellStyle(); //style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式 //声明列对象 HSSFCell cell = null; //创建标题 for(int i=0;i<title.length;i++){ cell = row.createCell(i); cell.setCellValue(title[i]); cell.setCellStyle(style); } //创建内容 for(int i=0;i<values.length;i++){ row = sheet.createRow(i + 1); for(int j=0;j<values[i].length;j++){ //将内容按顺序赋给对应的列对象 row.createCell(j).setCellValue(values[i][j]); } } return wb; } }