package com.yq.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.json.JSONArray; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; import cn.hutool.poi.excel.sax.Excel07SaxReader; import cn.hutool.poi.excel.sax.handler.RowHandler; import com.yq.exception.BizException; import com.yq.exception.ErrorMessagesEnum; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author: wensm * @date: 2021/5/7 0007 * @description: TODO **/ @Slf4j public class ExcelUtils { private static List<List<Object>> lineList = new ArrayList<>(); /** * excel 导出工具类 * * @param response * @param fileName 文件名 * @param projects 对象集合 * @param columnNames 导出的excel中的列名 * @param keys 对应的是对象中的字段名字 * @throws IOException */ // public static void export(HttpServletResponse response, String fileName, ArrayList<Map<String, Object>> projects, String[] columnNames, String[] keys) throws IOException { public static void export(HttpServletResponse response, String fileName, List<?> projects, String[] keys, String[] columnNames) throws IOException { // Map<String, Object> row1 = new LinkedHashMap<>(); // row1.put("姓名", "张三"); // row1.put("年龄", 23); // row1.put("成绩", 88.32); // row1.put("是否合格", true); // row1.put("考试日期", DateUtil.date()); // // Map<String, Object> row2 = new LinkedHashMap<>(); // row2.put("姓名", "李四"); // row2.put("年龄", 33); // row2.put("成绩", 59.50); // row2.put("是否合格", false); // row2.put("考试日期", DateUtil.date()); // // ArrayList<Map<String, Object>> rows = CollUtil.newArrayList(row1, row2); ExcelWriter bigWriter = ExcelUtil.getBigWriter(); // ExcelWriter bigWriter = ExcelUtil.getWriter(true); for (int i = 0; i < keys.length; i++) { bigWriter.addHeaderAlias(keys[i], columnNames[i]); bigWriter.setColumnWidth(i, 20); } // 一次性写出内容,使用默认样式,强制输出标题 // bigWriter.write(rows, true); bigWriter.write(projects, true); //response为HttpServletResponse对象 response.setContentType("application/vnd.ms-excel;charset=utf-8"); // response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 // String name = StringUtils.toUtf8String("申请学院"); response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".xlsx").getBytes(), "iso-8859-1")); ServletOutputStream out = response.getOutputStream(); bigWriter.flush(out, true); // 关闭writer,释放内存 bigWriter.close(); //此处记得关闭输出Servlet流 IoUtil.close(out); } /** * excel导入工具类 * * @param file 文件 * @return 返回数据集合 * @throws BizException * @throws IOException */ public static List<Map<String, Object>> leading(MultipartFile file) throws BizException, IOException { String fileName = file.getOriginalFilename(); // 上传文件为空 if (StringUtils.isEmpty(fileName)) { throw new BizException(ErrorMessagesEnum.OPERATION_NON_EXCEL_ERROR); } //上传文件大小为1000条数据 if (file.getSize() > 1024 * 1024 * 10) { log.error("upload | 上传失败: 文件大小超过10M,文件大小为:{}", file.getSize()); throw new BizException(ErrorMessagesEnum.OPERATION_LARGE_EXCEL_ERROR); } // 上传文件名格式不正确 if (fileName.lastIndexOf(".") != -1 && !".xlsx".equals(fileName.substring(fileName.lastIndexOf(".")))) { throw new BizException(ErrorMessagesEnum.OPERATION_EXCEL_FORMAT_ERROR); } // log.info("========columNames========{}",columnNames); // //读取数据 // ExcelUtil.read07BySax(file.getInputStream(), 0, createRowHandler()); // //// Excel07SaxReader reader = new Excel07SaxReader(createRowHandler()); //// reader.read(file.getInputStream(),1); // // // log.info("========lineList========{}",lineList.toString()); // //去除excel中的第一行数据 // lineList.remove(0); // // //将数据封装到list<Map>中 // List<Map<String, Object>> dataList = new ArrayList<>(); // for (int i = 0; i < lineList.size(); i++) { // if (null != lineList.get(i)) { // Map<String, Object> hashMap = new HashMap<>(); // for (int j = 0; j < columNames.length; j++) { // Object property = lineList.get(i).get(j); // hashMap.put(columNames[j], property); // } // dataList.add(hashMap); // } else { // break; // } // } // ExcelReader reader = ExcelUtil.getReader(file.getInputStream()); //// reader.addHeaderAlias("学号", "sno"); //// reader.addHeaderAlias("姓名", "name"); //// reader.addHeaderAlias("年龄", "age"); //// reader.addHeaderAlias("性别", "gender"); //// reader.addHeaderAlias("籍贯", "nativePlace"); //// reader.addHeaderAlias("入学时间", "enrollmentTime"); // // for (int i = 0; i < columNames.length; i++) { // reader.addHeaderAlias(columNames[i], keys[i]); // } // List dataList = new ArrayList(); // if(reader.getRowCount()>0) dataList = reader.read(1); // dataList = reader.readAll(); ExcelReader reader = ExcelUtil.getReader(file.getInputStream(),0); List<Map<String,Object>> dataList = reader.readAll(); return dataList; } /** * excel导入工具类 * * @param file 文件 * @return 返回数据集合 * @throws BizException * @throws IOException */ public static List<Map<String, Object>> leading(MultipartFile file,Integer headerRowIndex, Integer startRowIndex) throws BizException, IOException { String fileName = file.getOriginalFilename(); // 上传文件为空 if (StringUtils.isEmpty(fileName)) { throw new BizException(ErrorMessagesEnum.OPERATION_NON_EXCEL_ERROR); } //上传文件大小为1000条数据 if (file.getSize() > 1024 * 1024 * 10) { log.error("upload | 上传失败: 文件大小超过10M,文件大小为:{}", file.getSize()); throw new BizException(ErrorMessagesEnum.OPERATION_LARGE_EXCEL_ERROR); } // 上传文件名格式不正确 if (fileName.lastIndexOf(".") != -1 && !".xlsx".equals(fileName.substring(fileName.lastIndexOf(".")))) { throw new BizException(ErrorMessagesEnum.OPERATION_EXCEL_FORMAT_ERROR); } // log.info("========columNames========{}",columnNames); // //读取数据 // ExcelUtil.read07BySax(file.getInputStream(), 0, createRowHandler()); // //// Excel07SaxReader reader = new Excel07SaxReader(createRowHandler()); //// reader.read(file.getInputStream(),1); // // // log.info("========lineList========{}",lineList.toString()); // //去除excel中的第一行数据 // lineList.remove(0); // // //将数据封装到list<Map>中 // List<Map<String, Object>> dataList = new ArrayList<>(); // for (int i = 0; i < lineList.size(); i++) { // if (null != lineList.get(i)) { // Map<String, Object> hashMap = new HashMap<>(); // for (int j = 0; j < columNames.length; j++) { // Object property = lineList.get(i).get(j); // hashMap.put(columNames[j], property); // } // dataList.add(hashMap); // } else { // break; // } // } // ExcelReader reader = ExcelUtil.getReader(file.getInputStream()); //// reader.addHeaderAlias("学号", "sno"); //// reader.addHeaderAlias("姓名", "name"); //// reader.addHeaderAlias("年龄", "age"); //// reader.addHeaderAlias("性别", "gender"); //// reader.addHeaderAlias("籍贯", "nativePlace"); //// reader.addHeaderAlias("入学时间", "enrollmentTime"); // // for (int i = 0; i < columNames.length; i++) { // reader.addHeaderAlias(columNames[i], keys[i]); // } // List dataList = new ArrayList(); // if(reader.getRowCount()>0) dataList = reader.read(1); // dataList = reader.readAll(); ExcelReader reader = ExcelUtil.getReader(file.getInputStream(),0); // List<Map<String,Object>> dataList = reader.readAll(); List<Map<String,Object>> dataList = reader.read(headerRowIndex,startRowIndex,reader.getRowCount()); return dataList; } /** * excel导入工具类 * * @param file 文件 * @return 返回数据集合 * @throws BizException * @throws IOException */ public static List<Map<String, Object>> leadingSheets(MultipartFile file,Integer headerRowIndex, Integer startRowIndex) throws BizException, IOException { String fileName = file.getOriginalFilename(); // 上传文件为空 if (StringUtils.isEmpty(fileName)) { throw new BizException(ErrorMessagesEnum.OPERATION_NON_EXCEL_ERROR); } //上传文件大小为1000条数据 if (file.getSize() > 1024 * 1024 * 10) { log.error("upload | 上传失败: 文件大小超过10M,文件大小为:{}", file.getSize()); throw new BizException(ErrorMessagesEnum.OPERATION_LARGE_EXCEL_ERROR); } // 上传文件名格式不正确 if (fileName.lastIndexOf(".") != -1 && !".xlsx".equals(fileName.substring(fileName.lastIndexOf(".")))) { throw new BizException(ErrorMessagesEnum.OPERATION_EXCEL_FORMAT_ERROR); } // log.info("========columNames========{}",columnNames); // //读取数据 // ExcelUtil.read07BySax(file.getInputStream(), 0, createRowHandler()); // //// Excel07SaxReader reader = new Excel07SaxReader(createRowHandler()); //// reader.read(file.getInputStream(),1); // // // log.info("========lineList========{}",lineList.toString()); // //去除excel中的第一行数据 // lineList.remove(0); // // //将数据封装到list<Map>中 // List<Map<String, Object>> dataList = new ArrayList<>(); // for (int i = 0; i < lineList.size(); i++) { // if (null != lineList.get(i)) { // Map<String, Object> hashMap = new HashMap<>(); // for (int j = 0; j < columNames.length; j++) { // Object property = lineList.get(i).get(j); // hashMap.put(columNames[j], property); // } // dataList.add(hashMap); // } else { // break; // } // } // ExcelReader reader = ExcelUtil.getReader(file.getInputStream()); //// reader.addHeaderAlias("学号", "sno"); //// reader.addHeaderAlias("姓名", "name"); //// reader.addHeaderAlias("年龄", "age"); //// reader.addHeaderAlias("性别", "gender"); //// reader.addHeaderAlias("籍贯", "nativePlace"); //// reader.addHeaderAlias("入学时间", "enrollmentTime"); // // for (int i = 0; i < columNames.length; i++) { // reader.addHeaderAlias(columNames[i], keys[i]); // } // List dataList = new ArrayList(); // if(reader.getRowCount()>0) dataList = reader.read(1); // dataList = reader.readAll(); ExcelReader reader1 = ExcelUtil.getReader(file.getInputStream()); // ExcelReader reader = ExcelUtil.getReader(file.getInputStream(),0); int sheetCount = reader1.getSheetCount(); log.info("================sheetCount========={}",sheetCount); List<Map<String,Object>> dataList = new ArrayList<>(); for(int i=0;i<sheetCount;i++){ ExcelReader reader = ExcelUtil.getReader(file.getInputStream(),i); dataList.addAll(reader.read(headerRowIndex,startRowIndex,reader.getRowCount())); } // List<Map<String,Object>> dataList = reader.readAll(); // dataList = reader.read(headerRowIndex,startRowIndex,reader.getRowCount()); return dataList; } /** * 通过实现handle方法编写我们要对每行数据的操作方式 */ private static RowHandler createRowHandler() { //清空一下集合中的数据 lineList.removeAll(lineList); // log.info("====remove====lineList========{}",lineList.toString()); return new RowHandler() { @Override public void handle(int i, long l, List<Object> list) { // log.info("====add====list========{}",list.toString()); //将读取到的每一行数据放入到list集合中 JSONArray jsonObject = new JSONArray(list); lineList.add(jsonObject.toList(Object.class)); // log.info("====add====lineList========{}",lineList.toString()); } // @Override // public void handle(int sheetIndex, int rowIndex, List rowlist) { // //将读取到的每一行数据放入到list集合中 // JSONArray jsonObject = new JSONArray(rowlist); // lineList.add(jsonObject.toList(Object.class)); // } }; } }