定义导入的excel模板

定义需要导入的EXCEL模板,EXCEL格式变更,只需要变更对应的枚举信息就可以,如果定义多个EXCEL模板,
只要定义多个枚举就行

package org.util.excel;import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** @author zhangfuzeng* @date 2021/9/12*/
public class ImportExcelTitle {@Getter@AllArgsConstructorpublic enum TaskImportExcel {/*** 表头信息*/PUBLIC_DATA_ID("ID", "publicDataId", 0, true),PUBLIC_DATA_NAME("名称", "publicDataName", 40, true),TASK_USER_NAME("任务担当人", "taskUserName", 0, false),END_TIME("任务到期日", "endTime", 0, false),;/*** 中文标题,对应EXCEL的标题,不一致会报错*/private final String titleCn;/*** 查出的值对应Map的key*/private final String valueKey;/*** 对应的字段长度* 为0时代表不限制*/private final Integer titleLength;/*** 是否必填*/private final Boolean isRequired;/*** 获取excel对应的数据*/public static Map<String, String> getKeyValue() {return Arrays.stream(TaskImportExcel.values()).collect(Collectors.toMap(TaskImportExcel::getTitleCn, TaskImportExcel::getValueKey));}/*** 根据值获取对应的信息*/public static Map<String, TaskImportExcel> getExcelTitle() {return Arrays.stream(TaskImportExcel.values()).collect(Collectors.toMap(TaskImportExcel::getValueKey, title -> title));}public static List<String> checkData(TaskImportExcel taskImportExcel, String value) {return checkDataCommon(value, taskImportExcel.getIsRequired(), taskImportExcel.getTitleCn(), taskImportExcel.getTitleLength());}}/*** 校验导入信息长度和必填选项*/private static List<String> checkDataCommon(String value, Boolean isRequired, String titleCn, Integer titleLength) {List<String> result = new ArrayList<>();if (Boolean.TRUE.equals(isRequired) && StringUtils.isBlank(value)) {result.add(String.format("%s信息未填", titleCn));}if (titleLength != 0 && value != null && value.length() > titleLength) {result.add(String.format("%s过长", titleCn));}return result;}
}

导入的excel处理

对导入的excel进行处理,按照上述ImportExcelTitle.java中的配置,将导入的excel转化成List<Map<String, String>>格式,
Map<String, String>中key是ImportExcelTitle.java中定义的valueKey,value对应的是excel导入的值。

package org.util.excel;import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author zhangfuzeng* @date 2021/9/16*/
@Slf4j
public class ImportExcelUtil {private ImportExcelUtil() {}/*** 2003- 版本的excel*/private static final String EXCEL_2003L = ".xls";/*** 2007+ 版本的excel*/private static final String EXCEL_2007U = ".xlsx";private static final String GENERAL = "General";private static final String M_D_YY = "m/d/yy";/*** 将流中的Excel数据转成List<Map>** @param in       输入流* @param fileName 文件名(判断Excel版本)* @return EXCEL转化后的数据*/public static List<Map<String, String>> parseExcel(InputStream in, String fileName, Map<String, String> titleKey) throws IOException {// 根据文件名来创建Excel工作薄Workbook work = getWorkbook(in, fileName);Sheet sheet;Row row;Cell cell;// 返回数据List<Map<String, String>> ls = new ArrayList<>();// 遍历Excel中所有的sheetsheet = work.getSheetAt(0);if (sheet == null) {return ls;}// 取第一行标题Row topRow = sheet.getRow(0);if (null == topRow) {return ls;}row = sheet.getRow(0);String[] title;if (row == null) {return ls;}title = new String[row.getLastCellNum()];for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {cell = row.getCell(y);title[y] = (String) getCellValue(cell);}// 遍历当前sheet中的所有行// 坑:sheet.getLastRowNum()  最后一行行标,比行数小1for (int j = 1; j <= sheet.getLastRowNum(); j++) {row = sheet.getRow(j);Map<String, String> m = new HashMap<>(row.getLastCellNum());// 遍历所有的列for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {cell = row.getCell(y);String key = title[y].replace(" ", "");if (titleKey.get(key) == null) {log.error("导入excel出现错误的标题:" + key);throw new RuntimeException("excel出现错误的标题:" + key);}m.put(titleKey.get(key), getCellValue(cell).toString().trim());}ls.add(m);}work.close();return ls;}/*** 描述:根据文件后缀,自适应上传文件的版本** @param inStr ,fileName* @return 返回的数据*/public static Workbook getWorkbook(InputStream inStr, String fileName) throws IOException {Workbook wb;String fileType = fileName.substring(fileName.lastIndexOf("."));if (EXCEL_2003L.equals(fileType)) {// 2003-wb = new HSSFWorkbook(inStr);} else if (EXCEL_2007U.equals(fileType)) {// 2007+wb = new XSSFWorkbook(inStr);} else {throw new RuntimeException("解析的文件格式有误!");}return wb;}public static Object getCellValue(Cell cell) {Object value = new Object();// 日期格式化SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");if (cell == null) {return "";}switch (cell.getCellType()) {case STRING:case FORMULA:value = cell.getRichStringCellValue().getString();break;case NUMERIC:if (GENERAL.equals(cell.getCellStyle().getDataFormatString())) {double cellValue = cell.getNumericCellValue();value = replace(String.valueOf(cellValue));} else if (M_D_YY.equals(cell.getCellStyle().getDataFormatString())) {value = sdf.format(cell.getDateCellValue());} else {DataFormatter formatter = new DataFormatter();// 直接获取到单元格的值value = formatter.formatCellValue(cell);}break;case BOOLEAN:value = cell.getBooleanCellValue();break;case BLANK:value = "";break;default:break;}return value;}public static String replace(String s) {char a = '.';if (s.indexOf(a) >= 0) {//去掉多余的0  s = s.replaceAll("0+$", "");//如最后一位是.则去掉  s = s.replaceAll("[.]$", "");}return s;}
}

调用导入任务信息

测试调用, 拿到List<Map<String, String>> excelList就是解析excel的结果,后续根据自己的业务做相应的处理。

    @ApiOperation(value = "导入任务信息")@PostMapping("/importTask")public void importTask(@RequestParam(value = "file") MultipartFile fileToUpload) {List<Map<String, String>> excelList;try {excelList = ImportExcelUtil.parseExcel(fileToUpload.getInputStream(),fileToUpload.getOriginalFilename(),ImportExcelTitle.TaskImportExcel.getKeyValue());} catch (IOException e) {log.error("解析excel时失败" + e.getMessage());}}

如果你觉着本文配置太过复杂,想直接可以使用,或者导入的数据量过大,想优化性能,可以看我的另一篇博客,使用阿里的easyExcel工具包,上手绝对快的一批
JAVA使用EasyExcel导入excel

【工具篇】java导入excel工具类,简单通用,绝对值得你收藏相关推荐

  1. Java导入Excel工具类使用教程

    前言: 本工具类提供了Excel导入功能,通过反射机制将Excel中数据映射到实体类中,从而获取Excel数据,工具类依赖org.apache.poi包.支持RESTful API,支持Spring ...

  2. java 导入excel工具类_java Excel工具类,导入导出Excel数据

    java Excel工具类,导入导出Excel数据,导入数据对合并表格有判断获取数据: 导出数据到Excel,Excel文件不存在会创建. 使用的是poi处理,兼容Excel. 对反射不够理解,目前先 ...

  3. java 操作excel的类_探究下Java操作Excel的几类工具

    引言 java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI ...

  4. JAVA导出Excel通用工具类——第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选、动态合并横向(纵向)单元格等多种复杂情况——保姆级别,真的不能再详细了,代码拿来即用)

    JAVA导出Excel通用工具--第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选.动态合并横向(纵向)单元格等多种复杂情况--保姆级别,真的不能再详细了,封装通用工具类,代码拿 ...

  5. Java读写Excel原来这么简单

    前言 相信现在很多搞后端的同学大部分做的都是后台管理系统,那么管理系统就肯定免不了 Excel 的导出导入功能,今天我们就来介绍一下 Java 如何实现 Excel 的导入导出功能. Java领域解析 ...

  6. Java导入excel

    Java导入excel @ApiOperation(value = "导入冲压需求量计划") @PostMapping(value = "import2.do" ...

  7. java build path entries 为空_TOOLFK工具-在线JAVA代码执行工具

    本文要推荐的[TOOLFK]在线JAVA代码执行工具 ,提供JAVA代码在线执行功能. 網站名稱:ToolFk 網站鏈結:https://www.toolfk.com/ 工具链接:https://ww ...

  8. java 导入excel 日期格式转换

    java 导入excel 日期格式转换 导入日期格式后 获取到的value值为 数值或小数值 直接上硬货 cell = row.getCell(4);String go_time = getCellV ...

  9. 【工具】java 时间比较工具

    [工具]java 时间比较工具 需要依赖hutool /*** 比较时间* @param startDate 开始* @param endDate 结束* @param nowDate 当前* @re ...

最新文章

  1. php 正确的输出json格式
  2. 已解决:Job for docker.service failed because the control process exited with error code. See “systemctl
  3. mongoDB安装使用
  4. php lamp环境搭建,lamp环境搭建 --lnmp环境搭建_无需整理
  5. 1、CSS样式及其基本语法
  6. 持续提高 Android 应用的安全性与性能
  7. (六)Web Storage的使用实例——简单web留言本
  8. jQuery源码解读
  9. 使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突
  10. python sort怎么用,Linux Sort命令详细用法(有实例)
  11. 最新!Vicor 270V-28V DCM5614以96%效率提供1300W功率
  12. mac10.11重装php,macosx-10.11-更新osx10.11后,删除自带php版本,重新编译php5.5.29,到make阶段提示错误。...
  13. 63相似、合同、相抵
  14. SO_LINGER选项
  15. android 常用依赖库
  16. 基于DS3231实时时钟模块的stm32简易闹钟
  17. 安装JLINK驱动出现the firmware of the connected J-Link does not support the following memory access
  18. 微信小程序云开发入门到放弃(一)入门篇
  19. html圈小猫小游戏
  20. python实现对文件夹的图片分类存放(自动新建文件夹存放图片)

热门文章

  1. ML01 -- KNN算法
  2. 黑苹果Macos 恢复系统后按下允许扩展性内核构建之后无限重启无法开机解决办法之一
  3. 第六十八章 Caché 函数大全 $WASCII 函数
  4. 【树状数组】清点人数
  5. 【UPCOJ】10155问题 S: 近似排序
  6. 数据库身份证号用什么类型_为什么喝不同的茶要用不同类型的茶具?
  7. 使用ardunio制作神秘礼物(环境光传感器、舵机、LED、蜂鸣器)
  8. PDF Reader Pro for mac(全能pdf阅读器)
  9. 计算机网络基础之传输介质
  10. [电脑问题1]Microsoft Visual Basic运行时错误‘-2147221164’:没有注册类