当前位置:   article > 正文

Apache POI、EasyPoi、EasyExcel

Apache POI、EasyPoi、EasyExcel

目录

​编辑 (一)Apache PoI 使用

 (二)EasyPoi使用

 (三)EasyExcel使用

 写

最简单的读​

最简单的读的excel示例​

最简单的读的对象​


 (一)Apache PoI 使用

 (二)EasyPoi使用

 (三)EasyExcel使用

官方文档:

写Excel | Easy Excel 官网

 写

使用注解在字段上进行标识

使用最简单的方法二即可

  1. /**
  2. * 最简单的写
  3. * <p>
  4. * 1. 创建excel对应的实体对象 参照{@link DemoData}
  5. * <p>
  6. * 2. 直接写即可
  7. */
  8. @Test
  9. public void simpleWrite() {
  10. // 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入
  11. // 写法1 JDK8+
  12. // since: 3.0.0-beta1
  13. String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
  14. // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
  15. // 如果这里想使用03 则 传入excelType参数即可
  16. EasyExcel.write(fileName, DemoData.class)
  17. .sheet("模板")
  18. .doWrite(() -> {
  19. // 分页查询数据
  20. return data();
  21. });
  22. // 写法2
  23. fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
  24. // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
  25. // 如果这里想使用03 则 传入excelType参数即可
  26. EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
  27. // 写法3
  28. fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
  29. // 这里 需要指定写用哪个class去写
  30. try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
  31. WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
  32. excelWriter.write(data(), writeSheet);
  33. }
  34. }

最简单的读

最简单的读的excel示例

最简单的读的对象

  1. @Getter
  2. @Setter
  3. @EqualsAndHashCode
  4. public class DemoData {
  5. private String string;
  6. private Date date;
  7. private Double doubleData;
  8. }

读的时候涉及到一个监听器对象,所有读的时候进行的后续操作一般都放在监听器中

自定义的监听器代码,

阿里巴巴要:因为监听器不受spring管理,所以你要想在监听器中操作数据库,必须按照人家要求使用构造方法传入

  1. // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
  2. //这个自定义监听器的功能是定义了一个100的缓冲区,没当list达到了100则写入数据库
  3. @Slf4j // 这个泛型填读取对象的实体,比如excel 表里对应的实体是user,那这个地方就填user
  4. public class DemoDataListener implements ReadListener<DemoData> {
  5. /**
  6. * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
  7. */
  8. private static final int BATCH_COUNT = 100;
  9. /**
  10. * 缓存的数据
  11. */
  12. private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
  13. /**
  14. * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
  15. */
  16. private DemoDAO demoDAO;
  17. public DemoDataListener() {
  18. // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
  19. demoDAO = new DemoDAO();
  20. }
  21. /**
  22. * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
  23. *
  24. * @param demoDAO
  25. */
  26. public DemoDataListener(DemoDAO demoDAO) {
  27. this.demoDAO = demoDAO;
  28. }
  29. /**
  30. * 这个每一条数据解析都会来调用
  31. *
  32. * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
  33. * @param context
  34. */
  35. @Override
  36. public void invoke(DemoData data, AnalysisContext context) {
  37. log.info("解析到一条数据:{}", JSON.toJSONString(data));
  38. cachedDataList.add(data);
  39. // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
  40. if (cachedDataList.size() >= BATCH_COUNT) {
  41. saveData();
  42. // 存储完成清理 list
  43. cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
  44. }
  45. }
  46. /**
  47. * 所有数据解析完成了 都会来调用,上面没达到100的,没有触发保存数据库
  48. 最后就执行这个方法,把遗留的存进去
  49. *
  50. * @param context
  51. */
  52. @Override
  53. public void doAfterAllAnalysed(AnalysisContext context) {
  54. // 这里也要保存数据,确保最后遗留的数据也存储到数据库
  55. saveData();
  56. log.info("所有数据解析完成!");
  57. }
  58. /**
  59. * 加上存储数据库
  60. */
  61. private void saveData() {
  62. log.info("{}条数据,开始存储数据库!", cachedDataList.size());
  63. demoDAO.save(cachedDataList);
  64. log.info("存储数据库成功!");
  65. }
  66. }

 最简单的读

想省事不自定义监听器对象可以直接参考写法一

  1. /**
  2. * 最简单的读
  3. * <p>
  4. * 1. 创建excel对应的实体对象 参照{@link DemoData}
  5. * <p>
  6. * 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
  7. * <p>
  8. * 3. 直接读即可
  9. */
  10. @Test
  11. public void simpleRead() {
  12. // 写法1:JDK8+ ,不用额外写一个DemoDataListener
  13. // since: 3.0.0-beta1
  14. String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
  15. // 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行
  16. // 具体需要返回多少行可以在`PageReadListener`的构造函数设置
  17. //如果使用spring,并且想保存到数据库,这个泛型填service 或者 dao,从而调用数据库
  18. EasyExcel.read(fileName, DemoData.class, new PageReadListener<DemoData>(dataList -> {
  19. for (DemoData demoData : dataList) {
  20. log.info("读取到一条数据{}", JSON.toJSONString(demoData));
  21. }
  22. })).sheet().doRead();
  23. // 写法2:
  24. // 匿名内部类 不用额外写一个DemoDataListener
  25. fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
  26. // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
  27. EasyExcel.read(fileName, DemoData.class, new ReadListener<DemoData>() {
  28. /**
  29. * 单次缓存的数据量
  30. */
  31. public static final int BATCH_COUNT = 100;
  32. /**
  33. *临时存储
  34. */
  35. private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
  36. @Override
  37. public void invoke(DemoData data, AnalysisContext context) {
  38. cachedDataList.add(data);
  39. if (cachedDataList.size() >= BATCH_COUNT) {
  40. saveData();
  41. // 存储完成清理 list
  42. cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
  43. }
  44. }
  45. @Override
  46. public void doAfterAllAnalysed(AnalysisContext context) {
  47. saveData();
  48. }
  49. /**
  50. * 加上存储数据库
  51. */
  52. private void saveData() {
  53. log.info("{}条数据,开始存储数据库!", cachedDataList.size());
  54. log.info("存储数据库成功!");
  55. }
  56. }).sheet().doRead();
  57. // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
  58. // 写法3:
  59. fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
  60. // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
  61. EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
  62. // 写法4
  63. fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
  64. // 一个文件一个reader
  65. try (ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build()) {
  66. // 构建一个sheet 这里可以指定名字或者no
  67. ReadSheet readSheet = EasyExcel.readSheet(0).build();
  68. // 读取一个sheet
  69. excelReader.read(readSheet);
  70. }
  71. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/794828
推荐阅读
相关标签
  

闽ICP备14008679号