<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Java 使用EasyExcel讀取Excel中多個(gè)sheet方法

      1、讀取數(shù)據(jù)的實(shí)體對(duì)象

      @Data
      public class DemoData {
          private String string;
          private Date date;
          private Double doubleData;
      }

      2、保存數(shù)據(jù)的Listener(監(jiān)聽(tīng)器)

      // 有個(gè)很重要的點(diǎn) DemoDataListener 不能被spring管理,要每次讀取excel都要new,然后里面用到spring可以構(gòu)造方法傳進(jìn)去
      public class DemoDataListener extends AnalysisEventListener<DemoData> {
          private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);
          /**
           * 每隔5條存儲(chǔ)數(shù)據(jù)庫(kù),實(shí)際使用中可以3000條,然后清理list ,方便內(nèi)存回收
           */
          private static final int BATCH_COUNT = 5;
          List<DemoData> list = new ArrayList<DemoData>();
          /**
           * 假設(shè)這個(gè)是一個(gè)DAO,當(dāng)然有業(yè)務(wù)邏輯這個(gè)也可以是一個(gè)service。當(dāng)然如果不用存儲(chǔ)這個(gè)對(duì)象沒(méi)用。
           */
          private DemoDAO demoDAO;
          public DemoDataListener() {
              // 這里是demo,所以隨便new一個(gè)。實(shí)際使用如果到了spring,請(qǐng)使用下面的有參構(gòu)造函數(shù)
              demoDAO = new DemoDAO();
          }
          /**
           * 如果使用了spring,請(qǐng)使用這個(gè)構(gòu)造方法。每次創(chuàng)建Listener的時(shí)候需要把spring管理的類(lèi)傳進(jìn)來(lái)
           *
           * @param demoDAO
           */
          public DemoDataListener(DemoDAO demoDAO) {
              this.demoDAO = demoDAO;
          }
          /**
           * 這個(gè)每一條數(shù)據(jù)解析都會(huì)來(lái)調(diào)用
           *
           * @param data
           *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
           * @param context
           */
          @Override
          public void invoke(DemoData data, AnalysisContext context) {
              LOGGER.info("解析到一條數(shù)據(jù):{}", JSON.toJSONString(data));
              list.add(data);
              // 達(dá)到BATCH_COUNT了,需要去存儲(chǔ)一次數(shù)據(jù)庫(kù),防止數(shù)據(jù)幾萬(wàn)條數(shù)據(jù)在內(nèi)存,容易OOM
              if (list.size() >= BATCH_COUNT) {
                  saveData();
                  // 存儲(chǔ)完成清理 list
                  list.clear();
              }
          }
          /**
           * 所有數(shù)據(jù)解析完成了 都會(huì)來(lái)調(diào)用
           *
           * @param context
           */
          @Override
          public void doAfterAllAnalysed(AnalysisContext context) {
              // 這里也要保存數(shù)據(jù),確保最后遺留的數(shù)據(jù)也存儲(chǔ)到數(shù)據(jù)庫(kù)
              saveData();
              LOGGER.info("所有數(shù)據(jù)解析完成!");
          }
          /**
           * 加上存儲(chǔ)數(shù)據(jù)庫(kù)
           */
          private void saveData() {
              LOGGER.info("{}條數(shù)據(jù),開(kāi)始存儲(chǔ)數(shù)據(jù)庫(kù)!", list.size());
              demoDAO.save(list);
              LOGGER.info("存儲(chǔ)數(shù)據(jù)庫(kù)成功!");
          }
      }

      3、讀取多個(gè)Sheet的示例代碼

      /**
       * 讀多個(gè)或者全部sheet,這里注意一個(gè)sheet不能讀取多次,多次讀取需要重新讀取文件
       * <p>
       * 1. 創(chuàng)建excel對(duì)應(yīng)的實(shí)體對(duì)象 參照{(diào)@link DemoData}
       * <p>
       * 2. 由于默認(rèn)異步讀取excel,所以需要?jiǎng)?chuàng)建excel一行一行的回調(diào)監(jiān)聽(tīng)器,參照{(diào)@link DemoDataListener}
       * <p>
       * 3. 直接讀即可
       */
      @Test
      public void repeatedRead() {
          String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
          // 讀取全部sheet
          // 這里需要注意 DemoDataListener的doAfterAllAnalysed 會(huì)在每個(gè)sheet讀取完畢后調(diào)用一次。然后所有sheet都會(huì)往同一個(gè)DemoDataListener里面寫(xiě)
          EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll();
          // 讀取部分sheet
          fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
          ExcelReader excelReader = EasyExcel.read(fileName).build();
          // 這里為了簡(jiǎn)單 所以注冊(cè)了 同樣的head 和Listener 自己使用功能必須不同的Listener
          ReadSheet readSheet1 =
              EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
          ReadSheet readSheet2 =
              EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
          // 這里注意 一定要把sheet1 sheet2 一起傳進(jìn)去,不然有個(gè)問(wèn)題就是03版的excel 會(huì)讀取多次,浪費(fèi)性能
          excelReader.read(readSheet1, readSheet2);
          // 這里千萬(wàn)別忘記關(guān)閉,讀的時(shí)候會(huì)創(chuàng)建臨時(shí)文件,到時(shí)磁盤(pán)會(huì)崩的
          excelReader.finish();
      }

       

      posted @ 2022-03-11 16:53  黃進(jìn)廣寒  閱讀(10616)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产亚洲精品成人aa片新蒲金| 蜜臀午夜一区二区在线播放| 午夜福利精品国产二区| 亚洲成人av在线系列| 国产精品v欧美精品∨日韩| 免费a级毛片18以上观看精品| 色综合中文综合网| 九九热精彩视频在线免费| 黄色特级片一区二区三区| 麻豆精品一区二区视频在线| 日本a在线播放| 在线a亚洲v天堂网2018| 国产av丝袜熟女一二三| 亚洲一区二区av观看| 秋霞电影院午夜无码免费视频| 欧美人与性动交α欧美精品| 性色av一区二区三区v视界影院| 亚洲www永久成人网站| 亚洲中文字幕无码久久精品1| 国产精品中文字幕观看| 亚洲精品一区二区美女| 免费看的一级黄色片永久| 亚洲午夜精品久久久久久抢| 国产乱妇无乱码大黄aa片| 高清破外女出血AV毛片| 灵宝市| 国产亚洲亚洲国产一二区| 亚洲VA中文字幕无码久久| 亚洲国产午夜福利精品| 亚洲精品日韩中文字幕| 久热这里只有精品视频六| 91中文字幕一区在线| 国产成人精品无码专区| 巴青县| av中文字幕国产精品| 狠狠躁夜夜躁无码中文字幕 | 国产午夜鲁丝片av无码| 午夜国产精品福利一二| 亚洲AV乱码毛片在线播放| 亚洲国产精品乱码一区二区| 99久久国产综合精品成人影院|