Import data from Excel table to database through java

One, first. We are using apache's open source framework "poi"

1. Import the corresponding dependency package
2. The framework for connecting to the database can be selected by yourself. The following is mybatis-plus
Maven

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

Gradle

    compile 'org.apache.poi:poi:4.1.2'
    compile 'org.apache.poi:poi-ooxml:4.1.2'
    compile 'org.apache.poi:poi-ooxml-schemas:4.1.2'

Principle of importing data from excel to database.

  1. When we get the excel sheet, our first step should be to read the data information in the excel.
  2. Encapsulate the read data into objects through specific methods.
  3. Each row represents an object, and each column represents each field property in an object.
  4. When there are multiple rows, we need to use List<Object>( Object is the entity class object corresponding to the excel table data ) to access the object
  5. After getting the object array, we can get it by traversing, each object, and then import the object into the database through mybatis

Know the principle, have the idea. We can start working.
1. First get the excel file, we use MultipartFile to accept the file.
2. After getting the file. Obtain an input stream through the file
3. Analyze excel through poi, and forobtain each data in the table through a loop.

demo case: (with notes)

First understand which fields we need to save.
According to the field. Create the corresponding entity class.

entity class

public class BuiPatientInfo{
    
    

private static final long serialVersionUID = 1L;


    /**
     * 患者姓名
     */
    @TableField("patient_name")
        private String patientName;


    /**
     * 加密存储,不可反编译、列表不显示
     */
    @TableField("patient_identity")
        private String patientIdentity;


    /**
     * 就诊卡号
     */
    @TableField("healing_Id")
        private String healingId;


    /**
     * (性别)自动从身份证中截取
     */
    @TableField("patient_sex")
        private Integer patientSex;


    /**
     * (出生年月)自动从身份证中截取
     */
    @TableField("patient_birthDate")
        private LocalDate patientBirthdate;


    /**
     * 其他信息说明
     */
    @TableField("else_Info")
        private String elseInfo;


    /**
     * 创建人ID
     */
    @TableField("create_id")
        private Long createId;


    /**
     * 创建时间
     */
    @TableField("create_time")
        private LocalDateTime createTime;


    /**
     * 最后修改时间
     */
    @TableField("update_time")
        private LocalDateTime updateTime;



    @TableField("patient_state")
    private Integer patientState;

}
  • The following code contains a check to see if the excel file is legal. What year is the excel version?

Data import analysis tool class

package com.mosukj.util;

import com.mosukj.manage.entity.BuiPatientInfo;
import com.spire.ms.System.DateTime;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * @author xjt
 * @version 1.0
 */
public class ReadPatientExcelUtil {
    
    
    //总行数
    private static int totalRows = 0;
    //总条数
    private static int totalCells = 0;
    //错误信息接收器
    private static String errorMsg;

    /**
     * 读EXCEL文件,获取信息集合
     * @return
     */
    public static List<BuiPatientInfo> getExcelInfo(MultipartFile mFile) {
    
    
        String fileName = mFile.getOriginalFilename();//获取文件名
        try {
    
    
            if (!validateExcel(fileName)) {
    
    // 验证文件名是否合格
                return null;
            }
            boolean isExcel2003 = true;// 根据文件名判断文件是2003版本还是2007版本
            if (isExcel2007(fileName)) {
    
    
                isExcel2003 = false;
            }
            List<BuiPatientInfo> userList = createExcel(mFile.getInputStream(), isExcel2003);
            return userList;
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 根据excel里面的内容读取客户信息
     * @param is 输入流
     * @param isExcel2003 excel是2003还是2007版本
     * @return
     * @throws IOException
     */
    public static List<BuiPatientInfo> createExcel(InputStream is, boolean isExcel2003) {
    
    
        try{
    
    
            Workbook wb = null;
            if (isExcel2003) {
    
    // 当excel是2003时,创建excel2003
                wb = new HSSFWorkbook(is);
            } else {
    
    // 当excel是2007时,创建excel2007
                wb = new XSSFWorkbook(is);
            }
            List<BuiPatientInfo> userList = readExcelValue(wb);// 读取Excel里面客户的信息
            return userList;
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 读取Excel里面客户的信息
     * @param wb
     * @return
     */
    private static List<BuiPatientInfo> readExcelValue(Workbook wb) {
    
    
    //默认会跳过第一行标题
        // 得到第一个shell
        Sheet sheet = wb.getSheetAt(0);
        // 得到Excel的行数
        totalRows = sheet.getPhysicalNumberOfRows();
        // 得到Excel的列数(前提是有行数)
        if (totalRows > 1 && sheet.getRow(0) != null) {
    
    
            totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
        }
        List<BuiPatientInfo> userList = new ArrayList<BuiPatientInfo>();
        // 循环Excel行数
        for (int r = 1; r < totalRows; r++) {
    
    
            Row row = sheet.getRow(r);
            if (row == null){
    
    
                continue;
            }
            BuiPatientInfo user = new BuiPatientInfo();
            // 循环Excel的列
            for (int c = 0; c < totalCells-1; c++) {
    
    
                Cell cell = row.getCell(c);
                if (null != cell) {
    
    
                    if (c == 0) {
    
               //第一列
                        //如果是纯数字,将单元格类型转为String
                        if(cell.getCellTypeEnum()  == CellType.NUMERIC){
    
    
                            cell.setCellType(CellType.STRING);
                        }
                        user.setPatientName(cell.getStringCellValue());//将单元格数据赋值给user
                    }
                    else if (c == 1){
    
    
                        if(cell.getCellTypeEnum()  == CellType.NUMERIC){
    
    
                            cell.setCellType(CellType.STRING);
                        }
                        user.setPatientIdentity(cell.getStringCellValue());
                    }
                    else if (c == 2){
    
    
                        if(cell.getCellTypeEnum()  == CellType.NUMERIC){
    
    
                            cell.setCellType(CellType.STRING);
                        }
                        String stringCellValue = cell.getStringCellValue();
                        user.setHealingId(stringCellValue);
                    }
                    else if (c == 3){
    
    
                        if(cell.getCellTypeEnum()  == CellType.NUMERIC){
    
    
                            cell.setCellType(CellType.STRING);
                        }
                        user.setElseInfo(String.valueOf(cell.getStringCellValue()));
                    }
                }
            }
            //将excel解析出来的数据赋值给对象添加到list中
            user.setUpdateTime(LocalDateTime.now());
            user.setPatientBirthdate(IdentityUtil.getPatientBirth(user.getPatientIdentity()));		//拿到身份中好通过已经写好的通过身份证信息获取出生年月工具类
            user.setPatientSex(IdentityUtil.getPatientSex(user.getPatientIdentity()));			//通过省份证号,获取男女信息工具类
            user.setPatientState(1);			//当前实体类字段是固定的,不是excel数据中的。每个对象都可以再遍历完后增加固定属性值
            user.setCreateId(2L);
            user.setCreateTime(LocalDateTime.now());
            // 添加到list
            userList.add(user);
        }
        return userList;
    }
    /**
     * 验证EXCEL文件
     *
     * @param filePath
     * @return
     */
    public static boolean validateExcel(String filePath) {
    
    
        if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {
    
    
            errorMsg = "文件名不是excel格式";
            return false;
        }
        return true;
    }
    // @描述:是否是2003的excel,返回true是2003
    public static boolean isExcel2003(String filePath)  {
    
    
        return filePath.matches("^.+\\.(?i)(xls)$");
    }
    //@描述:是否是2007的excel,返回true是2007
    public static boolean isExcel2007(String filePath)  {
    
    
        return filePath.matches("^.+\\.(?i)(xlsx)$");
    }
}

Call getExcelInfo to get an array of objects.

Then it is easy to import the database

The processing method after I get the array object:

The instance business interface is as follows

@PostMapping("/excelExport")
    public void test(HttpServletRequest request,HttpServletResponse response,@RequestParam(value="file",required = false) MultipartFile file){
    
    
        long startTime = System.currentTimeMillis();
        List<String> list = new ArrayList();
        Map<String,Object> res = new HashMap<>();
        int row=1;
        int rowSuccess=0;
        Integer errorCount=0;
        QueryWrapper<BuiPatientInfo> wrapper;
//        ReadExcel readExcel = new ReadExcel();
        List<BuiPatientInfo> excelInfo = ReadPatientExcelUtil.getExcelInfo(file);
        for (BuiPatientInfo patientInfo : excelInfo) {
    
    
//            System.out.println(patientInfo);
            wrapper=new QueryWrapper<>();
            row++;
            patientInfo.setHealingId(patientInfo.getHealingId());
            wrapper.eq("healing_Id", patientInfo.getHealingId());
            wrapper.ne("patient_state", 9);
            //业务代码,通过患者id查询数据库中式否有该患者,如果已存在,则不保存,跳过该患者
            int patientCount = buiPatientInfoService.getBaseMapper().getPatientCount(wrapper);
            if (patientCount>0){
    
    
                list.add("在第"+row+"行的<"+patientInfo.getHealingId()+">患者已存在!!");
                errorCount++;
            }else {
    
    
                boolean save = buiPatientInfoService.save(patientInfo);
                if (save){
    
    
                    rowSuccess++;
                }
            }
        }
        if (list.size()>0){
    
    
            res.put("log", list);
        }
        res.put("success", "导入数据成功条数:"+rowSuccess);
        res.put("error", "导入数据失败条数:"+errorCount);
        long endTime = System.currentTimeMillis();
        String time = String.valueOf((endTime - startTime) / 1000);
        res.put("time", "导入数据用时:"+time+"秒");
        renderResult(response, res);
    }

renderResult() is an encapsulated tool class that returns front-end data. If you want to know more, please asynchronously return to my other article.
Encapsulated front-end data tool class details (portal)

excel template
insert image description here

The above data obtained from excel and imported into the database is a static import. Dynamically obtained fields are imported into the database, please move to the author's other article links: Dynamically import data to the database . (Note that the excel template is a fixed field, and each column corresponds to the acquisition 1/2/3 in the tool class...)

  1. Return after successful call. Import the line number where the failed data is located, and annotate the name (modified as needed).
  2. Number of entries successfully imported.
  3. import time
  4. Number of successful import and number of failed import

in addition. If necessary, the tools used above to obtain the date of birth and gender based on the ID number. Please inform, may be attached.
If you have any questions, welcome to discuss and exchange in the comment area! Happy to answer.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324117246&siteId=291194637
Recommended