国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【EasyExcel】封裝一個(gè)分頁(yè)寫數(shù)據(jù)的通用方法(保姆級(jí)),繼上一篇easyExcel導(dǎo)出上線后的優(yōu)化

這篇具有很好參考價(jià)值的文章主要介紹了【EasyExcel】封裝一個(gè)分頁(yè)寫數(shù)據(jù)的通用方法(保姆級(jí)),繼上一篇easyExcel導(dǎo)出上線后的優(yōu)化。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

【EasyExcel】封裝一個(gè)分頁(yè)寫數(shù)據(jù)的通用方法

需求:通過(guò)elasticsearch查詢出來(lái)一次性寫,在大數(shù)據(jù)量時(shí)存在OOM的隱患分頁(yè)查詢、分批次寫數(shù)據(jù),避免導(dǎo)出大數(shù)據(jù)量時(shí)內(nèi)存消耗陡增基于elasticsearch分頁(yè)查詢;mybatis-puls同理


前言

在上個(gè)博客中解決了線上導(dǎo)出字體依賴的問(wèn)題,由于涉及的導(dǎo)出模塊較多,因?yàn)榇蛩惴庋b一個(gè)方法做通用導(dǎo)出。

一、所需依賴

1、easyexcel mavn 依賴文件

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.1</version>
            <optional>true</optional>
        </dependency>

二、源碼實(shí)現(xiàn)

1、依賴的枚舉類:ExcelPageEnum(自定義)

ExcelPageEnum:

/**
 * @className: ExcelPageEnum
 * @description: 存儲(chǔ) XLS與XLSX每次最大寫入與sheet最大Row的枚舉
 * @author: 云野
 * @date: 2022/8/12
 */
public enum ExcelPageEnum {
  /**
   * 
   * default export xlsx, page size 10000, sheet max row 1000000
   * @author: 云野
   * @date: 2022/8/12
   */
  XLS(10_000, 60_000),
  XLSX(10_000, 1_000_000);

  private int pageSize;
  private int sheetMaxRow;

  ExcelPageEnum(int pageSize, int sheetMaxRow) {
    this.pageSize = pageSize;
    this.sheetMaxRow = sheetMaxRow;
  }

  public int getPageSize() {
    return pageSize;
  }

  public int getSheetMaxRow() {
    return sheetMaxRow;
  }
}

2、依賴的核心接口類:PageQueryService(自定義)

/**
 * @className: PageQueryService
 * @description: 實(shí)現(xiàn)通用的核心接口
 * @author: 云野
 * @date: 2022/8/12
 */
@FunctionalInterface
public interface PageQueryService<E> {

  /**
   * 帶條件分頁(yè)查詢所有數(shù)據(jù)
   *
   * @return Result<List>
   */
  List<E> findByPage(Integer current, Integer size);
}

3、最終調(diào)用工具類: EasyExcelUtils

/**
 * 通用導(dǎo)出方法
 *
 * @className: EasyExcelUtils
 * @author: 云野
 * @date: 2022/8/12
 */
@Slf4j
@Component
public class EasyExcelUtils extends EasyExcel {

  public static void pageWrite(
      ExcelWriter excelWriter,
      String sheetName,
      Integer totalCount,
      HttpServletResponse response,
      PageQueryService pageQueryService) {

    // default export xlsx, page size 10000, sheet max row 1000000
    int pageSize = ExcelPageEnum.XLSX.getPageSize();
    int sheetMaxRow = ExcelPageEnum.XLSX.getSheetMaxRow();

    ExcelTypeEnum excelType = excelWriter.writeContext().writeWorkbookHolder().getExcelType();
    boolean isXls = excelType != null && ExcelTypeEnum.XLS.getValue().equals(excelType.getValue());
    if (isXls) {
      pageSize = ExcelPageEnum.XLS.getPageSize();
      sheetMaxRow = ExcelPageEnum.XLS.getSheetMaxRow();
    }

    try {
      // 下方使用了用戶自己選擇文件保存路徑的方式,所以需要配請(qǐng)求參數(shù),如果使用固定路徑可忽略此代碼
      String filename = URLEncoder.encode(sheetName + ".xlsx", "UTF-8");
      response.setCharacterEncoding("UTF-8");
      // 設(shè)定輸出文件頭
      response.setHeader("Content-disposition", "attachment; filename=" + filename);
      // 定義輸出類型
      response.setContentType("application/x-xls");

      // 這里其實(shí)就是把上面的方法分開(kāi)寫,寫入同一個(gè)sheet
      WriteSheet writeSheet = EasyExcelFactory.writerSheet(sheetName).build();

      // compute page count, sheet count
      long pageCount = (totalCount - 1) / pageSize + 1;
      long sheetCount = (totalCount - 1) / sheetMaxRow + 1;
      int currentPage = 0;

      // page write data
      WriteSheet sheet = null;
      for (int i = 0; i < sheetCount; i++) {
        Pageable pageable = new PageRequest(i, pageSize);
        sheet = EasyExcelFactory.writerSheet(i, sheetName + i).build();
        for (int j = 0; j < (sheetMaxRow / pageSize); j++) {
          excelWriter.write(pageQueryService.findByPage(currentPage, pageSize), sheet);
          currentPage++;
          if (currentPage >= pageCount) {
            break;
          }
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (excelWriter != null) {
        excelWriter.finish();
      }
    }
  }
}

三、代碼調(diào)用方式

1、Controller層代碼

@Slf4j
@Api(tags = "后臺(tái)--貨源服務(wù)API")
@RestController
@RequestMapping("/api/admin")
public class AdminCargoOwnerSupplyResource {

  @Autowired private HttpServletResponse response;
  @Autowired private CargoOwnerSupplyService cargoOwnerSupplyService;
  
  /**
   * @author: 云野 @Description: 導(dǎo)出貨源Excel
   * @date: 2022/8/12
   * @param: [queryRequest]查詢條件對(duì)象
   */
  @ApiOperation(value = "導(dǎo)出貨源", httpMethod = "GET")
  @GetMapping(value = "/url")
  public void exportExcel(AdminCargoOwnerSupplyQueryRequest queryRequest) {

    ServletOutputStream outputStream = null;
    try {
      outputStream = response.getOutputStream();
    } catch (IOException e) {

    }
    // build excel writer , CargoOwnerSupplyExportExcel 為自定義的導(dǎo)出類
    // excelType:導(dǎo)出類型,我這邊導(dǎo)出的是XLSX文件
    ExcelWriter excelWriter =
        EasyExcelFactory.write(outputStream, CargoOwnerSupplyExportExcel.class)
            .excelType(ExcelTypeEnum.XLSX)
            .build();
            
    // page write  ; “CargoOwnerSupply”為寫出的文件名字
    // cargoOwnerSupplyService.countOfQueryRequest(queryRequest) 是調(diào)用的方法,查詢需要導(dǎo)出多少數(shù)據(jù)
    EasyExcelUtils.pageWrite(
        excelWriter,
        "CargoOwnerSupply",
        cargoOwnerSupplyService.countOfQueryRequest(queryRequest),
        response,
        (currentPage, pageSize) ->
            cargoOwnerSupplyService.exportExcel(
                queryRequest, new PageRequest(currentPage, pageSize)));
  }
}

2、ExportExcel導(dǎo)出層實(shí)體(自定義,也可以是直接的entity實(shí)體)

/**
 * @Author 云野 @Description: 導(dǎo)出Excel后臺(tái)貨源 @Date 2022/8/12
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CargoOwnerSupplyExportExcel {
  /** 賬號(hào) */
  @ExcelProperty(value = "賬號(hào)", index = 0)
  private String account;

  /** 聯(lián)系人 */
  @ExcelProperty(value = "聯(lián)系人", index = 1)
  private String contactPerson;

  /** 發(fā)布時(shí)間 */
  @ExcelProperty(value = "發(fā)布時(shí)間", index = 2)
  private String createTime;

  /** 貨物名稱 */
  @ExcelProperty(value = "貨物名稱", index = 4)
  private String goodsName;

  /** 發(fā)貨量 */
  @ExcelProperty(value = "發(fā)貨量", index = 5)
  private Integer deliveryMount;

}

3、Service接口層

/** @Author 云野 @Description: @Date 2022/8/12 */
public interface CargoOwnerSupplyService {

  /** 根據(jù)條件查詢貨源數(shù)量 */
  Integer countOfQueryRequest(AdminCargoOwnerSupplyQueryRequest request);

  /**
   * 導(dǎo)出Excel
   *
   * @param request
   * @param pageable
   */
  List<CargoOwnerSupplyExportExcel> exportExcel(
      AdminCargoOwnerSupplyQueryRequest request, Pageable pageable);

}

4、Service接口實(shí)現(xiàn)層

/** @Author 云野 @Description: @Date 2022/8/12 */
public interface CargoOwnerSupplyServiceImpl {

  /** 根據(jù)條件查詢貨源數(shù)量 */
    @Override
  public Integer countOfQueryRequest(AdminCargoOwnerSupplyQueryRequest request) {
    // 這是是我Elasticsearch的查詢數(shù)量的方法,如果是sql的話,用自己的api
    return Integer.valueOf(
        String.valueOf(
            elasticsearchTemplate.count(
                new NativeSearchQueryBuilder().withQuery(queryConditions(request)).build(),
                CargoOwnerSupplyDTO.class)));
  }

  /**
   * 
   * 因?yàn)槲覜](méi)有直接使用數(shù)據(jù)庫(kù)查詢出來(lái)的entity實(shí)體對(duì)象,而是再封裝定義了一層ExportExcel實(shí)體對(duì)象,因此我這邊需要準(zhǔn)備這個(gè)賦值的方式,如果看官們直接用的數(shù)據(jù)庫(kù)查詢出來(lái)的 entity實(shí)體,那么就不需要賦值的過(guò)程
   * @author: 云野 
   * @Description: 導(dǎo)出Excel
   * @date: 2022/8/12
   * @param: [request(查詢條件), pageable(分頁(yè)查詢)]
   * @return: void
   */
  @Override
  public List<CargoOwnerSupplyExportExcel> exportExcel(
      AdminCargoOwnerSupplyQueryRequest request, Pageable pageable) {

    // 通過(guò)條件從數(shù)據(jù)庫(kù)查詢所有,返回一個(gè)List
    List<CargoOwnerSupplyVo> cargoOwnerSupplyList =
        cargoOwnerSupplyWebMapper.dtos2vos(adminFindAll(request, pageable).getContent());

    // 初始化List
    ArrayList<CargoOwnerSupplyExportExcel> list = new ArrayList<>();
    // 遍歷查詢出來(lái)的 List<CargoOwnerSupplyVo> , 然后進(jìn)行賦值到 ArrayList<CargoOwnerSupplyExportExcel>的操作
    cargoOwnerSupplyList.stream()
        .forEach(
            vo -> {
              // 基于@Builder注解進(jìn)行賦值
              CargoOwnerSupplyExportExcel excel = CargoOwnerSupplyExportExcel
              .builder()
              .account(vo.getContactPhone())
              .contactPerson(vo.getContactPerson())
              .createTime(vo.getCreateTime())
              .goodsName(vo.getGoodsName())
              .deliveryMount(vo.getDeliveryMount()).build();
     
              list.add(excel);
            });
    return list;
  }

}

三、總結(jié)

看過(guò)我以前博客的小伙伴應(yīng)該知道,我這邊所有的案例都是開(kāi)發(fā)時(shí)碰到的,同時(shí)我這邊的Data層用的是Elasticsearch+Spring Data Jpa ,因?yàn)楣居玫木褪沁@個(gè)呀,所以案例中出現(xiàn) 的查詢方案案例,如果使用Sql的小伙伴不需要進(jìn)行深究,只需要明白一點(diǎn)就行,這種時(shí)候可以直接使用Sql中同樣的查詢即可。
看到這里如果幫助到了你,給個(gè)點(diǎn)贊,謝謝啦!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-470113.html

到了這里,關(guān)于【EasyExcel】封裝一個(gè)分頁(yè)寫數(shù)據(jù)的通用方法(保姆級(jí)),繼上一篇easyExcel導(dǎo)出上線后的優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 鴻蒙API9+axios封裝一個(gè)通用工具類

    鴻蒙API9+axios封裝一個(gè)通用工具類

    使用方式: 打開(kāi)Harmony第三方工具倉(cāng),找到axios,如圖: 第三方工具倉(cāng)網(wǎng)址:https://ohpm.openharmony.cn/#/cn/home 在你的項(xiàng)目執(zhí)行命令:ohpm install @ohos/axios 前提是你已經(jīng)裝好了ohpm ,如果沒(méi)有安裝,可以在官網(wǎng)找到詳細(xì)的安裝教程; 注意:不是在你的entry目錄下,比如你的項(xiàng)目名稱:

    2024年04月17日
    瀏覽(21)
  • 【EasyExcel】在SpringBoot+VUE項(xiàng)目中引入EasyExcel實(shí)現(xiàn)對(duì)數(shù)據(jù)的導(dǎo)出(封裝工具類)

    【EasyExcel】在SpringBoot+VUE項(xiàng)目中引入EasyExcel實(shí)現(xiàn)對(duì)數(shù)據(jù)的導(dǎo)出(封裝工具類)

    一、引入EasyExcel 通過(guò)maven引入,坐標(biāo)如下: 二、后端代碼演示 下面以權(quán)限系統(tǒng)中的角色列表為案例,演示如何導(dǎo)出數(shù)據(jù) 實(shí)體類 工具類 通過(guò)@Component把工具類交給spring管理,在需要使用的地方使用@Resource注入即可 將泛型設(shè)置為 \\\" ? \\\",來(lái)表示任意類型,可以通過(guò)這一個(gè)方法完成

    2024年02月16日
    瀏覽(22)
  • 萬(wàn)級(jí)數(shù)據(jù)優(yōu)化EasyExcel+mybatis流式查詢導(dǎo)出封裝

    萬(wàn)級(jí)數(shù)據(jù)優(yōu)化EasyExcel+mybatis流式查詢導(dǎo)出封裝

    時(shí)間 更新內(nèi)容 2023/09/23 fix: 每個(gè)sheet大小和存儲(chǔ)內(nèi)存條數(shù)一致的bug update: 增大一個(gè)sheet的默認(rèn)容量 我們不妨先給大家講一個(gè)概念,利用此概念我們正好給大家介紹一個(gè)數(shù)據(jù)庫(kù)優(yōu)化的小技巧: 需求如下:將一個(gè)地市表的數(shù)據(jù)導(dǎo)出70萬(wàn)條。 如果你不假思索,直接一條sql語(yǔ)句搞上去

    2024年02月11日
    瀏覽(49)
  • Java多線程查表(封裝方法 多表通用)

    Java多線程查表(封裝方法 多表通用)

    經(jīng)過(guò)多線程的學(xué)習(xí)和實(shí)踐 總結(jié)了兩種多線程查表方法? 兩種方法都經(jīng)過(guò)我的封裝 某表使用時(shí) server層加上方法sql即可 查詢流程: 1 count全表?xiàng)l數(shù) 2 通過(guò)總條數(shù) 將全表數(shù)據(jù)分為10份 3 開(kāi)辟10個(gè)線程查詢limit語(yǔ)句(線程數(shù)可自定義) 以下方法均以mysql數(shù)據(jù)庫(kù)測(cè)試 其他庫(kù)同理 目錄 一?線

    2024年02月12日
    瀏覽(16)
  • 從vue小白到高手,從一個(gè)內(nèi)容管理網(wǎng)站開(kāi)始實(shí)戰(zhàn)開(kāi)發(fā)第七天,登錄功能后臺(tái)功能設(shè)計(jì)--通用分頁(yè)、枚舉以及相關(guān)工具類

    上一篇實(shí)現(xiàn)了數(shù)據(jù)庫(kù)訪問(wèn)層的相關(guān)功能,還沒(méi)有了解的小伙伴可以去看前面文章實(shí)現(xiàn)的內(nèi)容,因?yàn)槊恳黄獌?nèi)容都是連貫的,不學(xué)習(xí)的話可能下面的內(nèi)容學(xué)習(xí)起來(lái)會(huì)有點(diǎn)摸不著頭腦 從vue小白到高手,從一個(gè)內(nèi)容管理網(wǎng)站開(kāi)始實(shí)戰(zhàn)開(kāi)發(fā)第六天,登錄功能后臺(tái)功能設(shè)計(jì)--API項(xiàng)目中的

    2024年01月22日
    瀏覽(16)
  • 封裝數(shù)據(jù)訪問(wèn)通用類DbHelper

    ? ? ? ? 數(shù)據(jù)交互:增上改查? ? ? ? ????????相同的事情:連接? ? ? ? ????????T-SQL命令,Command? ? ? ? ????????執(zhí)行命令,選擇執(zhí)行方式 ? ? ? ? 得到相應(yīng)結(jié)果 ? ? ? ? 關(guān)閉連接 將一些從重復(fù)的邏輯進(jìn)行封裝,達(dá)到通用的目的 提高復(fù)用率,提高效果,不在考

    2024年02月02日
    瀏覽(13)
  • 自己動(dòng)手封裝axios通用方法并上傳至私有npm倉(cāng)庫(kù):詳細(xì)步驟與實(shí)現(xiàn)指南

    自己動(dòng)手封裝axios通用方法并上傳至私有npm倉(cāng)庫(kù):詳細(xì)步驟與實(shí)現(xiàn)指南

    一、構(gòu)建方法 確定工具庫(kù)的需求和功能:在開(kāi)始構(gòu)建工具庫(kù)之前,你需要明確你的工具庫(kù)需要包含哪些方法及工具,以及這些工具或方法應(yīng)該具備哪些功能。這有助于你更好地規(guī)劃你的開(kāi)發(fā)工作。 編寫工具代碼:使用你熟悉的前端框架(如React、Vue等)編寫工具代碼。確保你

    2024年04月14日
    瀏覽(32)
  • 使用EasyExcel實(shí)現(xiàn)通用導(dǎo)出功能

    JDK 1.8+ EasyExcel 2.2.7 此功能可以實(shí)現(xiàn)根據(jù)傳入自定義的 導(dǎo)出實(shí)體類或Map 進(jìn)行excel文件導(dǎo)出。若根據(jù)Map導(dǎo)出,導(dǎo)出列的順序可以自定義。 話不多說(shuō),直接看代碼 點(diǎn)擊查看代碼 點(diǎn)擊查看代碼 點(diǎn)擊查看代碼 點(diǎn)擊查看代碼 點(diǎn)擊查看代碼 點(diǎn)擊查看代碼 點(diǎn)擊查看代碼

    2024年02月05日
    瀏覽(20)
  • 一個(gè)通用的es聚合查詢方法

    調(diào)整方法如下: getSearchCondition為數(shù)據(jù)庫(kù)中配置的條件: {\\\"query\\\":{\\\"bool\\\":{\\\"must\\\":[{\\\"exists\\\":{\\\"field\\\":\\\"db_type\\\",\\\"boost\\\":1}},{\\\"exists\\\":{\\\"field\\\":\\\"dst_ip\\\",\\\"boost\\\":1}},{\\\"exists\\\":{\\\"field\\\":\\\"dst_port\\\",\\\"boost\\\":1}},{\\\"exists\\\":{\\\"field\\\":\\\"dst_db_name\\\",\\\"boost\\\":1}},{\\\"exists\\\":{\\\"field\\\":\\\"dst_db_table\\\",\\\"boost\\\":1}},{\\\"exists\\\":{\\\"field\\\":\\\"dst_asset_name\\\",\\\"boost\\\":1}

    2024年02月08日
    瀏覽(20)
  • 一個(gè)通用的EXCEL生成下載方法

    Excel是一個(gè)Java開(kāi)發(fā)中必須會(huì)用到的東西,之前博主也發(fā)過(guò)一篇關(guān)于使用Excel的文章,但是最近工作中,發(fā)現(xiàn)了一個(gè)更好的使用方法,所以,就對(duì)之前的博客進(jìn)行總結(jié),然后就有了這篇新的,萬(wàn)能通用的方法說(shuō)明書了 好了,閑話不多說(shuō),直接上干貨了 控制器代碼如下 上面總結(jié)

    2024年02月10日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包