在之前的文章中已经实现了文件上传至服务器,那么本片文章我们来实现上传Excl并读取Excl内容保存至Mysql数据库中
1.创建SpringBoot项目
具体怎样创建,这里不做太多介绍,不会的可以看我之前的文章,飞机票:
创建好项目之后需要添加几个jar包,直接贴出pom.xml文件内容,如下:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zj</groupId>
<artifactId>ssm</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ssm</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.jolbox</groupId>
<artifactId>bonecp-spring</artifactId>
<version>0.8.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.集成Mybatis+MySQL
怎样集成Mybatis和MySQL在之前的文章中也做过介绍,飞机票:
3.上传Excl文件
这里呢上传的过程跟文件上传一致,但是为了介绍明白,我们重新回顾一下,如下:
需要上传的文件内容如下:
数据库表结构:
1》上传文件,在controller类中写下上传方法
@RequestMapping(value = "/uploadExcl")
public @ResponseBody Map<String ,Object> uploadExcl(
HttpServletRequest request,
@RequestParam("file") MultipartFile file){
Map<String ,Object> result = new HashMap<>();
String path = request.getSession().getServletContext().getRealPath("/");
try{
// 如果文件不为空,写入上传路径
if(!file.isEmpty()){
result = userService.uploadExcl(file);
}else {
result.put("code","1");
result.put("message","上传文件为空!");
}
}catch (Exception e){
e.printStackTrace();
}
return result;
}
同时附上上传的测试页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传excl</title>
</head>
<body>
<div class="panel panel-primary">
<!-- .panel-heading 面板头信息。 -->
<div class="panel-heading">
<!-- .panel-title 面板标题。 -->
<h1 class="panel-title">上传excl并插入到数据库</h1>
</div>
</div>
<form class="form-horizontal" action="/user/uploadExcl" enctype="multipart/form-data" method="post">
<div class="form-group">
<div class="input-group col-md-4">
<span class="input-group-addon">
<i class="glyphicon glyphicon-search"></i>
</span>
<input class="form-control" placeholder="请选择文件" type="file" name="file"/>
</div>
</div>
<div class="form-group">
<div class="col-md-4">
<div class="btn-group btn-group-justified" >
<div class="btn-group" >
<button type="submit" class="btn btn-success" id="submitbtn">
<span class="glyphicon glyphicon-share"></span> 文件上传</button>
</div>
</div>
</div>
</div>
</form>
</body>
</html>
页面比较丑,将就看(手动滑稽)
2》读取excl,在service类中实现文件的读取,具体代码如下:
/**
* 读取excl并插入到数据中
* @param file
* @return
*/
public Map<String,Object> uploadExcl(MultipartFile file) {
Map<String,Object> ruslt = new HashMap<>();
try {
String fileName = file.getOriginalFilename();
Workbook workbook;
if(fileName.endsWith("xls")){
workbook = new HSSFWorkbook(file.getInputStream());
}else if(fileName.endsWith("xlsx")){
workbook = new XSSFWorkbook(file.getInputStream());
} else {
ruslt.put("code","1");
ruslt.put("message","文件格式非excl");
return ruslt;
}
//判断第一页不为空
if(null != workbook.getSheetAt(0)){
//读取excl第二行,从1开始
for(int rowNumofSheet = 1;rowNumofSheet <=workbook.getSheetAt(0).getLastRowNum();rowNumofSheet++){
if (null != workbook.getSheetAt(0).getRow(rowNumofSheet)) {
//定义行,并赋值
Row aRow = workbook.getSheetAt(0).getRow(rowNumofSheet);
User user = new User();
System.out.println(aRow.getLastCellNum());
for(int cellNumofRow=0;cellNumofRow<aRow.getLastCellNum();cellNumofRow++){
//读取rowNumOfSheet值所对应行的数据
//获得行的列数
Cell xCell = aRow.getCell(cellNumofRow);
Object cell_val;
if(cellNumofRow == 0){
if(xCell != null && !xCell.toString().trim().isEmpty()){
cell_val = xCell.getStringCellValue();
if(cell_val != null){
String temp = (String)cell_val;
user.setName(temp);
}
}
}
if(cellNumofRow == 1){
if(xCell != null && !xCell.toString().trim().isEmpty()){
cell_val = xCell.getStringCellValue();
if(cell_val != null){
String temp = (String)cell_val;
if("男".equals(temp)){
user.setSex("1");
} else {
user.setSex("0");
}
user.setCreateTime(new Date());
userMapper.insert(user);
}
}
}
}
}
}
ruslt.put("code","0");
ruslt.put("message","成功插入数据库!");
}else {
ruslt.put("code","1");
ruslt.put("message","第一页EXCL无数据!");
}
}catch (Exception e){
e.printStackTrace();
ruslt.put("code","1");
ruslt.put("message",e.getMessage());
}
return ruslt;
}
后面还有mapper相关的代码,这里就不贴出来了,我是直接用MySQL提供的逆向工程生成的mapper和bean
4.设置上传文件大小
当上传文件过大时,系统会报错,超出默认上传文件大小,如下:
这个时候咱们需要设置文件的大小
直接在application.properties中加入,需要注意的是:我这里用的SpringBoot2.1.2所以需要注意文件大小的格式
#配置文件传输
spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=0
#单个数据的大小,这里对应的是字节10485760B=10MB
spring.servlet.multipart.max-file-size=10485760
#总数据的大小
spring.servlet.multipart.max-request-size=1048576000
延伸一下:
SpringBoot2.1.2是以上格式
Spring1.3格式
multipart.maxFileSize=10MB
multipart.maxRequestSize=100MB
Spring1.4和1.5格式
spring.http.multipart.maxFileSize=10MB
spring.http.multipart.maxRequestSize=100MB