Excel导入导出(POI)

通过 EasyPOI 进行快速的导入导出

  • EasyPOI 是一个封装的工具类
简单的使用
  1. 导入EasyPOI依赖
		<!--EasyPOI-->
		 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.0-beta2</version>
        </dependency>
        
		<!--测试依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>
		<!--JSON依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.73</version>
        </dependency>
		<!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
  1. 给要导出的数据对应的实体类加注解(根据Excel表的字段边编写对应的实体类)
  • ExcelProperty:指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。也可以不写,默认第一个字段就是index=0,以此类推。注意,要么全部不写,要么全部用index,要么全部用名字去匹配。
  • ExcelIgnore:默认所有字段都会和excel去匹配,加了这个注解会忽略该字段。
  • DateTimeFormat:日期转换,用String去接收excel日期格式的数据会调用这个注解。里面的value参照java.text.SimpleDateFormat。
  • NumberFormat:数字转换,用String去接收excel数字格式的数据会调用这个注解。里面的value参照java.text.DecimalFormat。
  • ExcelIgnoreUnannotated:默认不加ExcelProperty 的注解的都会参与读写,加了不会参与。
写数据
  • 创建实体类
@Data
public class User {

    @ExcelProperty("字符串标题")
    private String string;

    @ExcelProperty("日期标题")
    private Date date;

    @ExcelProperty("数字标题")
    private Double doubleData;

    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;
}
  • 数据导出
public class EasyExcelTest {
	/**
     * 这里我们使用模拟数据、真实中更具前端或数据库查询出真是的数据
     */
    private List<User> usersData() {
        List<User> list = new ArrayList<User>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setString("字符串" + i);
            user.setDate(new Date());
            user.setDoubleData(0.56);
            list.add(user);
        }
        return list;
    }

    /**
     * 最简单的写、利用模拟的list数据进行数据导出
     * <p>1. 创建excel对应的实体对象 参照{@link User}
     * <p>2. 直接写即可
     */
    @Test
    public void simpleWrite() {
        //指定文件的输出位置和文件名字
        String fileName = "F://user.xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为:userdata 然后文件流会自动关闭
        EasyExcel.write(fileName, User.class).sheet("userdata").doWrite(usersData());
    }
}
读数据
  • 配置一个监听器
/**
 * 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
 */
public class UserDataListener extends AnalysisEventListener<User>{
    private static final Logger LOGGER = LoggerFactory.getLogger(UserDataListener.class);

    // 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
    private static final int BATCH_COUNT = 5;
    List<User> list = new ArrayList<User>();

    /**
     * 读取数据时会执行的方法
     *
     */
    @Override
    public void invoke(User user, AnalysisContext analysisContext) {
    	// 把读到的数据打印到控制台
        System.out.println(user);
        list.add(user);
        // 达到BATCH_COUNT(5条)了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            /**
             * 在这里需要调用DAO层实现把数据存储到数据库中
             */
            // 存储完成清理 list
            list.clear();
        }
    }

    /**
     * 读取完成时执行的方法
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        /**
         * 这里也要保存数据,确保最后遗留的数据也存储到数据库
         */
        LOGGER.info("所有数据解析完成!");
    }
}
  • 数据写入
public class EasyExcelTest {
    /**
     * 最简单的读
     * <p>1. 创建excel对应的实体对象 参照{@link User}
     * <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UserDataListener}
     * <p>3. 直接读即可
     */
    @Test
    public void simpleRead() {
        // 有个很重要的点 UserDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
        // 被读取的文件的路径
        String fileName = "F://user.xlsx";
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        EasyExcel.read(fileName, User.class , new UserDataListener()).sheet().doRead();
    }
}

一些复杂的操作请参照文档:EasyExcel

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值