使用Excel4J获取Excel文件中的数据

本文介绍了如何利用Excel4J库在Java中读取Excel文件。内容包括readExcel2List方法,它在遇到空单元格时会跳过并取后续单元格数据,适合完整数据的Excel文件;以及readExcel2Objects方法,适用于将Excel数据映射到UserModel对象,通过@ExcelField注解匹配列标题。调用接口时,需以POST请求,文件作为form-data提交。

ExcelUtils所需要的pom依赖如下,该类存在于com.github.crab2died下:

<dependency>
    <groupId>com.github.crab2died</groupId>
    <artifactId>Excel4J</artifactId>
    <version>3.0.0</version>
</dependency>

1.readExcel2List

特别提示:使用该组件(3.0.0版本)的 readExcel2List 方法进行数据内容读取,会遇到当单元格为空(null)的时候会自动跳过该单元格(空字符串是可以正常读取到的),去取与其同行的下一个单元格的数据内容,因此该方法适合读取数据内容都是完整的Excel文件

 List<List<String>> readExcel2List(InputStream is, int offsetLine, int limitLine, int sheetIndex)

 is:表示Excel文件的输入流

 offsetLine:获取数据的偏移量行数,取值从0开始(表示第一行),1表示第二行,依次类推

 limitLine:限制行数,表示获取偏移量行数后面的多少行数据,取值为自然数(从0开始)

 sheetIndex:表示第几个sheet,取值为正整数

import org.springframework.web.multipart.MultipartFile;
import lombok.extern.slf4j.Slf4j;
import com.github.crab2died.ExcelUtils;
import java.io.InputStream;
import java.util.*;

@RestController
@Slf4j
public class DemoController {

    /**
     * 从Excel文件中获取数据进行业务处理
     */
    @PostMapping("/import")
    public void import(MultipartFile excelFile) {
        try{
            InputStream is = excelFile.getInputStream();
            //从文件流is中获取第一个sheet分页第2行到14320行的数据,并将每一行的数据转换为List<String>,最终将所有的行数据存储在List<List<String>>中
            List<List<String>> list= ExcelUtils.getInstance().readExcel2List(is,1,14318,1);
            for(List<String> stringList:list){
                //获取第一列的值
                String taxVouNo=stringList.get(0);
                //获取第三列的值
                String remark=stringList.get(2);
                //todo:相关的业务处理
            }
        }catch (Exception e){
            log.error("从Excel文件中获取数据进行业务处理出现异常:",e);
        }
    }
}

前端在调用该接口时可以以post请求方式,请求体以form-data形式,key为excelFile,value为excel文件,类型为File进行调用

2.readExcel2Objects

例如当前Excel文件中的数据内容如下所示,每一行记录都是UserModel类中属性字段的值

那么我们可以通过 readExcel2Objects 方法来获取Excel文件中的数据:

List<UserModel> list = ExcelUtils.getInstance().readExcel2Objects(is, UserModel.class, 0, 10000, 0);

第一步:在UserModel实体类中的属性字段中添加 @ExcelField 注解并且其 title 的值和Excel第一行的列字段保持一致

import com.github.crab2died.annotation.ExcelField;
import lombok.Data;

@Data
public class UserModel {
    @ExcelField(title = "姓名")
    private String name;
    @ExcelField(title = "性别")
    private String sex;
    @ExcelField(title = "年龄")
    private Integer age;
    @ExcelField(title = "地址")
    private String address;
}

第二步:定义IUserService接口及UserServiceImpl实现类

import org.springframework.web.multipart.MultipartFile;

public interface IUserService {

    void importInfo(MultipartFile multipartfile) throws Exception;
}
import cn.hutool.json.JSONUtil;
import com.bc.model.UserModel;
import com.bc.service.IUserService;
import com.github.crab2died.ExcelUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.List;

@Slf4j
@Service
public class UserServiceImpl implements IUserService {

    @Override
    public void importInfo(MultipartFile multipartfile) throws Exception{
        InputStream is = multipartfile.getInputStream();
        List<UserModel> list = ExcelUtils.getInstance().readExcel2Objects(is, UserModel.class, 0, 10000, 0);
        for (UserModel userModel : list) {
            System.out.println(JSONUtil.toJsonStr(userModel));
        }
    }
}

第三步:构建UserController

import com.bc.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    IUserService userService;

    @PostMapping(value = "/importInfo")
    public void importInfo(MultipartFile multipartfile)throws Exception{
        userService.importInfo(multipartfile);
    }
}

接着再以post请求方式调用该接口,请求体以form-data形式,key为multipartfile,value为excel文件,类型为File。该接口调用成功以后,后台打印内容为:

{"address":"北京","sex":"男","name":"张三","age":18}
{"address":"上海","sex":"男","name":"李四","age":19}
{"address":"深圳","sex":"男","name":"王五","age":20}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值