pom文件中

<!-- 文件上传 --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.5.7</version></dependency><!-- JSON --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.41</version></dependency><!-- POI --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version></dependency>

导入注解@ExcelExport

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelExport {/** 字段名称 */String value();/** 导出排序先后: 数字越小越靠前(默认按Java类字段顺序导出) */int sort() default 0;/** 导出映射,格式如:0-未知;1-男;2-女 */String kv() default "";/** 导出模板示例值(有值的话,直接取该值,不做映射) */String example() default "";
}

导出注解@ExcelImport

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelImport {/** 字段名称 */String value();/** 导出映射,格式如:0-未知;1-男;2-女 */String kv() default "";/** 是否为必填字段(默认为非必填) */boolean required() default false;/** 最大长度(默认255) */int maxLength() default 255;/** 导入唯一性验证(多个字段则取联合验证) */boolean unique() default false;
}

ExcelClassField

public class ExcelClassField {/** 字段名称 */private String fieldName;/** 表头名称 */private String name;/** 映射关系 */private LinkedHashMap<String, String> kvMap;/** 示例值 */private Object example;/** 排序 */private int sort;/** 是否为注解字段:0-否,1-是 */private int hasAnnotation;public String getFieldName() {return fieldName;}public void setFieldName(String fieldName) {this.fieldName = fieldName;}public String getName() {return name;}public void setName(String name) {this.name = name;}public LinkedHashMap<String, String> getKvMap() {return kvMap;}public void setKvMap(LinkedHashMap<String, String> kvMap) {this.kvMap = kvMap;}public Object getExample() {return example;}public void setExample(Object example) {this.example = example;}public int getSort() {return sort;}public void setSort(int sort) {this.sort = sort;}public int getHasAnnotation() {return hasAnnotation;}public void setHasAnnotation(int hasAnnotation) {this.hasAnnotation = hasAnnotation;}@Overridepublic String toString() {return "ExcelClassField{" +"fieldName='" + fieldName + '\'' +", name='" + name + '\'' +", kvMap=" + kvMap +", example=" + example +", sort=" + sort +", hasAnnotation=" + hasAnnotation +'}';}
}
 public List excelTest(String url,String templateId) throws Exception {//        String url = "http://121.199.162.41:9000/ruoyi/2023/06/09/21ae93af7fe9448f95ac2de2a997242a.xlsx";TODO  根据码值找模板  templateIDString content = templateId;List<Approve> approves = ExcelUtils.readMultipartFile(url, content, Approve.class);return approves ;}

readMultipartFile代码

public static <T> List<T> readMultipartFile(String excelUrl, String content, Class<T> clazz) throws Exception {if (content == null) {throw new Exception("数据库异常请联系管理员");}URL url = new URL(excelUrl);InputStream inputStream = url.openStream();JSONArray array = readExcel(excelUrl,content,inputStream);return getBeanList(array, clazz);}private static JSONArray readExcel(String excelUrl,String content,InputStream inputStream) throws Exception {String fileType = subFileType(excelUrl);Workbook book = getWorkbook(inputStream, fileType);if (book == null) {return new JSONArray();}String[] split = content.split(",");
//        Map<Integer, String> firstRowMap = new HashMap<>();
//        for (int i = 0; i < split.length; i++) {//            firstRowMap.put(i,split[i]);
//        }Map<Integer, String> firstRowMap = IntStream.range(0, split.length).boxed().collect(Collectors.toMap(i -> i, i -> split[i]));JSONArray array = readSheet(book.getSheetAt(0),firstRowMap);book.close();return array;}private static Workbook getWorkbook(InputStream in,String fileType) throws IOException {Workbook book;if (fileType.equals(XLSX)) {book = new XSSFWorkbook(in);} else if (fileType.equals(XLS)) {POIFSFileSystem poifsFileSystem = new POIFSFileSystem(in);book = new HSSFWorkbook(poifsFileSystem);} else {return null;}in.close();return book;}public static String subFileType(String type){return type.substring(type.lastIndexOf("."));}private static JSONArray readSheet(Sheet sheet,Map<Integer, String> firstRowMap) throws Exception {// 获取每行JSON对象的值JSONArray array = new JSONArray();// 首行下标int rowStart = sheet.getFirstRowNum();// 尾行下标int rowEnd = sheet.getLastRowNum();// 获取表头行Row headRow = sheet.getRow(rowStart);if (headRow == null) {return array;}int cellStart = headRow.getFirstCellNum();int cellEnd = headRow.getLastCellNum();Map<Integer, String> keyMap = new HashMap<>(16);for (int j = cellStart; j < cellEnd; j++) {// 获取表头数据String val = getCellValue(headRow.getCell(j));if (val == null || val.trim().length() == 0 ||!firstRowMap.get(j).equals(val)) {throw new Exception("模板不匹配请检查");}else {keyMap.put(j, val);}}// 如果首行与尾行相同,表明只有一行,返回表头数据if (rowStart == rowEnd) {JSONObject obj = new JSONObject();// 添加行号obj.put(ROW_NUM, 1);for (int i : keyMap.keySet()) {obj.put(keyMap.get(i), "");}array.add(obj);return array;}for (int i = rowStart + 1; i <= rowEnd; i++) {Row eachRow = sheet.getRow(i);JSONObject obj = new JSONObject();// 添加行号obj.put(ROW_NUM, i + 1);StringBuilder sb = new StringBuilder();for (int k = cellStart; k < cellEnd; k++) {if (eachRow != null) {String val = getCellValue(eachRow.getCell(k));// 所有数据添加到里面,用于判断该行是否为空sb.append(val);obj.put(keyMap.get(k), val);}}if (sb.length() > 0) {array.add(obj);}}return array;}private static String getCellValue(Cell cell) {// 空白或空if (cell == null || cell.getCellTypeEnum() == CellType.BLANK) {return "";}// String类型if (cell.getCellTypeEnum() == CellType.STRING) {String val = cell.getStringCellValue();if (val == null || val.trim().length() == 0) {return "";}return val.trim();}// 数字类型if (cell.getCellTypeEnum() == CellType.NUMERIC) {String s = cell.getNumericCellValue() + "";// 去掉尾巴上的小数点0if (Pattern.matches(".*\\.0*", s)) {return s.split("\\.")[0];} else {return s;}}// 布尔值类型if (cell.getCellTypeEnum() == CellType.BOOLEAN) {return cell.getBooleanCellValue() + "";}// 错误类型return cell.getCellFormula();}//将json转成实体类private static <T> List<T> getBeanList(JSONArray array, Class<T> clazz) throws Exception {List<T> list = new ArrayList<>();Map<Integer, String> uniqueMap = new HashMap<>(16);for (int i = 0; i < array.size(); i++) {list.add(getBean(clazz, array.getJSONObject(i), uniqueMap));}return list;}/*** 获取每个对象的数据*/private static <T> T getBean(Class<T> c, JSONObject obj, Map<Integer, String> uniqueMap) throws Exception {T t = c.newInstance();Field[] fields = c.getDeclaredFields();List<String> errMsgList = new ArrayList<>();boolean hasRowTipsField = false;StringBuilder uniqueBuilder = new StringBuilder();int rowNum = 0;for (Field field : fields) {// 行号if (field.getName().equals(ROW_NUM)) {rowNum = obj.getInteger(ROW_NUM);field.setAccessible(true);field.set(t, rowNum);continue;}// 是否需要设置异常信息if (field.getName().equals(ROW_TIPS)) {hasRowTipsField = true;continue;}// 原始数据if (field.getName().equals(ROW_DATA)) {field.setAccessible(true);field.set(t, obj.toString());continue;}// 设置对应属性值setFieldValue(t, field, obj, uniqueBuilder, errMsgList);}// 数据唯一性校验if (uniqueBuilder.length() > 0) {if (uniqueMap.containsValue(uniqueBuilder.toString())) {Set<Integer> rowNumKeys = uniqueMap.keySet();for (Integer num : rowNumKeys) {if (uniqueMap.get(num).equals(uniqueBuilder.toString())) {errMsgList.add(String.format("数据唯一性校验失败,(%s)与第%s行重复)", uniqueBuilder, num));}}} else {uniqueMap.put(rowNum, uniqueBuilder.toString());}}// 失败处理if (errMsgList.isEmpty() && !hasRowTipsField) {return t;}StringBuilder sb = new StringBuilder();int size = errMsgList.size();for (int i = 0; i < size; i++) {if (i == size - 1) {sb.append(errMsgList.get(i));} else {sb.append(errMsgList.get(i)).append(";");}}// 设置错误信息for (Field field : fields) {if (field.getName().equals(ROW_TIPS)) {field.setAccessible(true);field.set(t, sb.toString());}}return t;}private static <T> void setFieldValue(T t, Field field, JSONObject obj, StringBuilder uniqueBuilder, List<String> errMsgList) {// 获取 ExcelImport 注解属性ExcelImport annotation = field.getAnnotation(ExcelImport.class);if (annotation == null) {return;}String cname = annotation.value();if (cname.trim().length() == 0) {return;}// 获取具体值String val = null;if (obj.containsKey(cname)) {val = getString(obj.getString(cname));}if (val == null) {return;}field.setAccessible(true);// 判断是否必填boolean require = annotation.required();if (require && val.isEmpty()) {errMsgList.add(String.format("[%s]不能为空", cname));return;}// 数据唯一性获取boolean unique = annotation.unique();if (unique) {if (uniqueBuilder.length() > 0) {uniqueBuilder.append("--").append(val);} else {uniqueBuilder.append(val);}}// 判断是否超过最大长度int maxLength = annotation.maxLength();if (maxLength > 0 && val.length() > maxLength) {errMsgList.add(String.format("[%s]长度不能超过%s个字符(当前%s个字符)", cname, maxLength, val.length()));}// 判断当前属性是否有映射关系LinkedHashMap<String, String> kvMap = getKvMap(annotation.kv());if (!kvMap.isEmpty()) {boolean isMatch = false;for (String key : kvMap.keySet()) {if (kvMap.get(key).equals(val)) {val = key;isMatch = true;break;}}if (!isMatch) {errMsgList.add(String.format("[%s]的值不正确(当前值为%s)", cname, val));return;}}// 其余情况根据类型赋值String fieldClassName = field.getType().getSimpleName();try {if ("String".equalsIgnoreCase(fieldClassName)) {field.set(t, val);} else if ("boolean".equalsIgnoreCase(fieldClassName)) {field.set(t, Boolean.valueOf(val));} else if ("int".equalsIgnoreCase(fieldClassName) || "Integer".equals(fieldClassName)) {try {field.set(t, Integer.valueOf(val));} catch (NumberFormatException e) {errMsgList.add(String.format("[%s]的值格式不正确(当前值为%s)", cname, val));}} else if ("double".equalsIgnoreCase(fieldClassName)) {field.set(t, Double.valueOf(val));} else if ("long".equalsIgnoreCase(fieldClassName)) {field.set(t, Long.valueOf(val));} else if ("BigDecimal".equalsIgnoreCase(fieldClassName)) {field.set(t, new BigDecimal(val));} else if ("Date".equalsIgnoreCase(fieldClassName)) {try {field.set(t, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(val));} catch (Exception e) {field.set(t, new SimpleDateFormat("yyyy-MM-dd").parse(val));}}} catch (Exception e) {e.printStackTrace();}}private static LinkedHashMap<String, String> getKvMap(String kv) {LinkedHashMap<String, String> kvMap = new LinkedHashMap<>();if (kv.isEmpty()) {return kvMap;}String[] kvs = kv.split(";");if (kvs.length == 0) {return kvMap;}for (String each : kvs) {String[] eachKv = getString(each).split("-");if (eachKv.length != 2) {continue;}String k = eachKv[0];String v = eachKv[1];if (k.isEmpty() || v.isEmpty()) {continue;}kvMap.put(k, v);}return kvMap;}private static String getString(String s) {if (s == null) {return "";}if (s.isEmpty()) {return s;}return s.trim();}

readFileManySheet

public static <T> List<T> readFileManySheet(MultipartFile file, Class<T> clazz,String content) throws Exception {Map<String, JSONArray> mapList = readExcelManySheet(file,content);
//        ArrayList<T> list = new ArrayList<>(10);
//        mapList.entrySet().stream().forEach(key -> {//            JSONArray value = key.getValue();
//            for (int i = 0; i < value.size(); i++) {//                HashMap<Integer, String> uniqueMap = new HashMap<>(16);
//                try {//                    list.add(getBean(clazz, value.getJSONObject(i), uniqueMap));
//                } catch (Exception e) {//                    e.printStackTrace();
//                }
//            }
//        });ArrayList<T> collect = mapList.values().stream().flatMap(jsonArray -> IntStream.range(0, jsonArray.size()).mapToObj(i -> {HashMap<Integer, String> uniqueMap = new HashMap<>(16);try {return getBean(clazz, jsonArray.getJSONObject(i), uniqueMap);} catch (Exception e) {e.printStackTrace();}return null;})).collect(Collectors.toCollection(ArrayList::new));ArrayList<T> collect1 = mapList.entrySet().stream().flatMap(key -> IntStream.range(0, key.getValue().size()).mapToObj(i -> {HashMap<Integer, String> uniqueMap = new HashMap<>(16);try {return getBean(clazz, key.getValue().getJSONObject(i), uniqueMap);} catch (Exception e) {e.printStackTrace();}return null;})).collect(Collectors.toCollection(ArrayList::new));return collect1 ;}private static Map<String, JSONArray> readExcelManySheet(MultipartFile mFile, String content) throws Exception {if (content == null) {throw new Exception("数据库异常请联系管理员");}String originalFilename = mFile.getOriginalFilename();Workbook book = getWorkbook(mFile.getInputStream(), originalFilename.substring(originalFilename.lastIndexOf(".")));if (book == null) {return Collections.emptyMap();}Map<Integer, String> firstRowMap = getFirstRowMap(content);Map<String, JSONArray> map = new LinkedHashMap<>();for (int i = 0; i < book.getNumberOfSheets(); i++) {Sheet sheet = book.getSheetAt(i);JSONArray arr = readSheet(sheet,firstRowMap);map.put(sheet.getSheetName(), arr);}book.close();return map;}private static Map<Integer, String> getFirstRowMap(String content) {String[] split = content.split(",");Map<Integer, String> firstRowMap = IntStream.range(0, split.length).boxed().collect(Collectors.toMap(i -> i, i -> split[i]));for (int i = 0; i < split.length; i++) {firstRowMap.put(i,split[i]);}return firstRowMap;}

excel批量导入代码相关推荐

  1. php批量添加excel数据库表,php 把excel批量导入到数据库代码

    php 把excel批量导入到数据库代码 我们是利用了ExcelFileParser这个扩展来处理的哦, Excel数据获取演示 Excel数据获取演示 /** * CopyRight (c) 200 ...

  2. excel宏转txt替换强制换行符_三个步骤学会用EXCEL批量导入anki题库

    Anki真的是个好用到不想推荐给朋友的软件,本人最近准备刷个新题库,找了一上午找不到原来教我EXCEL导入anki的网页,为了防止我自己过段时间又忘了应该怎么导入,我写了这个教程,写都写了,就顺手发出 ...

  3. 订餐系统之Excel批量导入

    批量导入现在基本已经成为各类系统的标配了,当前,我们订餐系统也不例外,什么商家呀.商品呀.优惠码之类的,都少不了.毕竟嘛,对非开发人员来说,看到Excel肯定比看到很多管理系统还是要亲切很多的.这里, ...

  4. 【转帖】Java实现Excel批量导入数据

    这篇文章主要为大家详细介绍了Java实现Excel批量导入数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Excel的批量导入是很常见的功能,这里采用Jxl实现,数 ...

  5. SpringMVC框架通过Excel批量导入数据

    文章目录 SpringMVC框架通过Excel批量导入数据 1.导入需要的jar包 2.配置文件 3.创建Java对象类 4.解析Excel表格数据的工具类 5.前端请求 6.Controller处理 ...

  6. Spring Boot 实现excel 批量导入数据(模板下载 ->数据导入->导入失败表格下载)

    批量导入数据以用户为例[不贴数据库操作代码,都是简单的插入和查询操作自己写] 1 导入依赖 2 批量导入模板下载 3 批量导入数据 准备工作 实现代码 测试接口 4 下载导入失败表格 5 实体类 6 ...

  7. Springboot Excel批量导入数据

    POI处理Excel <!-- poi处理excel --><dependency><groupId>org.apache.poi</groupId>& ...

  8. excel批量导入图片的方法和例子

    内容提要:文章分享了三个excel批量导入图片的典型案例:查找对应姓名的照片.批量导入图片等等,并提供附件下载.对Excel感兴趣的朋友可加 Excel学习交流群:284029260(www.itbl ...

  9. Java实现Excel批量导入数据库

    springboot实现Excel批量导入数据库 前言:项目开发中最容易碰到的需求即将Excel数据批量上传到数据库中存储 -> Java实现,Excel数据表,MySQL数据库,具体步骤如下- ...

最新文章

  1. 防灾科技学院期末软件测试,防灾科技学院2014 软件测试客观题
  2. 使用Properties集合存储数据,遍历取出Properties集合中的数据
  3. mvc:default-servlet-handler/作用
  4. 【萌味】小夕说,不了解动态空间增长的程序喵都是假喵(上)
  5. 2017.9.25 随机数生成器 失败总结
  6. DLL型后门原理及完全清除秘诀
  7. C# async await
  8. 3D机器学习(4):pytorch入门3:张量的拼接与拆分、张量的运算、张量的统计
  9. 我为什么读博, 以及我为什么不读博?这是个问题!
  10. 如何用计算机算出男朋友的身高,【趣味物理】如何用物理方法测出男生的真实身高?...
  11. html标签em和i的区别,HTML中strong与b,em与i标签的区别和使用建议
  12. DNS协议——域名解析
  13. 《死亡搁浅》如何成了“薛定谔的猫”? 一个小岛秀夫式的乌托邦
  14. 千只瓶子找毒药的问题
  15. 4G军备竞赛:中兴华为领跑国内 三星独霸一方
  16. M3DGIS全息裸眼三维电子沙盘数字沙盘大数据系统开发教程视频第6课
  17. Android 支付宝、微信、银联
  18. 【报告分享】2021年中国新锐品牌增长潜力报告-秒针(附下载)
  19. 如何下载、安装并注册VMware Workstation Pro虚拟机软件
  20. F. Function!

热门文章

  1. HTML+CSS+JS`管理系统网站设计——学生信息管理系统模板 (13页) HTML+CSS+JavaScript html网页设计期末大作业_网页设计平时作业
  2. UE4反射原理(转)
  3. [openwrt]:斐讯K3C OPCC+中大H3C校园网认证配置指南(二) 交叉编译
  4. 无人机操控安全令人担忧 可被黑客轻松劫持
  5. Unity无人机仿真github项目
  6. python基础库-python基础库-Pandas
  7. Typora 数学符号
  8. 开源APP CoCoin
  9. 数学在生活中无处不在,36个生活小故事涵盖小学所有的数学知识!
  10. 产品MVP:别让你的公司登上明年的企业死亡名单