乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Alibaba EasyExcel初體驗(yàn)

       小樣樣樣樣樣樣 2021-04-29

      簡(jiǎn)介

      EasyExcel是一個(gè)基于Java的簡(jiǎn)單、省內(nèi)存的讀寫Excel的開源項(xiàng)目。在盡可能節(jié)約內(nèi)存的情況下支持讀寫百M(fèi)的Excel。相對(duì)于Apache POI來(lái)說(shuō),EasyExcel是從磁盤上一行行的讀取數(shù)據(jù),然后逐個(gè)解析,避免將大量數(shù)據(jù)加載到內(nèi)存從而導(dǎo)致OOM。

      相關(guān)依賴:

      <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>easyexcel</artifactId>
      <version>2.2.6</version>
      </dependency>
      
      <!-- 可選 -->
      <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.12</version>
      <scope>provided</scope>
      </dependency>
      

      Excel導(dǎo)入

      需要導(dǎo)入的數(shù)據(jù):

      Model類:

      
      @Data
      public class SchoolData {
      
          @ExcelProperty(value = "地址")
          private String address;
      
          @ExcelProperty(value = "學(xué)校名稱")
          private String schoolName;
      
          @ExcelProperty(value = "郵政編碼")
          private String postcode;
      
          @ExcelProperty(value = "收集時(shí)間")
          private Date collectDate;
      }
      

      使用@ExcelProperty注解時(shí),可以使用兩種方式將數(shù)據(jù)列和屬性進(jìn)行綁定:

      1. 通過(guò)value指定名稱,將名稱對(duì)應(yīng)的excel列的數(shù)據(jù)綁定到屬性。
      2. 通過(guò)index指定下標(biāo),將下標(biāo)對(duì)應(yīng)的excel列的數(shù)據(jù)綁定到屬性。

      在不使用@ExcelProperty注解時(shí),默認(rèn)Model類屬性和excel列數(shù)據(jù)按照先后順序進(jìn)行綁定的。

      監(jiān)聽器:

      import com.alibaba.excel.context.AnalysisContext;
      import com.alibaba.excel.event.AnalysisEventListener;
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Map;
      
      public class SchoolDataListener extends AnalysisEventListener<SchoolData> {
      
          List<SchoolData> schoolDataList = new ArrayList<>();
      
          //需要傳參時(shí),通過(guò)構(gòu)造方法傳進(jìn)來(lái)
          public SchoolDataListener() {
          }
      
          /**
           * 每解析一行數(shù)據(jù)都會(huì)進(jìn)行調(diào)用
           */
          @Override
          public void invoke(SchoolData data, AnalysisContext context) {
              //一般數(shù)據(jù)量大的時(shí)候應(yīng)該分批處理,防止數(shù)據(jù)全部加載到內(nèi)存,導(dǎo)致OOM。
              schoolDataList.add(data);
          }
      
          /**
           * 數(shù)據(jù)全部解析完成時(shí)調(diào)用
           */
          @Override
          public void doAfterAllAnalysed(AnalysisContext context) {
              System.out.println("數(shù)據(jù)讀取完畢:");
              schoolDataList.stream().forEach(System.out::println);
          }
      
          /**
           * 每解析一行表頭都會(huì)進(jìn)行調(diào)用
           */
          @Override
          public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
              System.out.println("表頭:");
              headMap.forEach((k, v) -> System.out.println(v));
              System.out.println();
          }
      }
      
      

      導(dǎo)入測(cè)試:

      導(dǎo)入有以下兩種寫法,一般使用簡(jiǎn)寫的方式就行,當(dāng)需要實(shí)現(xiàn)復(fù)雜的功能時(shí)可能會(huì)需要另外一種復(fù)雜的寫法。

      @Test
      public void importExcel() {
      ExcelReader excelReader = null;
      try {
      excelReader = EasyExcel.read("F:\\測(cè)試數(shù)據(jù).xlsx", SchoolData.class, new SchoolDataListener()).build();
      ReadSheet readSheet = EasyExcel.readSheet(0).build();
      excelReader.read(readSheet);
      } finally {
      if (excelReader != null) {
      // 這里千萬(wàn)別忘記關(guān)閉,讀的時(shí)候會(huì)創(chuàng)建臨時(shí)文件,到時(shí)磁盤會(huì)崩的
      excelReader.finish();
      }
      }
      }
      
      @Test
      public void importExcelSimple() {
      //sheet() 默認(rèn)讀取第一個(gè)sheet
      EasyExcel.read("F:\\測(cè)試數(shù)據(jù).xlsx", SchoolData.class, new SchoolDataListener()).sheet().doRead();
      }
      

      輸出結(jié)果:

      表頭:
      學(xué)校名稱
      地址
      郵政編碼
      收集時(shí)間
      
      數(shù)據(jù)讀取完畢:
      SchoolData(address=晉寧縣古城鎮(zhèn)舊寨村  , schoolName=晉寧縣古城鎮(zhèn)古城中學(xué), postcode=650604, collectDate=Sun Jan 05 00:00:00 CST 2020)
      SchoolData(address=云南省昆明市晉寧縣二街鄉(xiāng)老高村  , schoolName=晉寧縣二街中學(xué), postcode=650608, collectDate=Mon Jan 06 00:00:00 CST 2020)
      SchoolData(address=云南省昆明市晉寧縣晉城鎮(zhèn)寺林街  , schoolName=晉寧縣晉城中學(xué), postcode=650605, collectDate=Tue Jan 07 00:00:00 CST 2020)
      SchoolData(address=云南省晉寧縣六街鄉(xiāng)中學(xué)  , schoolName=晉寧縣六街中學(xué), postcode=650609, collectDate=Wed Jan 08 00:00:00 CST 2020)
      SchoolData(address=云南省昆明市晉寧縣新街鄉(xiāng)文河村  , schoolName=晉寧縣新街中學(xué), postcode=650606, collectDate=Thu Jan 09 00:00:00 CST 2020)
      SchoolData(address=晉寧縣中和鄉(xiāng)普照路  , schoolName=晉寧縣中和中學(xué), postcode=650600, collectDate=Fri Jan 10 00:00:00 CST 2020)
      SchoolData(address=云南省昆明市晉寧縣上蒜鄉(xiāng)上蒜中學(xué)  , schoolName=晉寧縣上蒜鄉(xiāng)上蒜中學(xué), postcode=650607, collectDate=Sat Jan 11 00:00:00 CST 2020)
      SchoolData(address=云南省昆明市晉寧縣化樂(lè)鄉(xiāng)化樂(lè)村  , schoolName=晉寧縣化樂(lè)鄉(xiāng)中學(xué), postcode=650611, collectDate=Sun Jan 12 00:00:00 CST 2020)
      SchoolData(address=晉寧縣夕陽(yáng)鄉(xiāng)夕陽(yáng)街夕陽(yáng)民族中學(xué)  , schoolName=晉寧縣夕陽(yáng)民族中學(xué), postcode=650603, collectDate=Mon Jan 13 00:00:00 CST 2020)
      SchoolData(address=云南省昆明市晉寧縣寶峰鎮(zhèn)古城村委會(huì)小古城村  , schoolName=晉寧縣寶峰鎮(zhèn)寶峰中學(xué), postcode=650601, collectDate=Tue Jan 14 00:00:00 CST 2020)
      SchoolData(address=晉寧縣雙河鄉(xiāng)椿樹營(yíng)  , schoolName=晉寧縣雙河民族中學(xué), postcode=650602, collectDate=Wed Jan 15 00:00:00 CST 2020)
      SchoolData(address=昆明市富民縣永定鎮(zhèn)環(huán)城南路7號(hào)永定中學(xué)  , schoolName=富民縣永定中學(xué), postcode=650400, collectDate=Thu Jan 16 00:00:00 CST 2020)
      SchoolData(address=富民縣永定鎮(zhèn)大西山村  , schoolName=富民縣勤勞中學(xué), postcode=650400, collectDate=Fri Jan 17 00:00:00 CST 2020)
      SchoolData(address=富民縣大營(yíng)鎮(zhèn)大營(yíng)街16號(hào)  , schoolName=富民縣大營(yíng)中學(xué), postcode=650400, collectDate=Sat Jan 18 00:00:00 CST 2020)
      SchoolData(address=云南省昆明市羅免鄉(xiāng)者北村委會(huì)者北街  , schoolName=富民縣第二中學(xué), postcode=650401, collectDate=Sun Jan 19 00:00:00 CST 2020)
      

      Excel導(dǎo)出

      模擬生成數(shù)據(jù):

      public class DataGenerate {
      
          /**
           * 數(shù)據(jù)生成
           */
          public static List<SchoolData> data() {
              List<SchoolData> schoolDataList = new ArrayList<>();
              SchoolData schoolData;
              for (int i = 0; i < 15; i++) {
                  schoolData = new SchoolData();
                  schoolData.setSchoolName("第" + i + "XXX中學(xué)");
                  schoolData.setAddress("云南省昆明市XXXXX");
                  schoolData.setPostcode("123456");
                  schoolData.setCollectDate(new Date());
                  schoolDataList.add(schoolData);
              }
      
              return schoolDataList;
          }
      }
      

      測(cè)試導(dǎo)出:

      同導(dǎo)入,導(dǎo)出也有以下兩種寫法。LongestMatchColumnWidthStyleStrategy用來(lái)設(shè)置自動(dòng)列寬,如果需要設(shè)置列寬、行高等屬性,可以在Model類上添加對(duì)應(yīng)注解進(jìn)行設(shè)置,如@ColumnWidth、@ContentRowHeight、@HeadRowHeight等等。

      @Test
      public void exportExcel() {
      ExcelWriter excelWriter = null;
      try {
      excelWriter = EasyExcel.write("F:\\測(cè)試數(shù)據(jù)_副本.xlsx", SchoolData.class).build();
      WriteSheet writeSheet = EasyExcel.writerSheet("學(xué)校數(shù)據(jù)").registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
      excelWriter.write(DataGenerate.data(), writeSheet);
      } finally {
      // 千萬(wàn)別忘記finish 會(huì)幫忙關(guān)閉流
      if (excelWriter != null) {
      excelWriter.finish();
      }
      }
      }
      
      @Test
      public void exportExcelSimple() {
      EasyExcel.write("F:\\測(cè)試數(shù)據(jù)_副本.xlsx", SchoolData.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet("學(xué)校數(shù)據(jù)").doWrite(DataGenerate.data());
      }
      

      導(dǎo)出結(jié)果:

      基于Excel模板的填充

      模板:

      {} 代表普通變量 {.} 代表是list的變量。

      模板填充測(cè)試:

      @Test
      public void excelTemplateFill() {
      ExcelWriter excelWriter = EasyExcel.write("F:\\測(cè)試數(shù)據(jù)_副本3.xlsx").withTemplate("F:\\模板.xlsx").build();
      WriteSheet writeSheet = EasyExcel.writerSheet().build();
      FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
      
      //填充列表數(shù)據(jù)
      excelWriter.fill(DataGenerate.data(), fillConfig, writeSheet);
      
      //填充普通數(shù)據(jù)
      Map<String, Object> map = new HashMap<String, Object>();
      map.put("name", "狗子");
      map.put("date", "2021-02-19");
      excelWriter.fill(map, writeSheet);
      excelWriter.finish();
      }
      

      填充結(jié)果:

      Web中的導(dǎo)入和導(dǎo)出

      import com.alibaba.excel.EasyExcel;
      import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RestController;
      import org.springframework.web.multipart.MultipartFile;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.net.URLEncoder;
      
      @RestController
      public class SchoolDataController {
      
          /**
           * 導(dǎo)入Excel
           */
          @PostMapping("/import")
          public String importExcel(MultipartFile file) throws IOException {
              EasyExcel.read(file.getInputStream(), SchoolData.class, new SchoolDataListener()).sheet().doRead();
              return "success";
          }
      
          /**
           * 導(dǎo)出Excel
           */
          @GetMapping("/export")
          public void exportExcel(HttpServletResponse response) throws IOException {
              response.setContentType("application/vnd.ms-excel");
              response.setCharacterEncoding("utf-8");
              // 這里URLEncoder.encode可以防止中文亂碼 當(dāng)然和easyexcel沒(méi)有關(guān)系
              String fileName = URLEncoder.encode("測(cè)試", "UTF-8").replaceAll("\\+", "%20");
              response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
              // 這里需要設(shè)置不關(guān)閉流
              EasyExcel.write(response.getOutputStream(), SchoolData.class).autoCloseStream(Boolean.FALSE).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet("學(xué)校數(shù)據(jù)").doWrite(DataGenerate.data());
          }
      }
      

      參考:官方文檔

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多