1、poi的maven引入

        <!-- poi导入导出 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency>

本例使用一个简单的employee表进行excel的解析持久化。

2、controller类

package com.example.demo.execl.exe.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import com.example.demo.execl.exe.entity.Employee;
import com.example.demo.execl.exe.service.IEmployeeService;import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;/*** <p>* 前端控制器* </p>** @author zl* @since 2021-11-22*/
@RestController
@Api(tags = "用户管理相关接口")
@RequestMapping("/exe/employee")
public class EmployeeController {@Autowiredprivate IEmployeeService employeeService;@ApiOperation("查询所有的员工")@GetMapping("/")public List<Employee> getAllEntities() {List<Employee> list = employeeService.list();return list;}@PostMapping("/")@ApiOperation("解析excel")public String parseAndSaveExcel(final MultipartFile file) {return employeeService.uploadExcel(file);}}

3、service类

package com.example.demo.execl.exe.service.impl;import java.io.IOException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.execl.cons.ExcelConst;
import com.example.demo.execl.exe.entity.Employee;
import com.example.demo.execl.exe.mapper.EmployeeMapper;
import com.example.demo.execl.exe.service.IEmployeeService;
import com.example.demo.execl.util.ExcelUtils;/*** <p>* 服务实现类* </p>** @author zl* @param <E>* @since 2021-11-22*/
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements IEmployeeService {@Overridepublic String uploadExcel(MultipartFile file) {if (null == file || file.getSize() == 0) {log.error("传入文件不能为空");return "FALSE";}final String fileName = file.getOriginalFilename();log.debug("文件名为:" + fileName);// 获取待读取Excel工作薄Workbook workbook = null;try {workbook = ExcelUtils.getWrokbook(file.getInputStream(), fileName);} catch (IOException e) {log.error("获取待读取Excel工作薄失败!!");}Map<String, List<Map<String, String>>> excelData = ExcelUtils.parseExcel(workbook,ExcelConst.EMPLOYEE_EXCEL_HEADER);// 将解析出的数据进行持久化executeBatchSave(excelData);return "SUCCESS";}/*** 持久化导入的excel数据.* * @param excelData*/private void executeBatchSave(final Map<String, List<Map<String, String>>> excelData) {List<Employee> employees = new ArrayList<>();excelData.entrySet().parallelStream().forEach(entry -> {Employee employee = new Employee();List<Map<String, String>> rowLists = entry.getValue();for (Map<String, String> map : rowLists) {employee = this.excelData2Employee(map, employee);employees.add(employee);}});// 批量保存saveBatch(employees);}/*** 提取出的excel数据解析为实体类.* * @param map* @param employee*/private Employee excelData2Employee(Map<String, String> map, Employee employee) {employee.setEmployeeId(Integer.valueOf(map.get("0")));employee.setEmployeeName(map.get("1"));employee.setEmployeeJob(map.get("2"));employee.setSuperiorId(Integer.valueOf(map.get("3")));String entiryTimeString = map.get("4");LocalDateTime entryTime = LocalDateTime.parse(entiryTimeString);employee.setEntryTime(entryTime);employee.setSalary(Integer.valueOf(map.get("5")));employee.setBonus(Integer.valueOf(map.get("6")));return employee;}}

4、excel处理的工具类

package com.example.demo.execl.util;import java.io.InputStream;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;/*** Excel工具类.* * @author zhaoliu**/
public class ExcelUtils {/*** 日志.*/private static final Logger log = LoggerFactory.getLogger(ExcelUtils.class);/*** 私有构造方法.*/private ExcelUtils() {}/*** 读取指定文件流中的Excel工作薄.* * @param in       待读取的文件流.* @param fileName 待读取文件名称.* @return Excel工作薄.*/public static Workbook getWrokbook(final InputStream in, final String fileName) {Workbook workbook = null;if (null == in) {log.error("文件为空!");}if (StringUtils.isBlank(fileName)) {log.error("文件名为空!");}try {workbook = WorkbookFactory.create(in);} catch (Exception e) {log.error("创建工作簿失败!");}return workbook;}/*** 解析一个workbook.* * @param workbook* @param validateList*/public static Map<String, List<Map<String, String>>> parseExcel(Workbook workbook, String[] validateList) {Map<String, List<Map<String, String>>> rowMap = new HashMap<>();// 遍历excel表读取每一个sheet.for (int i = 0; i < workbook.getNumberOfSheets(); i++) {Sheet sheet = workbook.getSheetAt(i);// 验证表头行是否合法if (!validateHeader(sheet.getRow(0), validateList)) {return rowMap;}// 数据行List<Map<String, String>> rowList = excel2List(sheet, 1);if (CollectionUtils.isEmpty(rowList)) {log.error("\n>>>>>工作表数据为空。");return rowMap;}rowMap.put(String.valueOf(i), rowList);}return rowMap;}/*** 将excel的行转为list集合.* * @param sheet* @param startRow* @return*/public static List<Map<String, String>> excel2List(final Sheet sheet, final int startRow) {final List<Map<String, String>> rowList = new ArrayList<>();Row row = null;for (int i = startRow; i < sheet.getLastRowNum(); i++) {row = sheet.getRow(i);// 如果一行为空,或者一行没有值,就结束。if (null == row || 0 == row.getPhysicalNumberOfCells()) {break;}rowList.add(row2Map(row));}return rowList;}/*** 行数据转为map* * @param row 一行数据* @return*/private static Map<String, String> row2Map(final Row row) {final Map<String, String> map = new HashMap<>();for (int j = 0; j < row.getLastCellNum(); ++j) {final String value = getCellValue(row.getCell(j));map.put(String.valueOf(j), value);}return map;}/*** 获取单元格值* * @param cell* @return*/private static String getCellValue(final Cell cell) {DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");DecimalFormat df = new DecimalFormat("0.0000");String cellValue = "";if (null != cell) {switch (cell.getCellType()) {// 文本类型case STRING:cellValue = cell.getStringCellValue();break;case NUMERIC:// 如果是日期if (DateUtil.isCellDateFormatted(cell)) {cellValue = fmt.format(cell.getDateCellValue());} else {// 数字型cellValue = df.format(cell.getNumericCellValue());// 去掉多余的0,如最后一位是.则去掉cellValue = cellValue.replaceAll("0+?$", "").replaceAll("[.]$", "");}break;case BOOLEAN: // 布尔型cellValue = String.valueOf(cell.getBooleanCellValue());break;case BLANK: // 空白cellValue = cell.getStringCellValue();break;case ERROR: // 错误cellValue = "";break;case FORMULA: // 公式try {cellValue = String.valueOf(cell.getStringCellValue());} catch (IllegalStateException e) {cellValue = String.valueOf(cell.getNumericCellValue());}break;default:cellValue = cell.getRichStringCellValue() == null ? cellValue: cell.getRichStringCellValue().toString();}}return cellValue;}/*** 数据验证.* * @param row* @param validateList*/public static boolean validateHeader(Row row, String[] validateList) {short minColIx = row.getFirstCellNum();short maxColIx = row.getLastCellNum();for (short colIx = minColIx; colIx < maxColIx; colIx++) {String cellVal = row.getCell(colIx).getStringCellValue();if (StringUtils.isBlank(cellVal) || !validateList[colIx].equals(cellVal)) {log.error("员工表头行格式不正确");return false;}}return true;}
}

5、excel常量类

package com.example.demo.execl.cons;/*** excel使用的常量类.* * @author zl**/
public final class ExcelConst {public static String[] EMPLOYEE_EXCEL_HEADER = { "员工编号", "员工姓名", "员工工作", "员工直属领导编号", "员工入职时间", "员工工资", "员工奖金" };
}

6、employee实体类

package com.example.demo.execl.exe.entity;import java.io.Serializable;
import java.time.LocalDateTime;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;/*** <p>* * </p>** @author zl* @since 2021-11-22*/
public class Employee implements Serializable {private static final long serialVersionUID = 1L;/*** 员工编号*/@TableId("EMPLOYEE_ID")private Integer employeeId;/*** 员工姓名*/@TableField("EMPLOYEE_NAME")private String employeeName;/*** 员工工作*/@TableField("EMPLOYEE_JOB")private String employeeJob;/*** 员工直属领导编号*/@TableField("SUPERIOR_ID")private Integer superiorId;/*** 员工入职时间*/@TableField("ENTRY_TIME")private LocalDateTime entryTime;/*** 员工工资*/@TableField("SALARY")private Integer salary;/*** 员工奖金*/@TableField("BONUS")private Integer bonus;/*** 对应部门表的外键*/@TableField("DEPARTMENT_ID")private Integer departmentId;public Integer getEmployeeId() {return employeeId;}public void setEmployeeId(Integer employeeId) {this.employeeId = employeeId;}public String getEmployeeName() {return employeeName;}public void setEmployeeName(String employeeName) {this.employeeName = employeeName;}public String getEmployeeJob() {return employeeJob;}public void setEmployeeJob(String employeeJob) {this.employeeJob = employeeJob;}public Integer getSuperiorId() {return superiorId;}public void setSuperiorId(Integer superiorId) {this.superiorId = superiorId;}public LocalDateTime getEntryTime() {return entryTime;}public void setEntryTime(LocalDateTime entryTime) {this.entryTime = entryTime;}public Integer getSalary() {return salary;}public void setSalary(Integer salary) {this.salary = salary;}public Integer getBonus() {return bonus;}public void setBonus(Integer bonus) {this.bonus = bonus;}public Integer getDepartmentId() {return departmentId;}public void setDepartmentId(Integer departmentId) {this.departmentId = departmentId;}}

springboot整合poi解析excel相关推荐

  1. springboot -- 整合 poi 解析Excel 更新数据库数据

    目录: 1.建表,实体类,dao层,service层,自行操作 2.Excel–>Poi --> Maven依赖 3.解析Excel --> Poi 工具类 --> Confi ...

  2. Springboot整合Poi导出excel(简单版)

    一. 问题引入 博客专栏: Springboot整合Poi导出excel(简单版) Springboot整合Poi导出excel(注解版) 总所周知Springboot是一个功能强大的微服务框架,集成 ...

  3. Springboot整合Poi导出excel(注解版)

    简介 博客专栏: Springboot整合Poi导出excel(简单版) Springboot整合Poi导出excel(注解版) 上文提到通过poi简单导出Excel后,很多读者反应需要解决导出自适应 ...

  4. springboot整合poi基于excel模板下载的功能实现

    现在网上有很多基于poi的excel导入导出功能实现的代码,大家都写的很好,但好像关于静态资源excel模板导出的却很少.我整理了一下项目中遇到的excel导出的功能代码,展示如下,希望有所帮助,如有 ...

  5. springboot整合poi(使用EXCEL模板导出导入)

    springboot整合poi 依赖 <!-- poi依赖--><dependency><groupId>org.apache.poi</groupId> ...

  6. springboot + poi 解析 excel

    Apache POI 是用 Java 编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对 Microsoft Office 格式档案读和写的功能. 本文使用 s ...

  7. springboot整合poi读取数据库数据和图片动态导出excel

    springboot整合poi读取数据库数据和图片动态导出excel 第一次操作 话不多说就直接上代码 实现代码 需要的依赖 <dependency><groupId>org. ...

  8. 【Springboot+mybatis】 解析Excel并批量导入到数据库

    [Springboot+mybatis] 解析Excel并批量导入到数据库 置顶 2018年01月16日 20:05:52 冉野丶 阅读数:4060 标签: excel导入数据库 文件上传 excel ...

  9. poi解析excel读取日期为数字的问题

    Apache poi 版本:3.12 今天在用poi解析excel文件时,碰到一个蛋疼的问题. 在我的excel文件中有一列是日期类型,例如有以下这么一行数据(日期中月份前面的0会自动去掉): 在读取 ...

最新文章

  1. NLPIR智能语义:大数据挖掘助力人工智能快速发展
  2. 深圳“拍了拍”长沙:美食巨头文和友、茶颜、徐记海鲜正在“排队”签收
  3. C++ 源代码到可执行代码的详细过程 ?
  4. 高斯投影坐标系为什么是六七八位数
  5. C++|Qt工作笔记-Windows平台下的句柄与Qt中QWindow::winId()以及 QPlatformWindow::handle的区别与联系
  6. VS2010编译:_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
  7. 试用了5款BI分析工具,终于找到了上手最快的那一个!
  8. Zero-shot Adversarial Quantization论文翻译+解读
  9. webpack stats
  10. 车载网络测试 - 车载以太网 - ARP详细解析
  11. 第二章 四部和声的基本要求
  12. 系分 - 计算机网络
  13. MySql 数据库 知识点
  14. 用Swift搭建API Server,Vapor + PostgreSQL + Docker + ECS + OSS
  15. 'BMap' is not defined 解决方案
  16. 职场5大潜规则不可不知
  17. 【收藏分享】2022年PHP中高级面试题(三)
  18. safari阅读模式 html,新版Safari我最爱的功能:自动进入【阅读模式】
  19. Python重试库Retrying和Tenacity
  20. vue相关面试题,面试必问

热门文章

  1. 可编程并行通信接口8255A
  2. Opencv用hsv识别车牌(含源码)
  3. 本地blast详细用法
  4. Datawhale零基础入门数据挖掘-Task5模型融合
  5. VUE3(二十四)自定义alert弹窗组件
  6. 编写Makefile:编译当前文件夹以及子文件夹下所有的ccpp文件并生成可执行文件
  7. java如何实现导出Excel(附源码)--文末送书
  8. Mysql错误Error writing file ‘/home/tmp/xxxx’ (Errcode: 28)的解决方法
  9. pytorch 批量归一化BatchNorm1d和BatchNorm2d的用法、BN层参数 running_mean running_var变量计算 验证
  10. 在PyCharm环境中使用graphviz遇到的问题