EasyExcel行转列,不定长换行导出(一)

本文介绍了如何使用阿里巴巴EasyExcel库进行Excel数据的导出和导入,包括定义模版、动态填充数据以及使用`poi`库的支持。通过实例展示了如何根据SkuId分组数据,计算每个物料的总数量,并将结果填充到预设的Excel模版中。
使用步骤:
1、定义模版;

2、动态定义模版;
3、模版填充;

pom.xml
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.6</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>3.17</version>
</dependency>

代碼如下:
package com.yy.test;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.enums.WriteDirectionEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import org.apache.commons.collections4.ListUtils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

public class ExportMain {
    public static void main(String[] args) {
        List<ExportSkuAndDeliveryInfo> list = new ArrayList<>();
        list.add(new ExportSkuAndDeliveryInfo("1", "白菜", "0001", "门店1", new BigDecimal("1")));
        list.add(new ExportSkuAndDeliveryInfo("1", "白菜", "0002", "门店2", new BigDecimal("2")));
        list.add(new ExportSkuAndDeliveryInfo("1", "白菜", "0003", "门店3", new BigDecimal("3")));
        list.add(new ExportSkuAndDeliveryInfo("1", "白菜", "0004", "门店4", new BigDecimal("4")));
        list.add(new ExportSkuAndDeliveryInfo("1", "白菜", "0005", "门店5", new BigDecimal("5")));
        list.add(new ExportSkuAndDeliveryInfo("1", "白菜", "0006", "门店6", new BigDecimal("6")));
        list.add(new ExportSkuAndDeliveryInfo("1", "白菜", "0007", "门店7", new BigDecimal("7")));
        list.add(new ExportSkuAndDeliveryInfo("1", "白菜", "0008", "门店8", new BigDecimal("8")));
        list.add(new ExportSkuAndDeliveryInfo("1", "白菜", "0009", "门店8", new BigDecimal("9")));

        list.add(new ExportSkuAndDeliveryInfo("2", "青菜", "0001", "门店1", new BigDecimal("1")));
        list.add(new ExportSkuAndDeliveryInfo("2", "青菜", "0002", "门店2", new BigDecimal("2")));
        list.add(new ExportSkuAndDeliveryInfo("2", "青菜", "0003", "门店3", new BigDecimal("3")));
        list.add(new ExportSkuAndDeliveryInfo("2", "青菜", "0004", "门店4", new BigDecimal("4")));
//        list.add(new ExportSkuAndDeliveryInfo("2", "青菜", "0005", "门店5", new BigDecimal("5")));
//        list.add(new ExportSkuAndDeliveryInfo("2", "青菜", "0006", "门店6", new BigDecimal("6")));
//        list.add(new ExportSkuAndDeliveryInfo("2", "青菜", "0007", "门店7", new BigDecimal("7")));
//        list.add(new ExportSkuAndDeliveryInfo("2", "青菜", "0008", "门店8", new BigDecimal("8")));
//        list.add(new ExportSkuAndDeliveryInfo("2", "青菜", "0009", "门店8", new BigDecimal("9")));
        Map<String, List<ExportSkuAndDeliveryInfo>> listMap = list.stream().collect(Collectors.groupingBy(ExportSkuAndDeliveryInfo::getSkuId));Map<String, List<Message>> tempMap = new LinkedHashMap();
        listMap.forEach((k, v) -> {
            List<List<ExportSkuAndDeliveryInfo>> partList = ListUtils.partition(v, 5);
            BigDecimal totalQuantity = v.stream().map(ExportSkuAndDeliveryInfo::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
            AtomicInteger le = new AtomicInteger();
            partList.forEach(zoomList -> {
                le.addAndGet(1);
                List<Message> messages = new ArrayList<>();
                messages.add(new Message("物料号", k));
                messages.add(new Message("总数量", totalQuantity.toString()));
                tempMap.put("A"+k + le.get(), messages);
                zoomList.forEach(z -> {
                    messages.add(new Message(z.getDeliveryName(), z.getQuantity().toString()));
                });
            });
        });
        List<Message> initList = new ArrayList<>();
        tempMap.forEach((k, v) -> {
            initList.add(new Message("{" + k + ".name}", ""));
            initList.add(new Message("{" + k + ".value}", ""));
        });
        String templateFileName = "d://templete.xlsx";
        String fileName = "d://1.xlsx";
        EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(initList);
        ExcelWriter excelWriter = EasyExcel.write("d://2.xlsx").withTemplate("d://1.xlsx").build();
        WriteSheet writeSheet = EasyExcel.writerSheet().build();
        FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
        tempMap.forEach((k, v) -> {
                excelWriter.fill(new FillWrapper(k, v), fillConfig, writeSheet);
        });
        excelWriter.finish();
    }
}
@Data
public class ExportSkuAndDeliveryInfo {
    private String skuId;
    private String skuName;
    private BigDecimal totalQuantity;
    private String deliveryName;
    private String deliveryId;
    private BigDecimal quantity;

    public ExportSkuAndDeliveryInfo(String skuId, String skuName, String deliveryId, String deliveryName, BigDecimal quantity) {
        this.skuId = skuId;
        this.skuName = skuName;
        this.deliveryId = deliveryId;
        this.deliveryName = deliveryName;
        this.quantity = quantity;
    }

}
@Data
public class Message {
    private String name;
    private String value;

    public Message(String name, String value) {
        this.name = name;
        this.value = value;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值