工具链接https://github.com/Teach-fish-swim/excel-import-export
开发过excel的导入导出功能的小伙伴们都知道,我们每次导出到excel时,总会要写相应的实体类,而一旦excel的数据字段发生变化后,我们的实体类也要跟着去改变,最主要的是要去更改相关的工具类,这就很痛苦,并且一个地方改错了还会影响其他的地方运行,我这里推荐一个自己封装的excel导入导出的工具类
1.导出
1.1 导出截图
导出只需要调用 ExcelDto2Excel.excelDto2Excel()方法即可
1.2 详情分析:
/** * @param dataEntryList the entry of data about export not null * @param filePath export path had default value * @param fileName excel name not null * @param sheetName sheet name had default value * @param <T> * * @throws Exception */ public static <T> void excelDto2Excel(List<T> dataEntryList, String filePath, String fileName,String sheetName) throws Exception { // 获取总列数 int CountColumnNum = getAllCount(dataEntryList); // 创建Excel文档 HSSFWorkbook hwb = new HSSFWorkbook(); // sheet 对应一个工作页 if(sheetName==null||"".equals(sheetName)) sheetName=SHEET_NAME; HSSFSheet sheet = hwb.createSheet(sheetName); HSSFRow firstrow = sheet.createRow(0); // 下标为0的行开始 HSSFCell[] firstcell = new HSSFCell[CountColumnNum]; String[] names = createColumn(CountColumnNum, dataEntryList.get(0).getClass()); for (int j = 0; j < CountColumnNum; j++) { firstcell[j] = firstrow.createCell(j); firstcell[j].setCellValue(new HSSFRichTextString(names[j])); } for (int i = 0; i < dataEntryList.size(); i++) { // 创建一行 HSSFRow row = sheet.createRow(i + 1); Object o = dataEntryList.get(i); parseData(o, CountColumnNum, row, names); } // 创建文件输出流,准备输出电子表格 boolean exists = new File(filePath).exists(); if(!exists){ boolean mkdir = new File(DEFAULT_PATH).mkdirs(); if(!mkdir) throw new IOException("excel存储路径创建失败,请检查是否已经存在 '"+DEFAULT_PATH+"' 文件夹"); filePath=DEFAULT_PATH; } OutputStream out = new FileOutputStream(filePath + fileName + ".xls"); hwb.write(out); out.close(); log.info("数据导出成功"); if(!exists) log.info("您的excel存放的位置:"+DEFAULT_PATH); }
2 导入
2.1 导入截图
导出只需要调用 ExcelDto2Excel.importExcel()方法即可
2.2 详情代码
/** * * @param filePath 文件所在位置 * @param dataEntry 实体类(需要有一个无参构造,且要满足驼峰命名) * @param isReceiveEmpty 是否接受文件里面的空值 * @param <T> * @return * @throws Exception 若isReceiveEmpty为 false,又出现空值,则会报数据无法接收, * 数据类型不对,会报类型对应不上,字段数量不一致会报错 */ public static <T> List<T> importExcel(String filePath, T dataEntry,boolean isReceiveEmpty) throws Exception { //校验路径与实体类是否存在 check(filePath, dataEntry); //获取实体类字段 Map<String, String> columns = getColumns(dataEntry); //获取excel中的字段即数据 FileInputStream fileIn = new FileInputStream(filePath); //判断是xls还是xlsx Sheet sht0=null; if("xls".equals(filePath.split("\\.")[1])){ HSSFWorkbook wb0 = new HSSFWorkbook(fileIn);//针对xls sht0 = wb0.getSheetAt(0); }else{ XSSFWorkbook wb0=new XSSFWorkbook(fileIn); sht0 = wb0.getSheetAt(0); } String[] orderColumn = isColumnSame(columns, sht0.getRow(0)); List<T> entryList = new ArrayList<T>(); importData2Entry(entryList, sht0, orderColumn, dataEntry,isReceiveEmpty); fileIn.close(); log.info("excel导入完成"); return entryList; }
注意事项:
使用时确保实体类有无参构造函数