Springboot2模块系列:poi(上传excel保存至数据库)

1 简介

当数据量较大时,向数据库一条条添加数据费时,易出错,使用Excel导入数据较方便,省时省事。

2 Usage

2.1 pom.xml

<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.17</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.17</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
    </dependency>
    <dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>

2.2 数据类

package com.prjname.po;

import java.io.Serializable;

public class Database implements Serializable {
    private String name;
    private String address;
    private String sex;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getAddress() {
        return address;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getSex() {
        return sex;
    }
}

2.3 读取Excel内容工具类

package com.prjname.util;

import java.util.List;
import java.util.ArrayList;
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 java.io.InputStream;
import com.prjname.po.Database;

public class ReadExcelUtil {
    public static List readExcel(MultipartFile file) throws Exception {
        List<Database> excelDatas = new ArrayList<>();
        // 获取文件名
        String fileName = file.getOriginalFilename();
        // 获取文件后缀
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        // 获取文件流
        InputStream ins = file.getInputStream();
        // 文件类
        Workbook wb = null;
        // 文件流读取
        if (suffix.equals("xlsx")) {
            wb = new XSSFWorkbook(ins);
        } else {
            wb = new HSSFWorkbook(ins);
        }
        // 读取文件流中sheet
        Sheet sheet = wb.getSheetAt(0);
        if (null != sheet) {
        	// 读取sheet单元内容,line为行,从第几行开始读取,行编号从0开始
            for (int line = 1; line <= sheet.getLastRowNum(); line++) {
                Database datas = new Database();
                // 每行行内容
                Row row = sheet.getRow(line);
                // 读取行中列内容,列从0开始编号
                String name = row.getCell(0).getStringCellValue();
                String address = row.getCell(1).getStringCellValue();
                String sex = row.getCell(2).getStringCellValue();
                datas.setName(name);
                datas.setAddress(address);
                datas.setSex(sex);
                excelDatas.add(datas);
            }
        }
        return excelDatas;
    }
}

2.4 路由层

package com.prjname.controller;

import com.prjname.service.DatabaseService;
import com.prjname.po.Database;
import com.prjname.util.ReadExcelUtil;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xhwl.util.httpUtil.HttpClientUtil;
import com.xhwl.util.httpsUtil.*;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;

@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/api/v1/databases")
public class DatasController {
    static Logger logger = LoggerFactory.getLogger(DatasController.class);
    @Autowired
    private DatabaseService databaseService;

    @RequestMapping(value = "/import-excel", method = RequestMethod.POST)
    public Map importExcel(@RequestParam(value = "filename") MultipartFile file) {
        Map returnMap = new HashMap();
        try {
            List<Database> returnLi = ReadExcelUtil.readExcel(file);
            for (Database datas : returnLi) {
                databaseService.addDatas(datas);
            }
            returnMap.put("code", 200);
            returnMap.put("msg", "SUCCESS");
            returnMap.put("infos", returnLi);
            return returnMap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        returnMap.put("code", 400);
        returnMap.put("msg", "ERROR");
        returnMap.put("infos", "检查参数");
        return returnMap;
    } 
}

2.5 Postman测试

在这里插入图片描述

图2.1 导入数据请求方式

【参考文献】
[1]https://blog.csdn.net/qq_37231511/article/details/93756623

EasyExcel是一个非常实用的Java库,用于读取和写入Excel文件,支持流式处理大文件。如果你想实现用户上传Excel文件,并将数据保存数据库,你可以按照以下步骤操作: 1. **前端部分**: - 用户通过HTML表单选择或上传Excel文件,可以使用`<input type="file">`元素。 - 事件监听器如`FileReader`或`FormData` API 读取文件内容。 2. **后端部分(Spring MVC 或其他框架)**: - 接收前端上传文件,通常会有一个处理上传文件的Controller方法,例如使用`@PostMapping("/upload")`。 - 将上传文件转换为字节流或`InputStream`,以便EasyExcel读取。 ```java @PostMapping("/upload") public String handleUpload(@RequestParam("file") MultipartFile excelFile) { byte[] content = excelFile.getBytes(); // ... 使用content处理Excel数据 } ``` 3. **使用EasyExcel解析数据**: - 创建`DataReadListener`或`RowMapper`来处理每一行的数据。 - 创建`WorkbookFactory`实例,读取内容并创建`Workbook`。 - 遍历工作簿中的sheet,逐行读取数据。 ```java try (InputStream inputStream = new ByteArrayInputStream(content)) { Workbook workbook = EasyExcel.read(inputStream) .listener(new YourDataReadListener()) .doRead(); } catch (IOException e) { log.error("Error reading Excel file", e); } // YourDataReadListener 类里处理每条记录并将其转换成数据库模型 ``` 4. **保存数据到数据库**: - 对于每一行的数据,将其映射到对应的数据库实体(如有必要,可以使用MyBatis、JPA或其他ORM工具)。 - 执行SQL插入操作或者批量插入。 5. **错误处理与日志记录**: - 检查数据的合法性,处理可能出现的异常,并记录日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值