在之前的文章中已经实现了文件上传至服务器,那么本片文章我们来实现上传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文件

这里呢上传的过程跟文件上传一致,但是为了介绍明白,我们重新回顾一下,如下:

需要上传的文件内容如下:

springboot 存入protobuf 到mysql springboot保存文件到数据库_读取Excl

数据库表结构:

springboot 存入protobuf 到mysql springboot保存文件到数据库_读取Excl_02

    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.设置上传文件大小

当上传文件过大时,系统会报错,超出默认上传文件大小,如下:

springboot 存入protobuf 到mysql springboot保存文件到数据库_spring_03

这个时候咱们需要设置文件的大小

直接在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