成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

EasyExcel進階之一個填充模版動態生成多個Sheet頁

開發 架構
EasyExcel單獨是無法實現一個模版動態填充多個Sheet頁,所以我們使用POI來幫忙復制Sheet頁即可!

一、前言

今天收到一個導出Excel的需求,這種需求經常做,看到模版還是是有點復雜的有頭有行,一般的導出是不好做,使用模板填充比較簡單!另外還有一個需求小編是第一次見,所以來記錄一下,為后來人鋪路!

需求:導出有單子的頭信息和一些多個行信息,前端可以多選,「多個放在一個excel里的sheet中」

明白了需求我們技術選型,現在基本都是EasyExcel用的比較多,今天使用的版本為:3.1.5,低版本已經不維護,建議使用高點的版本哈!

「在這里先說一下,EasyExcel單獨是無法實現一個模版動態填充多個sheet頁,所以我們使用POI來幫忙復制sheet頁即可!」

二、準備工作

1、閹割版效果圖

我簡化了一些功能,自己做了一個簡單的模板,但是功能都是有的,大致如下圖所示:

「多個就使用合同號作為sheet名稱,每個里面也會有多個行垂直填充即可!」

2、填充模版

3、導入依賴

中間使用了Hutool來獲取流,很多公司不讓使用Hutool的,大家自己選擇,不使用可以用:

  • Spring的ResourceUtils.getFile()
  • JDK的new File()

本次使用Hutool的ClassPathResource。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.5</version>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.4</version>
</dependency>

4、導出實體

/**
 * @author wangzhenjun
 * @date 2023/7/4 17:09
 */
@Data
public class TestExcel {

    private String contractNo;

    private String address;
    
 private String dateTime;

    private List<Item> itemList;

    @Data
    public static class Item{

        private String name;

        private BigDecimal price;
    }
}

三、實戰代碼

為了方便直接寫在Controller里了,大家不要學習哈,業務的處理還是要在service里寫!

整體思路:

使用POI的XSSFWorkbook 來根據要導出的個數來進行「復制sheet頁」,名稱為合同號

將復制好的sheet頁轉換成字節數組,然后再通過輸入流的方式讀取字節數組中的數據。

EasyExcel 將使用輸入流中的模板數據生成 Excel 數據,并將生成的 Excel 文件寫入到 HttpServletResponse 的輸出流中,以便將其發送給客戶端進行下載或其他處理。

創建一個 WriteSheet 對象,并將其與上面復制的sheet頁名稱關聯,就可以往里面填充數據了!

如果有這種list多個行填充的并且list不是最后一行,下面還有數據需要填充 就必須設置 forceNewRow=true

不加的話會把你后面的內容給覆蓋了!

但是這個就會把所有數據放到內存 會很耗內存!

「用完記得把流關閉哈!」

@SneakyThrows
@GetMapping("/excel")
public void excel (HttpServletResponse response){
    int size = 2;
    List<TestExcel> testExcels = new ArrayList<>();
    for (int i = 0; i < size; i++) {
        TestExcel testExcel = new TestExcel();
        testExcel.setContractNo("HT07040" + (i + 1));
        testExcel.setAddress("青島" + i + "號基地");
        testExcel.setDateTime("2023-07-05");
        testExcels.add(testExcel);
        List<TestExcel.Item> itemList = new ArrayList<>();
        for (int j = 0; j < size; j++) {
            TestExcel.Item item = new TestExcel.Item();
            item.setName("商品" + (j + 1));
            item.setPrice(new BigDecimal("188").multiply(new BigDecimal(j + 1)));
            itemList.add(item);
        }
        testExcel.setItemList(itemList);
    }
    response.setCharacterEncoding("utf-8");
    String fileName = URLEncoder.encode("測試", "UTF-8").replaceAll("\\+", "%20");
    response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
    ClassPathResource classPathResource = new ClassPathResource("template" + File.separator + "測試.xlsx");
    InputStream stream = classPathResource.getStream();
    // 把excel流給這個對象,后續可以操作
    XSSFWorkbook workbook = new XSSFWorkbook(stream);
    // 設置模板的第一個sheet的名稱,名稱我們使用合同號
    workbook.setSheetName(0, testExcels.get(0).getContractNo());
    for (int i = 1; i < size; i++) {
        // 剩余的全部復制模板sheet0即可
        workbook.cloneSheet(0, testExcels.get(i).getContractNo());
    }
    // 把workbook寫到流里
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    workbook.write(baos);
    byte[] bytes = baos.toByteArray();
    stream = new ByteArrayInputStream(bytes);
    ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(stream).build();

    for (TestExcel testExcel : testExcels) {
        WriteSheet writeSheet = EasyExcel.writerSheet(testExcel.getContractNo()).build();
        // list不是最后一行,下面還有數據需要填充 就必須設置 forceNewRow=true 但是這個就會把所有數據放到內存 會很耗內存
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).direction(WriteDirectionEnum.VERTICAL).build();
        excelWriter.fill(testExcel, writeSheet);
        excelWriter.fill(new FillWrapper("item", testExcel.getItemList()), fillConfig, writeSheet);
    }
    excelWriter.finish();
    baos.close();
    stream.close();
}

四、總結

這樣就完成了,主要的難點是復制sheet頁,多行填充在EasyExcel官網都是有的,還有一些我這邊沒有用到的東西,大家可以根據自己的需求去找找看!

EasyExcel填充地址:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/fill。

責任編輯:姜華 來源: 小王博客基地
相關推薦

2013-05-02 10:40:24

xcode

2013-06-03 15:38:16

iOS開發iOS SDK動態Action Sh

2018-03-21 08:19:11

中心化存儲網絡

2010-10-09 13:41:42

MySQL字符串

2009-08-18 13:35:08

C#動態生成Word文

2019-12-23 09:13:11

Python數據語言

2022-05-07 15:44:45

eTS 開發鴻蒙

2013-12-05 10:50:13

2021-05-17 14:10:29

MySQLSQLServer

2017-03-16 08:46:43

TensorFlow安裝入門

2020-10-13 10:49:23

APPAndiroid終端

2014-05-23 10:37:37

聊天程序PHP聊天程序

2022-12-28 08:17:36

數據庫數據導出

2021-04-13 17:40:55

微服務架構模式

2023-08-31 22:05:02

SAN環境存儲

2021-03-08 00:08:29

Vue應用掛載

2023-02-15 09:34:20

公共字段mybatis變量

2011-04-20 11:34:07

SQL字符串分割

2013-12-04 14:31:28

微軟Windows未來

2021-03-22 10:20:04

Python元類代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区中文字幕 | 色综合视频 | 欧美一区二区久久 | 91中文字幕 | 台湾佬久久 | 羞羞视频网站免费看 | 精品日韩在线 | 久久国产一区二区三区 | 色综合成人网 | 成人免费观看视频 | 国产精品免费一区二区 | 欧美日韩在线精品 | 在线2区| 日韩精品一区二区三区 | 国产成人av一区二区三区 | 91天堂网| 91精品一区二区三区久久久久久 | 国产精品久久久久久久久久久久午夜片 | 激情一区二区三区 | 欧美一区不卡 | 午夜精品一区二区三区在线播放 | 久久精品国产a三级三级三级 | 特a毛片 | 国产婷婷色一区二区三区 | 国产在线观看一区二区三区 | 久久免费精彩视频 | 国产欧美一区二区三区在线播放 | 涩涩视频网站在线观看 | 99国产精品久久久久 | 麻豆一区一区三区四区 | 精品在线一区二区三区 | 亚洲97| 国产高清久久久 | 婷婷久久综合 | 久久久久久久久久久久亚洲 | 91精品国产91久久久 | 亚洲一区二区三区免费视频 | 欧美一级片在线看 | 日本精品视频在线观看 | 久久久久久免费精品一区二区三区 | 日本精品久久久久久久 |