springBoot读取excel并存入数据库

6 篇文章 0 订阅
2 篇文章 0 订阅

springBoot读取excel并存入数据库

代码块如下(适用与xls2003及xlsx2007版本):
吾日三省吾身,高否,富否,帅否,否,学习去

maven依赖

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi</artifactId>
		<version>4.1.0</version>
	</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml</artifactId>
		<version>4.1.0</version>
	</dependency>

Mysql创建表语句

/*
 Navicat Premium Data Transfer

 Source Server         : 127.0.0.1
 Source Server Type    : MySQL
 Source Server Version : 50709
 Source Host           : localhost:3306
 Source Schema         : data

 Target Server Type    : MySQL
 Target Server Version : 50709
 File Encoding         : 65001

 Date: 04/05/2020 16:29:25
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for workers_data_df
-- ----------------------------
DROP TABLE IF EXISTS `workers_data_df`;
CREATE TABLE `workers_data_df`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `card_num` int(11) NOT NULL,
  `worker_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  `age` int(30) NULL DEFAULT NULL,
  `sex` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  `position` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  `work_date` date NULL DEFAULT NULL,
  `add_data_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`, `card_num`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 91 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

excel示例样板
在这里插入图片描述

读取excel工具类

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.web.multipart.MultipartFile;

import com.project.main.excel.upload.entity.WorkersPO;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.*;
import java.util.logging.Logger;


/**
 * 读取Excel内容
 * @author Administrator
 *
 */

public class ExcelReader {

    private static Logger logger = Logger.getLogger(ExcelReader.class.getName()); // 日志打印类
    //Map<String,Object> map = new HashMap<String, Object>();

    private static final String XLS = "xls";
    private static final String XLSX = "xlsx";

    /**
               * 根据文件后缀名类型获取对应的工作簿对象
     * @param inputStream 读取文件的输入流
     * @param fileType 文件后缀名类型(xls或xlsx)
     * @return 包含文件数据的工作簿对象
     * @throws IOException
     */
    public static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
        Workbook workbook = null;
        if (fileType.equalsIgnoreCase(XLS)) {
            workbook = new HSSFWorkbook(inputStream);
        } else if (fileType.equalsIgnoreCase(XLSX)) {
            workbook = new XSSFWorkbook(inputStream);
        }
        return workbook;
    }

    /**
               * 读取Excel文件内容
     * @param fileName 要读取的Excel文件所在路径
     * @return 读取结果列表,读取失败时返回null
     */
    public static List<WorkersPO> readExcel(String fileName) {

        Workbook workbook = null;
        FileInputStream inputStream = null;

        try {
            // 获取Excel后缀名
            String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
            // 获取Excel文件
            File excelFile = new File(fileName);
            if (!excelFile.exists()) {
                logger.warning("指定的Excel文件不存在!");
            }

            // 获取Excel工作簿
            inputStream = new FileInputStream(excelFile);
            workbook = getWorkbook(inputStream, fileType);

            // 读取excel中的数据
            List<WorkersPO> resultDataList = parseExcel(workbook);

            return resultDataList;
        } catch (Exception e) {
            logger.warning("解析Excel失败,文件名:" + fileName + " 错误信息:" + e.getMessage());
            return null;
        } finally {
            try {
                if (null != workbook) {
                    workbook.close();
                }
                if (null != inputStream) {
                    inputStream.close();
                }
            } catch (Exception e) {
                logger.warning("关闭数据流出错!错误信息:" + e.getMessage());
                return null;
            }
        }
    }

    /**
               * 读取Excel文件内容
     * @param file 上传的Excel文件
     * @return 读取结果列表,读取失败时返回null
     */
    public static List<WorkersPO> readExcel(MultipartFile file) {

        Workbook workbook = null;

        try {
            // 获取Excel后缀名
            String fileName = file.getOriginalFilename();
            if (fileName == null || fileName.isEmpty() || fileName.lastIndexOf(".") < 0) {
                logger.warning("解析Excel失败,因为获取到的Excel文件名非法!");
                return null;
            }
            String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());

            // 获取Excel工作簿
            workbook = getWorkbook(file.getInputStream(), fileType);

            // 读取excel中的数据
            List<WorkersPO> resultDataList = parseExcel(workbook);

            return resultDataList;
        } catch (Exception e) {
            logger.warning("解析Excel失败,文件名:" + file.getOriginalFilename() + " 错误信息:" + e.getMessage());
            return null;
        } finally {
            try {
                if (null != workbook) {
                    workbook.close();
                }
            } catch (Exception e) {
                logger.warning("关闭数据流出错!错误信息:" + e.getMessage());
                return null;
            }
        }
    }


    /**
               * 解析Excel数据
     * @param workbook Excel工作簿对象
     * @return 解析结果
     */
    private static List<WorkersPO> parseExcel(Workbook workbook) {
       List<WorkersPO> resultDataList = new ArrayList<>();
        // 解析sheet
        for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
            Sheet sheet = workbook.getSheetAt(sheetNum);

            // 校验sheet是否合法
            if (sheet == null) {
                continue;
            }

            // 获取第一行数据
            int firstRowNum = sheet.getFirstRowNum();
            Row firstRow = sheet.getRow(firstRowNum);
            //if (null == firstRow) {
                //logger.warning("解析Excel失败,在第一行没有读取到任何数据!");
            //}

            // 解析每一行的数据,构造数据对象
            int rowStart = firstRowNum + 2; //获取第几行
            int rowEnd = sheet.getPhysicalNumberOfRows();
            for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
                Row row = sheet.getRow(rowNum);

                if (null == row) {
                    continue;
                }

                WorkersPO resultData = convertRowToData(row);
                if (null == resultData) {
                    logger.warning("第 " + row.getRowNum() + "行数据不合法,已忽略!");
                    continue;
                }
                resultDataList.add(resultData);
            }
        }

        return resultDataList;
    }

    /**
     * 将单元格内容转换为字符串
     * @param cell
     * @return
     */
    private static String convertCellValueToString(Cell cell) {
        if(cell==null){
            return null;
        }
        String returnValue = null;
        switch (cell.getCellType()) {
            case NUMERIC:   //数字
                Double doubleValue = cell.getNumericCellValue();

                // 格式化科学计数法,取一位整数
                DecimalFormat df = new DecimalFormat("0");
                returnValue = df.format(doubleValue);
                break;
            case STRING:    //字符串
                returnValue = cell.getStringCellValue();
                break;
            case BOOLEAN:   //布尔
                Boolean booleanValue = cell.getBooleanCellValue();
                returnValue = booleanValue.toString();
                break;
            case BLANK:     // 空值
                break;
            case FORMULA:   // 公式
                returnValue = cell.getCellFormula();
                break;
            case ERROR:     // 故障
                break;
            default:
                break;
        }
        return returnValue;
    }

    /**
     * 提取每一行中需要的数据,构造成为一个结果数据对象
     *
     * 当该行中有单元格的数据为空或不合法时,忽略该行的数据
     *
     * @param row 行数据
     * @return 解析后的行数据对象,行数据错误时返回null
     */
    private static WorkersPO convertRowToData(Row row) {
    	WorkersPO resultData = new WorkersPO();

        Cell cell;
        int cellNum = 0;
        
        //获取工号
        cell = row.getCell(cellNum++);
        String cardNum = convertCellValueToString(cell);
        if (null == cardNum || "".equals(cardNum)) {
            // 年龄为空
            resultData.setCardNum(cardNum);
        } else {
            resultData.setCardNum(cardNum);
        }
        
        // 获取姓名
        cell = row.getCell(cellNum++);
        String workerName = convertCellValueToString(cell);
        if (null == workerName || "".equals(workerName)) {
            // 年龄为空
            resultData.setWorkerName(workerName);
        } else {
            resultData.setWorkerName(workerName);
        }
        
        // 获取年龄
        cell = row.getCell(cellNum++);
        String age = convertCellValueToString(cell);
        if (null == age || "".equals(age)) {
            // 年龄为空
            resultData.setAge(null);
        } else {
            resultData.setAge(age);
        }
        
        // 获取性别
        cell = row.getCell(cellNum++);
        String sex = convertCellValueToString(cell);
        resultData.setSex(sex);
        
        // 获取居住地
        cell = row.getCell(cellNum++);
        String address = convertCellValueToString(cell);
        resultData.setAddress(address);
        
        // 获取部门
        cell = row.getCell(cellNum++);
        String position = convertCellValueToString(cell);
        resultData.setPosition(position);
        
        // 获取入职时间
        cell = row.getCell(cellNum++);
        String workDate = convertCellValueToString(cell);
        resultData.setWorkDate(workDate);

        return resultData;
    }

}

实体类(推荐试用lombok插件,本文没用)

import java.sql.Date;

/**
 * 职工信息表实体
 * @author Administrator
 *
 */
public class WorkersPO {
	private String cardNum;
	private String workerName;
	private String age;
	private String sex;
	private String address;
	private String position;
	private String workDate;
	public String getCardNum() {
		return cardNum;
	}
	public void setCardNum(String cardNum) {
		this.cardNum = cardNum;
	}
	public String getWorkerName() {
		return workerName;
	}
	public void setWorkerName(String workerName) {
		this.workerName = workerName;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getPosition() {
		return position;
	}
	public void setPosition(String position) {
		this.position = position;
	}
	public String getWorkDate() {
		return workDate;
	}
	public void setWorkDate(String workDate) {
		this.workDate = workDate;
	}
	public WorkersPO(String cardNum, String workerName, String age, String sex, String address, String position,
			String workDate) {
		super();
		this.cardNum = cardNum;
		this.workerName = workerName;
		this.age = age;
		this.sex = sex;
		this.address = address;
		this.position = position;
		this.workDate = workDate;
	}
	public WorkersPO() {
		super();
	}
	@Override
	public String toString() {
		return "WorkersPO [cardNum=" + cardNum + ", workerName=" + workerName + ", age=" + age + ", sex=" + sex
				+ ", address=" + address + ", position=" + position + ", workDate=" + workDate + "]";
	}
}

Mapper类

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface WorkersMapper {
	/**
	 * 插入数据(读取excel入库)
	 * @param workersPO
	 * @return
	 */
	int insertWorkers(Map<String,Object> map);
	
	@Select("SELECT card_num FROM data.workers_data_df")
	List<String> getCardNum();
}

MyBatis

	<insert id="insertWorkers">
        INSERT INTO data.workers_data_df
        <trim prefix="(" suffix=")" suffixOverrides="," >
            <if test='cardNum != null and cardNum !=""'>
                card_num,
            </if>
            <if test='workerName != null and workerName !=""'>
                worker_name,
            </if>
            <if test='age != null and age !=""'>
                age,
            </if>
            <if test='sex != null and sex !=""'>
                sex,
            </if>
            <if test='address != null and address !=""'>
                address,
            </if>
            <if test='position != null and position !=""'>
                position,
            </if>
            <if test='workDate != null'>
                work_date
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test='cardNum != null and cardNum !=""'>
             	#{cardNum,jdbcType=INTEGER},
            </if>
            <if test='workerName != null and workerName !=""'>
            	#{workerName,jdbcType=VARCHAR},
            </if>
            <if test='age != null and age !=""'>
            	#{age,jdbcType=INTEGER},
            </if>
            <if test='sex != null and sex !=""'>
            	#{sex,jdbcType=VARCHAR},
            </if>
            <if test='address != null and address !=""'>
            	#{address,jdbcType=VARCHAR},
            </if>
            <if test='position != null and position !=""'>
            	#{position,jdbcType=VARCHAR},
            </if>	
            <if test='workDate != null'>
            	#{workDate,jdbcType=DATE}
            </if>
        </trim>
    </insert>

Service类

import java.util.List;
import java.util.Map;


public interface WorkersService {
	/**
	 * 插入数据(读取excel入库)
	 * @param workersPO
	 * @return
	 */
	int insertWorkers(Map<String,Object> map);
	
	List<String> getCardNum();
}

Service实现类

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.project.main.excel.upload.mapper.WorkersMapper;
import com.project.main.excel.upload.service.WorkersService;

@Service
public class WorkersServiceImpl implements WorkersService{
	
	@Autowired
	private WorkersMapper workersMapper;

	@Override
	public int insertWorkers(Map<String,Object> map) {
		return workersMapper.insertWorkers(map);
	}

	@Override
	public List<String> getCardNum() {
		return workersMapper.getCardNum();
	}
}

Controller类

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.project.main.excel.upload.entity.WorkersPO;
import com.project.main.excel.upload.service.WorkersService;
import com.project.main.excel.upload.utils.ExcelReader;
import com.project.main.utils.R;

@RestController
@CrossOrigin
public class WorkersController {
	
	@Autowired
	private WorkersService workersService;
	
	@GetMapping("/workersExcelUpload")
	public R workersExcelUpload(@RequestParam String excelFileName) {
		try {
			Map<String,Object> map = new HashMap<String, Object>();
			List<String> cardNumList = workersService.getCardNum(); //查询库里已有卡号
	        List<WorkersPO> readResult = ExcelReader.readExcel(excelFileName); //excel读取到的数据
	        System.out.println(readResult);
	        for (int i=0;i<readResult.size();i++){
	        	String cardNum = readResult.get(i).getCardNum();
	        	if(cardNumList.contains(cardNum)) { //只添加库中卡号没有数据进行判定
	        		continue;
	        	}else {
	        		map.put("cardNum", cardNum);
	        		map.put("workerName", readResult.get(i).getWorkerName());
	        		map.put("age", readResult.get(i).getAge());
	        		map.put("sex", readResult.get(i).getSex());
	        		map.put("address", readResult.get(i).getAddress());
	        		map.put("position", readResult.get(i).getPosition());
	        		map.put("workDate", readResult.get(i).getWorkDate());
	        		workersService.insertWorkers(map); //添加入库
	        	}
	        }
			return R.ok();
		} catch (Exception e) {
			e.printStackTrace();
			return R.error("数据导入失败,请规范导入模板");
		}
	}
}

返回示例工具类R.java见本博主其他文章有
到这里流程已经整体走完
更多好玩的代码及工具,可微信公众号搜索关注“小逸分享君”领取哦

  • 1
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值