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

本文使用 springboot + mybatis + poi ,来介绍如何解析 excel 、并将 excel 内的数据添加到数据库

一、编写代码

1、添加依赖

因为 excel 分 2003 以前版本和 2007 以上版本,所以需要引入两个 poi 依赖jar包,以对它们分别解析

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.dmeo</groupId><artifactId>springbootpoi</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>springbootpoi</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--poi对excel2007以上版本的支持-->  <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><!--poi对excel2003以下版本的支持-->  <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2、配置mybatis

由于本文重点是 poi 解析 excel ,这里就不详细谈如何配置 mybatis,如果读者不会这部分内容,可以参看博主的另一篇文章,springboot 整合 mybatis

mybatis 配置成功后、yml文件如下

server:port:  9001spring:datasource:url:  jdbc:mysql://10.42.12.67:3306/orcl?useUnicode=true&characterEncoding=utf-8&useSSL=falsedriver-class-name:  com.mysql.jdbc.Driver  username:  rootpassword:  123456 mybatis:mapper-locations:  classpath:mapper/*Mapper.xmlconfig-location:  classpath:mapper/config/sqlMapConfig.xml     

3、数据库建表

建表sql如下

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`user_id` double DEFAULT NULL,`user_name` varchar(64) DEFAULT NULL,`age` int(11) DEFAULT NULL,`user_addr` varchar(64) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表格创建后如下

4、创建实体类

package com.demo.bean;public class User {private double userId;private String userName;private Integer age;private String userAddr;public double getUserId() {return userId;}public void setUserId(double userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getUserAddr() {return userAddr;}public void setUserAddr(String userAddr) {this.userAddr = userAddr;}@Overridepublic String toString() {return "User [userId=" + userId + ", userName=" + userName + ", age=" + age + ", userAddr=" + userAddr + "]";}
}

5、创建mapper接口层

package com.demo.mapper;import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.demo.bean.User;@Mapper
public interface UserMapper {//批量将数据添加到数据库int insertForeach(List<User> list);}

6、创建 mapper.xml 文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.demo.mapper.UserMapper"><insert id="insertForeach" parameterType="java.util.List" useGeneratedKeys="false">insert into user ( user_id, user_name, age, user_addr) values<foreach collection="list" item="item" index="index" separator=",">(#{item.userId}, #{item.userName}, #{item.age}, #{item.userAddr})</foreach>       </insert>
</mapper>

7、编写上传 excel 页面

此处使用 freemarker 模板引擎

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>excel上传解析</title>
</head>
<body><form action="/importExcel" method="post" enctype="multipart/form-data"><input type="file" name="file" /><input type="submit" value="EXCEL上传" /></form>
</body>
</html>

8、创建 excel 值处理类

package com.demo.util;import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;public class ExcelUtils {/*** excel值处理* @param hssfCell* @return*/public static Object getXSSFValue(XSSFCell hssfCell) {if(hssfCell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {return hssfCell.getNumericCellValue();    //数字}else if(hssfCell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN) {return hssfCell.getBooleanCellValue();    //boolean}else if(hssfCell.getCellType() == XSSFCell.CELL_TYPE_ERROR){return hssfCell.getErrorCellValue();      //故障}else if(hssfCell.getCellType() == XSSFCell.CELL_TYPE_FORMULA){return hssfCell.getCellFormula();         //公式}else if(hssfCell.getCellType() == XSSFCell.CELL_TYPE_BLANK) {return "";                                //空值}else {return hssfCell.getStringCellValue();     //字符串}}/*** excel值处理* @param hssfCell* @return*/public static Object getValue(Cell hssfCell) {if(hssfCell.getCellType()==XSSFCell.CELL_TYPE_NUMERIC) {return hssfCell.getNumericCellValue();   //数字 }else if(hssfCell.getCellType()==XSSFCell.CELL_TYPE_BOOLEAN) {return hssfCell.getBooleanCellValue();   //boolean}else if(hssfCell.getCellType()==XSSFCell.CELL_TYPE_ERROR){return hssfCell.getErrorCellValue();     //故障}else if(hssfCell.getCellType()==XSSFCell.CELL_TYPE_FORMULA){return hssfCell.getCellFormula();        //公式}else if(hssfCell.getCellType() == XSSFCell.CELL_TYPE_BLANK) {return "";                                 //空值}else {return hssfCell.getStringCellValue();    //字符串}}}

9、创建controller 及解析 excel 主要代码

具体注释已经写到代码中、相信读者能够看懂

package com.demo.controller;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.demo.bean.User;
import com.demo.mapper.UserMapper;
import com.demo.util.ExcelUtils;@Controller
public class ExcelController {private static Logger logger = LoggerFactory.getLogger(ExcelController.class);@Autowiredprivate UserMapper userMapper;@RequestMapping("/")public ModelAndView index() {ModelAndView mav = new ModelAndView();mav.setViewName("index");return mav;}@RequestMapping("/importExcel")public ModelAndView importExcel(MultipartFile file) throws IOException {String fileName = file.getOriginalFilename();  //获得上传的excel文件名String fileSuffix = fileName.substring(fileName.lastIndexOf(".")+1);  //获取上传的excel文件名后缀List<User> list = null;if("xlsx".equals(fileSuffix)) {logger.info("excel2007及以上版本");XSSFWorkbook xwb = new XSSFWorkbook(file.getInputStream()); //获取excel工作簿XSSFSheet xssfSheet = xwb.getSheetAt(0); //获取excel的sheetif(xssfSheet == null) {return null;}list = new ArrayList<User>();//循环获取excel每一行  for(int rowNum = 1; rowNum < xssfSheet.getLastRowNum()+1; rowNum++) {XSSFRow xssfRow = xssfSheet.getRow(rowNum);if(xssfRow == null) {continue;}User user = new User();//循环获取excel每一行的每一列  for(int cellNum = 0; cellNum < xssfRow.getLastCellNum(); cellNum++) {XSSFCell xssCell = xssfRow.getCell(cellNum);if(xssCell == null) {continue;}if(cellNum == 0) {user.setUserId((Double)ExcelUtils.getXSSFValue(xssCell));}else if(cellNum == 1) {user.setUserName((String)ExcelUtils.getXSSFValue(xssCell));}else if(cellNum == 2) {//Integer类型需要自行处理String res = String.valueOf((Double)ExcelUtils.getXSSFValue(xssCell));Integer.parseInt(res.substring(0, res.length()-2));user.setAge(Integer.parseInt(res.substring(0, res.length()-2)));     }else if(cellNum == 3) {user.setUserAddr((String)ExcelUtils.getXSSFValue(xssCell));}System.out.print(" "+ExcelUtils.getXSSFValue(xssCell));}list.add(user);  //将excel每一行的数据封装到user对象,并将user对象添加到list System.out.println("");}}else if("xls".equals(fileSuffix)) {logger.info("excel2003版本");Workbook wb=new HSSFWorkbook(file.getInputStream()); //获取excel工作簿Sheet sheet=wb.getSheetAt(0);  //获取excel的sheetif(sheet==null) {return null;}list = new ArrayList<User>();//循环获取excel每一行   for(int rowNum=1;rowNum<sheet.getLastRowNum()+1;rowNum++) {Row row=sheet.getRow(rowNum);if(row==null) {continue;}User user = new User();   //循环获取excel每一行的每一列  for(int cellNum=0;cellNum<row.getLastCellNum();cellNum++) {Cell cell=row.getCell(cellNum);if(cell==null) {continue;}if(cellNum==0) {user.setUserId((Double)ExcelUtils.getValue(cell));}else if(cellNum==1) {user.setUserName((String)ExcelUtils.getValue(cell));}else if(cellNum==2) {//Integer类型需要自行处理String res = String.valueOf((Double)ExcelUtils.getValue(cell));Integer.parseInt(res.substring(0, res.length()-2));user.setAge(Integer.parseInt(res.substring(0, res.length()-2)));   }else if(cellNum==3) {user.setUserAddr((String)ExcelUtils.getValue(cell));}System.out.print(" "+ExcelUtils.getValue(cell));}list.add(user);    //将excel每一行的数据封装到user对象,并将user对象添加到list System.out.println("");}}//将list批量添加到数据库int count = userMapper.insertForeach(list);System.out.println(count);return null;}}

10、总结

经过以上9个步骤、项目结构如下

二、测试

浏览器访问 http://localhost:9001/

excel xlsx 、xls 文件分别如下

先上传 红楼梦人物.xls  文件 ,效果如下

再上传 西游记.xlsx  文件 ,效果如下

springboot + poi 解析 excel相关推荐

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

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

  2. ssh excel 导入 mysql_ssh poi解析excel并将数据存入数据库

    做完了一个报表导入数据库 功能 遇到几个问题:一 .Poi解析excel 的两种格式 xls xlsx. 二.form表单上传使用ajax 三.excel 单元格中有公式存在普通的读取方式读到的是公式 ...

  3. Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法

    java 中 poi解析Excel文件版本问题解决办法 发布时间:2020-10-02 03:46:15 来源:脚本之家 阅读:91 作者:程诺 poi解析Excel文件版本问题解决办法 poi解析E ...

  4. POI解析Excel表格

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 这里实现poi解析Excel表格的例子,导入Exc ...

  5. 为什么poi解析Excel慢?

    我们项目用xlsx配置业务数据,每个项目中会有500~600张表,解析耗时1分多钟. 尝试改成csv后,解析耗时5~6秒. 这不禁让我陷入思考,都是文本数据,为什么poi解析Excel会这么慢? 带着 ...

  6. 【poi-3.8】poi解析excel插入数据库详解

    文章目录 poi解析excel&插入数据库详解 说明 一.目的 二.准备工作 三.思路分析 四.流程图分析 五.核心代码 1:上传文件 2:获取输入流 3:初始化excel表 4:遍历行和列 ...

  7. 使用Apache POI解析excel

    1.使用Apache POI解析excel,包括.xls和.xlsx Apache POI 针对Workbook有两种不同实现方式,分别是HSSFWorkbook(解析.xls文件)和XSSFWork ...

  8. poi解析Excel文件版本问题

    poi解析Excel文件时有两种格式: HSSFWorkbook格式用来解析Excel2003(xls)的文件 XSSFWorkbook格式用来解析Excel2007(xlsx)的文件 如果用HSSF ...

  9. java解析excel报错,poi解析excel文件报错

    getFileMagic() only operates on streams which support mark(int) 使用 bis 解决 BufferedInputStream bis = ...

最新文章

  1. 40题刷爆Keras,人生苦短我选Keras
  2. VTK:PolyData之TriangleArea
  3. 队列 一种数据结构(多线程利器)
  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存...
  5. 不创建 sequence 自增字段
  6. roadrunner监控linux服务器,Jenkins添加TPS与服务器监控变化曲线图
  7. 【架构】大型网站优化技术思路
  8. PCB CS架构(工程系统)实现单点登入方法
  9. MQTT协议报文格式解析
  10. SSD1306 - OLED显示屏
  11. mysql修改唯一索引
  12. Mac中设置右键新建TXT文件
  13. Verilog基本语法之wire和reg
  14. 即时通讯系统集成开发
  15. Hash——哈希法概念、哈希函数构造方法、哈希冲突解决办法(重点讨论链地址法)
  16. Java安全-注入漏洞(SQL注入、命令注入、表达式注入、模板注入)
  17. 【集成学习(上)】My_Task03掌握偏差与方差理论 笔记
  18. 构建创客教育空间理念的雏形
  19. java基础学习 --- 第二节 变量、数据类型和运算符
  20. arap deformation 网格变形可视化

热门文章

  1. JAVA的元数据注释
  2. ssm整合hibernate-validator
  3. 青海2022农民丰收节 国稻种芯:河湟第七届农产品展交会
  4. 「游戏建模」制作高模的基本流程
  5. 神经网络算法的具体流程,脑神经网络的构建过程
  6. 1688接口 -电商代购
  7. Django中URL正则表达式匹配
  8. 【正则表达式】Unity正则表达式
  9. 有趣问题——海盗分金
  10. Google Chrome Frame一个神奇的东东