关于springboot将Excel表导入至数据库以及数据回显范例

我们需要使用到workbook类,首先要导入相对应的maven

<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>

创建工具类,用于读取Excel表内容

package edu.gdlgxy.newexaminationsystem.utils;

import edu.gdlgxy.newexaminationsystem.bean.inputExcel;
import lombok.extern.slf4j.Slf4j;
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.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Repository
@Slf4j
public class ReadExcel {
    @Autowired
    JdbcTemplate jdbcTemplate;

    /**
     * 读取excel文件内容
     *
     * @throws Exception
     */
    @Transactional
    public void readExcel(String filePathByString, String fileName) throws Exception {
        String realPath = filePathByString + "/" + fileName;
        InputStream is = new FileInputStream(new File(realPath));
        Workbook hssfWorkbook = null;
        if (fileName.endsWith("xlsx")) {
            hssfWorkbook = new XSSFWorkbook(is);//Excel 2007
        } else if (fileName.endsWith("xls")) {
            hssfWorkbook = new HSSFWorkbook(is);//Excel 2003
        }
        inputExcel inputExcel = null;
        List<inputExcel> list = new ArrayList<>();
        // 循环工作表Sheet
        for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
            //HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
            Sheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
            if (hssfSheet == null) {
                continue;
            }
            // 循环行Row
            for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                Row hssfRow = hssfSheet.getRow(rowNum);
                if (hssfRow != null) {
                    inputExcel = new inputExcel();
                    Cell id = hssfRow.getCell(0);
                    Cell name = hssfRow.getCell(1);
                    Cell sex = hssfRow.getCell(2);
                    Cell identityCode = hssfRow.getCell(3);
                    Cell stuNumber = hssfRow.getCell(4);
                    Cell eduBackground = hssfRow.getCell(5);
                    Cell enrollmentYear = hssfRow.getCell(6);
                    Cell subjectCode = hssfRow.getCell(7);
                    Cell examTitle = hssfRow.getCell(8);
                    Cell examLevel = hssfRow.getCell(9);
                    Cell telNumber = hssfRow.getCell(10);
                    Cell subordinateDepartments = hssfRow.getCell(11);
                    Cell major = hssfRow.getCell(12);
                    Cell classNumber = hssfRow.getCell(13);

                    //这里是自己的逻辑
                    //把得到Cell类型的id转换成String=》double=》int
                    //id
                    String s1 = String.valueOf(id);
                    double v1 = Double.parseDouble(s1);
                    BigDecimal realId= BigDecimal.valueOf(v1);
//                    inputExcel.setId(realId);

                   //名称
                    inputExcel.setName(name.toString());
                   //性别
                   inputExcel.setSex(sex.toString());

                   //把得到Cell类型的num转换成String=》double=》int
                   //身份证号码
                    inputExcel.setIdentityCode(identityCode.toString());
                    //学号
                    String s3 = String.valueOf(stuNumber);
                    double v3 = Double.parseDouble(s3);
                    BigDecimal realstuNumber = BigDecimal.valueOf(v3);
                    inputExcel.setStuNumber(realstuNumber);
                    //学历
                    inputExcel.setEduBackground(eduBackground.toString());
                    //入学年份
                    //目前的enrollmentYear是Cell类型的
                    inputExcel.setEnrollmentYear(enrollmentYear.toString());

                    //报考科目
                    inputExcel.setExamTitle(examTitle.toString());
                    //科目代码
                   inputExcel.setSubjectCode(subjectCode.toString());
                    //等级
                   inputExcel.setExamLevel(examLevel.toString());
                    //手机号码
                    String s5 = String.valueOf(telNumber);
                   double v5 = Double.parseDouble(s5);
                    BigDecimal realTelNumber = BigDecimal.valueOf(v5);
                    inputExcel.setTelNumber(realTelNumber);
                    //所属院系
                    inputExcel.setSubordinateDepartments(subordinateDepartments.toString());
                   //所属专业
                   inputExcel.setMajor(major.toString());
                    //班级
                    inputExcel.setClassNumber(classNumber.toString());
                    list.add(inputExcel);
                    }
                }
        }



        //先把原表的数据导进备份表(留痕)
        String backupSQL= "INSERT INTO BACKUP SELECT * FROM inputExcel";
        jdbcTemplate.update(backupSQL);

        //再次插入数据时,先把原先的数据删掉,再重新更新新的数据
        Long count = jdbcTemplate.queryForObject("select count(*) from inputExcel",Long.class);
        if(count>0){
            jdbcTemplate.update("TRUNCATE TABLE inputexcel;");
        }
        //循环插入list集合里面的Student对象属性
        for (int i = 0; i < list.size(); i++) {
            inputExcel ie = list.get(i);
            String sql="insert into inputExcel(id,name,sex,identityCode,stuNumber,eduBackground,enrollmentYear,subjectCode," +
                    "examTitle,examLevel,telNumber,subordinateDepartments,major,classNumber)values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
            Object[] args={ie.getId(),ie.getName(),ie.getSex(),ie.getIdentityCode(),ie.getStuNumber(),ie.getEduBackground(),
                            ie.getEnrollmentYear(),ie.getSubjectCode(),ie.getExamTitle(),ie.getExamLevel(),ie.getTelNumber(),
                            ie.getSubordinateDepartments(),ie.getMajor(),ie.getClassNumber()};
            jdbcTemplate.update(sql,args);
        }

        }


    }

使用范例

/**
     * 接收管理端web传过来的excel表
     *
     * @param uploadExcel
     * @return
     * @throws IOException
     */
    @PostMapping("/uploadExcel")
    public String uploadExcel(@RequestPart("certificate") MultipartFile uploadExcel) throws Exception {
        if (!uploadExcel.isEmpty()) {
            //保存到文件服务器,OSS服务器
            String originalFilename = uploadExcel.getOriginalFilename();//获取excel表的名字
            log.info("导入的excel的表格名字是:" + originalFilename);//eg:学分导入模板.xlsx
            File filepath = new File("D:\\saveCertificateExcel\\");
            String filePathByString = filepath.toString();//file类型文件路径转string类型
            log.info(filepath.toString());//打印路径
            if (!filepath.exists()) {
                filepath.mkdir();
            }
            uploadExcel.transferTo(new File("D:\\saveCertificateExcel\\" + originalFilename));
            read.readExcel(filePathByString, originalFilename);//这里调用读取excel文件内容方法
        }
        return "success";
    }

    //  选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法
    private File transferToFile(MultipartFile multipartFile) {
        File file = null;
        try {
            String originalFilename = multipartFile.getOriginalFilename();
            String[] filename = originalFilename.split(".");
            file = File.createTempFile(filename[0], filename[1]);
            multipartFile.transferTo(file);
            file.deleteOnExit();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

前端页面,这里使用了Thymeleaf模板引擎

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<!--上传-->
        <div >
            <div class="row">
                <div class="col-lg-12">

                    <form role="form" th:action="@{/uploadExcel}" method="post" enctype="multipart/form-data">
                        <div class="form-group">
                            <label for="exampleInputFile">选择excel表</label>
                            <input type="file" name="certificate" id="exampleInputFile">
                        </div>
                        <button type="submit" class="btn btn-primary">上传</button>
                    </form>
                    <br><br><br><br>

                </div>
            </div>
        </div>

    <!--上传-->

至此结束!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值