(拿去CV就能用!)EasyExcel读写Excel详细流程(图解+代码)

导入EasyExcel依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.6</version>
</dependency>

读操作

public class Test {
    public static void main(String[] args) {
        //读取文件
        //创建ExcelReaderBuilder实例
        ExcelReaderBuilder readerBuilder = EasyExcel.read();
        //获取文件对象
        readerBuilder.file("D:\\java\\用户数据表.xls");
        //指定sheet
        readerBuilder.sheet("用户数据表");
        //自动关闭输入流
        readerBuilder.autoCloseStream(true);
        //设置Excel文件格式
        readerBuilder.excelType(ExcelTypeEnum.XLS);
        //注册监听器进行数据的解析
        readerBuilder.registerReadListener(new AnalysisEventListener<Map<Integer,String>>() {

            @Override
            public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
                Set<Integer> keySet = integerStringMap.keySet();
                Iterator<Integer> iterator = keySet.iterator();
                while (iterator.hasNext()) {
                    Integer key = iterator.next();
                    System.out.print(key + ":" + integerStringMap.get(key)+", ");
                }
                System.out.println("");
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                //通知文件读取完毕
                System.out.println("数据读取完毕");
            }
        });
        //构建读取器
        ExcelReader reader = readerBuilder.build();
        //读取数据
        reader.readAll();
        //读取完毕
        reader.finish();
    }
}

上述代码可以优化简洁点

public class ExcelTest {
    public static void main(String[] args) {
        List<Map<Integer,String>> list = new LinkedList<>();
        EasyExcel.read("D:\\java\\用户数据表.xls")
                .sheet()
                .registerReadListener(new AnalysisEventListener<Map<Integer,String>>() {

                    @Override
                    public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
                        list.add(integerStringMap);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("数据读取完毕");
                    }
                }).doRead();
        for (Map<Integer, String> integerStringMap : list) {
            Set<Integer> keySet = integerStringMap.keySet();
            Iterator<Integer> iterator = keySet.iterator();
            while (iterator.hasNext()) {
                Integer key = iterator.next();
                System.out.print(key + ":" + integerStringMap.get(key)+", ");
            }
            System.out.println("");
        }
    }
}

重点:映射成指定对象,需要创建实体类,使用 @ExcelProperty 注解完成实体类成员变量和 Excel 字段的映射。

实体类对象

@TableName("card_info")
@Data
@AllArgsConstructor
@NoArgsConstructor
@HeadStyle(horizontalAlignment = HorizontalAlignment.CENTER,verticalAlignment = VerticalAlignment.CENTER, shrinkToFit = true)//标题样式,垂直水平居中
@HeadFontStyle(fontName = "微软雅黑",fontHeightInPoints = 11,bold = false)//表头字体样式
@HeadRowHeight(value = 35)//表头行高
@ContentFontStyle(fontName = "微软雅黑",fontHeightInPoints = 11)//内容字体样式
@ContentRowHeight(value = 30)//内容行高
@ContentStyle(horizontalAlignment = HorizontalAlignment.CENTER,verticalAlignment = VerticalAlignment.CENTER, wrapped = true)//内容样式,垂直水平居中
public class CardInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    @ExcelIgnore
    private Long id;

    /**
     * 卡片id
     */
    @ExcelProperty("cardId")
    private String cardId;

    /**
     * 真实姓名
     */
    @ExcelProperty("name")
    private String name;

    /**
     * 年龄
     */
    @ExcelProperty("age")
    private Integer age;

    /**
     * 职业
     */
    @ExcelProperty("occupation")

    private String occupation;

    /**
     * 电话号码
     */
    @ExcelProperty("phone")
    private String phone;

    /**
     * 地址
     */
    @ExcelProperty("address")
    private String address;

    /**
     * 邮箱
     */
    @ExcelProperty("email")
    private String email;

    /**
     * 公司
     */
    @ExcelProperty("company")
    private String company;

    /**
     * 0:未删除1:逻辑删除2:真正删除
     */
    @ExcelIgnore
    private Integer delFlag;

    /**
     * 用户id(不是必要)
     */
    @ExcelProperty("userId")
    private String userId;

    /**
     * 名片曝光率
     */
    /**不显示字段注解*/
    @ExcelIgnore
    private Long exposureValue;

    /**
     * 标签集合
     */
    @TableField(value="tag_list",typeHandler = FastjsonTypeHandler.class)
    @ExcelProperty("tagList")
    private String tagList;

    /**
     * 名片用户的简介
     */
    @ExcelProperty("personalProfile")
    private String personalProfile;

}

@HeadStyle / @ContentStyle 设置标题 / 内容样式

@HeadFontStyle 定制标题字体格式 

@ContentRowHeight 设置行高

@ColumnWith 设置列宽 , 作用于成员属性 

@ExcelIgnore 不将该字段转换成Excel

@ExcelProperty("xxx")指定列名的映射 

解析 Excel 文件的时候直接指定实体类即可。

public class ExcelTest {
    public static void main(String[] args) {
        List<ExcelData> list = new LinkedList<>();
        EasyExcel.read("D:\\java\\用户数据表.xls")
                .head(ExcelData.class)
                .sheet()
                .registerReadListener(new AnalysisEventListener<ExcelData>() {

                    @Override
                    public void invoke(ExcelData excelData, AnalysisContext analysisContext) {
                        list.add(excelData);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("数据读取完毕");
                    }
                }).doRead();
        for (ExcelData excelData : list) {
            System.out.println(excelData);
        }
    }
}

结果:


写操作 

public class ExcelTest {
    public static void main(String[] args) {
        List<ExcelData> list = parseData();
        //list写入Excel文件
        EasyExcel.write("D:\\java\\用户数据表_副本.xls")
                .head(ExcelData.class)
                .excelType(ExcelTypeEnum.XLS)
                .sheet("用户数据表")
                .doWrite(list);
    }

    public static List<ExcelData> parseData(){
        List<ExcelData> list = new LinkedList<>();
        // 写的数据都封装进list中
        return list;
    }
}

其实这些都是可以直接CV的,在映射封装类上以及输入输出位置上自定义就好

工具类,直接CV吧

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.apache.poi.ss.formula.functions.T;
import java.util.LinkedList;
import java.util.List;

/**
 * @author wzx
 */
public class ExcelUtil {


    /**
     * 封装Excel中的数据到指定的实体类中
     * @param typeClass 指定的实体类的字节码类别
     * @param readPath Excel的文件路径
     * @return 指定的实体类对象的集合(每个对象代表每一条数据)
     */
    public static List<T> getDataFromExcel(Class<T> typeClass , String readPath){
        List<T> list = new LinkedList<>();
        EasyExcel.read(readPath)
                .head(typeClass)
                .sheet()
                .registerReadListener(new AnalysisEventListener<T>() {

                    @Override
                    public void invoke(T excelData, AnalysisContext analysisContext) {
                        list.add(excelData);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("数据读取完毕");
                    }
                }).doRead();
        return list;
    }

    /**
     * 将封装好的数据写入Excel中
     * @param list 写入的数据集合
     * @param writePath 写入的Excel文件的路径
     * @param sheet excel表中生成的sheet表名
     * @param excelType 插入的excel的类别,有xls、xlsx两种
     */
    public static <T> void saveDataToExcel(List<T> list, String writePath, String sheet, ExcelTypeEnum excelType, Class<T> clazz) {
        // 写入Excel文件
        EasyExcel.write(writePath)
                .head(clazz)
                .excelType(excelType)
                .sheet(sheet)
                .doWrite(list);
    }
}
  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这里是SpringBoot+Mybatis-plus整合easyExcel批量导入Excel到数据库+导出Excel的方法。 1. 添加依赖 在 pom.xml 文件中添加以下依赖: ```xml <!-- easyExcel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version> </dependency> <!-- mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> ``` 2. 创建实体类 创建一个实体类,用于映射 Excel 表格中的数据。 ```java @Data public class User { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; @ExcelProperty("性别") private String gender; } ``` 3. 创建Excel读取器 创建一个 Excel 读取器,用于读取 Excel 表格中的数据,并将数据存储到数据库中。 ```java @Component public class ExcelReader { @Autowired private UserService userService; /** * 读取 Excel 表格中的数据,并将数据存储到数据库中 */ public void readExcel(String fileName) { EasyExcel.read(fileName, User.class, new UserExcelListener()).sheet().doRead(); } /** * 用户Excel监听器 */ private class UserExcelListener extends AnalysisEventListener<User> { /** * 每读取一行数据,就会调用该方法 */ @Override public void invoke(User user, AnalysisContext context) { userService.save(user); } /** * 读取完整个 Excel 表格后,会调用该方法 */ @Override public void doAfterAllAnalysed(AnalysisContext context) { // do nothing } } } ``` 4. 创建Excel导出器 创建一个 Excel 导出器,用于从数据库中获取数据,并将数据导出到 Excel 表格中。 ```java @Component public class ExcelWriter { @Autowired private UserService userService; /** * 将用户数据导出到 Excel 表格中 */ public void writeExcel(String fileName) { List<User> userList = userService.list(); EasyExcel.write(fileName, User.class).sheet().doWrite(userList); } } ``` 5. 创建Controller 创建一个 Controller,用于接收前端请求,并调用相应的方法处理请求。 ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private ExcelReader excelReader; @Autowired private ExcelWriter excelWriter; /** * 批量导入用户数据 */ @PostMapping("/import") public void importExcel(@RequestParam("file") MultipartFile file) throws IOException { excelReader.readExcel(file.getInputStream()); } /** * 导出用户数据到Excel */ @GetMapping("/export") public void exportExcel(HttpServletResponse response) throws IOException { String fileName = "用户信息.xlsx"; response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); response.setContentType("application/vnd.ms-excel"); excelWriter.writeExcel(response.getOutputStream()); } } ``` 6. 配置文件 在 application.yml 文件中添加数据库连接信息。 ```yaml spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: root mybatis-plus: mapper-locations: classpath:/mapper/*.xml type-aliases-package: com.example.demo.domain ``` 7. 测试 启动应用程序,并在浏览器中访问以下地址: - http://localhost:8080/user/export :导出 Excel 表格 - http://localhost:8080/user/import :导入 Excel 表格 以上就是 SpringBoot+Mybatis-plus整合easyExcel批量导入Excel到数据库+导出Excel 的方法了,希望能帮到你。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学徒630

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值