EasyPoi一对多excel表格导出

news2024/12/23 6:39:31

效果如下图:

1、引入pom文件

<!--easypoi 一对多导入导出 -->
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>4.2.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>4.2.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>4.2.0</version>
</dependency>

2、Controller

   /**
     * 导出
     */
    @Log(title = "导出", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(WmsReturnOrderCreateBo bo, HttpServletResponse response) {
        if (!getLoginUser().isAdmin()) {
            bo.setWarehouseId(getLoginUser().getWarehouseId());
        }
        List<ExportReturnOrderCreate> list = iWmsReturnOrderCreateService.getExport(bo);
        EasyPoiUtil.exportExcel(list, ExportReturnOrderCreate.class, "导出", true, response);
    }

3、模板类

package com.xxx.domain.excel;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * 导出销退入库单
 *
 * @author bgq
 * @date 2024-03-15
 */
@Data
@ExcelIgnoreUnannotated
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 13)
@HeadFontStyle(color = 8)
public class ExportReturnOrderCreate implements Serializable {

    private static final long serialVersionUID = 1L;

    @Excel(name = "销退单号", needMerge = true, width = 20, height = 30)
    @HeadFontStyle(color = 10)
    private String returnOrderCode;

    @Excel(name = "出库单号", needMerge = true, width = 20, height = 30)
    private String deliveryOrderNo;

    @Excel(name = "发货单号", needMerge = true, width = 20, height = 30)
    private String deliveryOrderCode;

    @Excel(name = "质检单号", needMerge = true, width = 20, height = 30)
    private String returnCheckOrderNo;


    @Excel(name = "创建时间", needMerge = true, exportFormat = "yyyy-MM-dd HH:mm:ss" , width = 20, height = 30)
    private Date createTime;

    @ExcelCollection(name = "商品明细")
    private List<ExportReturnOrderCreateLine> orderCreateLines;

    private String itemCode;

    private String itemName;

    private Long planQty;

    private Long realQty;

    @Data
    public static class ExportReturnOrderCreateLine {

        @Excel(name = "商品名称", needMerge = true, width = 20, height = 30)
        private String itemName;

        @Excel(name = "应收数量", needMerge = true, width = 20, height = 30)
        private Long planQty;

        @Excel(name = "实收数量", needMerge = true, width = 20, height = 30)
        private Long realQty;
        
    }
}

4、Service

@Override
    public List<ExportReturnOrderCreate> getExport(WmsReturnOrderCreateBo bo) {
        Long exportCount = getExportCount(bo);
        if (exportCount > 10000){
            throw new IllegalArgumentException("导出数据量过大,请缩小查询范围");
        }
        List<ExportReturnOrderCreate> export = baseMapper.export(buildExportQueryWrapper(bo));
        List<ExportReturnOrderCreate> exportList = new ArrayList<>();
        Map<String,String> exportMap = new HashMap<>();
        Map<String,List<ExportReturnOrderCreate.ExportReturnOrderCreateLine>> lineMap = new HashMap<>();
        for (ExportReturnOrderCreate exportReturnOrderCreate : export) {
            String key = exportReturnOrderCreate.getReturnOrderCode();
            if (exportMap.get(key) == null) {
                exportList.add(exportReturnOrderCreate);
            }
            exportMap.put(key,"1");
            ExportReturnOrderCreate.ExportReturnOrderCreateLine line = getExportReturnOrderCreateLine(exportReturnOrderCreate);
            if (CollUtil.isEmpty(lineMap.get(key))){
                List<ExportReturnOrderCreate.ExportReturnOrderCreateLine> lineList = new ArrayList<>();
                lineList.add(line);
                lineMap.put(key,lineList);
            }else{
                List<ExportReturnOrderCreate.ExportReturnOrderCreateLine> lineList2 = lineMap.get(key);
                lineList2.add(line);
                lineMap.put(key,lineList2);
            }
        }
        for (ExportReturnOrderCreate orderCreate : exportList) {
            if (lineMap.get(orderCreate.getReturnOrderCode()) != null){
                orderCreate.setOrderCreateLines(lineMap.get(orderCreate.getReturnOrderCode()));
            }
        }
        return exportList;
    }

    @NotNull
    private static ExportReturnOrderCreate.ExportReturnOrderCreateLine getExportReturnOrderCreateLine(ExportReturnOrderCreate exportReturnOrderCreate) {
        ExportReturnOrderCreate.ExportReturnOrderCreateLine line = new ExportReturnOrderCreate.ExportReturnOrderCreateLine();
        line.setItemCode(exportReturnOrderCreate.getItemCode());
        line.setBarCode(exportReturnOrderCreate.getItemBarCode());
        line.setItemName(exportReturnOrderCreate.getItemName());
        line.setPlanQty(exportReturnOrderCreate.getPlanQty());
        line.setRealQty(exportReturnOrderCreate.getRealQty());
        line.setInventoryType(exportReturnOrderCreate.getInventoryType());
        return line;
    }

    @Override
    public Long getExportCount(WmsReturnOrderCreateBo bo) {
        return baseMapper.exportCount(buildExportQueryWrapper(bo));
    }
    private QueryWrapper<WmsReturnOrderCreateBo> buildExportQueryWrapper(WmsReturnOrderCreateBo bo) {
        QueryWrapper<WmsReturnOrderCreateBo> lqw = Wrappers.query();
        lqw.eq(bo.getWarehouseId() != null, "wroc.warehouse_id", bo.getWarehouseId());
        lqw.eq(bo.getExpressCode() != null, "wroc.express_code", bo.getExpressCode());
        lqw.eq(bo.getPreDeliveryOrderCode() != null,"wso.delivery_order_code", bo.getPreDeliveryOrderCode());
        lqw.eq(bo.getHandoverCode() != null,"wroc.handover_code", bo.getHandoverCode());
        lqw.groupBy("wrocl.return_order_id,wrcpr.inventory_type,wrocl.item_code");
        return lqw;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1929278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC降痕实战:论文降AI率的深度解析与应用

随着AI技术的飞速发展&#xff0c;AI论文工具正逐渐成为学术界的新宠。它们以高效、便捷的优势&#xff0c;吸引了众多学者的目光。然而&#xff0c;随之而来的学术诚信与原创性问题&#xff0c;也成为人们关注的焦点。 如何在享受AI带来的便利的同时&#xff0c;确保论文的原…

pear-admin-fast项目修改为集成PostgreSQL启动

全局搜索代码中的sysdate()&#xff0c;修改为now() 【前者是mysql特有的&#xff0c;后者是postgre特有的】修改application-dev.yml中的数据库url使用DBeaver把mysql中的数据库表导出csv&#xff0c;再从postgre中导入csv脚本转换后出现了bpchar(xx)类型&#xff0c;那么一定…

《数字通信世界》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《数字通信世界》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第二批认定学术期刊。 问&#xff1a;《数字通信世界》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;工业和信息化部 主办单位&#x…

ubuntu22.04安装SecureCRT8.7.3,完成顺利使用

材料准备 scrt-sfx安装包 &#xff0c; securecrt_linux_crack.pl 补丁脚本&#xff0c;和两个依赖库 其中securecrt_linux_crack.pl是找的专门适合 8.7.3版本的&#xff0c;网上很多版本的crack.pl只能打补丁以前的老版本。 而更老版本的SecureCRT对ubuntu22支持更不好&#…

DBeaver导入脚本和导出数据

DBeaver导入脚本和导出数据 前言&#xff1a; 通常产品会要求&#xff0c;把xx表导出Excel&#xff0c;navicat一般公司不让用。讲解使用DBeaver 导入脚本 我们将sql脚本导入DBeaver 1&#xff0c;选择数据库&#xff0c;找到执行脚本 2&#xff0c;选用sql脚本&#xff0…

mavsdk客户端(java)通过mavsdk_server与PX4进行通信

1.启动PX4容器: 2.启动14550与14540监听 3.启动QGC 4.启动mavsdk_server通信中间件 5.启动mavsdk客户端(java) 注:官方示例默认无法连接,修改如下: import io.mavsdk.telemetry.Telemetry;增加设备健康检查才能执行解锁指令Telemetry telemetry = new Telemetry();teleme…

【读书笔】口才三绝

【读书笔记】口才三绝 一、引言二、主要内容概述赞美之绝幽默之绝拒绝之绝 三、个人感悟四、结语我是杰叔叔&#xff0c;一名沪漂的码农&#xff0c;下期再会&#xff01; 一、引言 《口才三绝》是一本专注于提升个人口才与沟通技巧的书籍&#xff0c;它通过丰富的案例和实用的…

macOS Sequoia 15(Macos15系统)v15.0 Beta 3发布 macOS Sequoia 15 功能预览

macOS Sequoia 15 功能预览 犀利一如 Mac macOS Sequoia 15(Macos15系统)v15.0 Beta 3测试版本下载安装 连续互通 你的 Mac 上&#xff0c;iPhone 用起来。 有了 iPhone 镜像功能&#xff0c;在 Mac 上就能看到 iPhone 屏幕画面&#xff0c;还能直接进行操控&#xff0c;不拿…

MySQL存储引擎有哪些?有什么区别?

MySQL存储引擎有哪些&#xff1f;有什么区别 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可被称为表类型。 在mysql中提供了很多的存储引擎&#xff0c;比较常见有InnoDB、My…

FPGA上板项目(二)——PLL测试

目录 实验内容实验原理实验步骤实验结果 实验内容 将差分时钟信号转化为 192MHz 时钟信号作为输出。 实验原理 PLL&#xff0c;即锁相环&#xff0c;一种反馈控制电路&#xff0c;具有时钟倍频、分频、相位偏移和可编程占空比的功能。 实验步骤 添加 clocking wizard IP核&…

Flutter TextFiled频繁采集“剪切板信息”

在使用Flutter开发者&#xff0c;输入框是必不可少的功能&#xff0c;最近产品出了需要&#xff0c;要求输入框记住用户登录过的手机号&#xff0c;并在输入框输入时提示出来&#xff0c;这是个很基础的功能&#xff0c;但是在通过测试验收发布到应用市场时&#xff0c;被Vivo拒…

深圳晶彩智能JC3636W518C开箱实现电脑副屏功能

深圳晶彩智能发布了JC3636W518C 这是一款中国制造的&#xff0c;铝合金外壳&#xff0c;价格非常震撼的开发板。原创是billbill的up播主萨纳兰的黄昏设计的ESP32太极小派&#xff0c;由深圳晶彩智能批量生产。 该款 LCD 模块采用 ESP32-S3R8 芯片作为主控,该主控是双核 MCU&…

SpringBoot中常用的注解及其用法

1. 常用类注解 RestController和Controller是Spring中用于定义控制器的两个类注解. 1.1 RestController RestController是一个组合类注解,是Controller和ResponseBody两个注解的组合,在使 用 RestController 注解标记的类中&#xff0c;每个方法的返回值都会以 JSON 或 XML…

《昇思25天学习打卡营第07天|qingyun201003》

日期 心得 越往后&#xff0c;越看不懂&#xff0c;只能说是有了解到如何去训练模型代码&#xff0c;对于模型代码该如何去保存&#xff0c;如何通过网络模型去训练。只能一步步来&#xff0c;目前来说是推进度&#xff0c;等后面全部有了认知&#xff0c;再回来重新学习 昇思…

Re:从零开始的C++世界——类和对象(中)

文章目录 前言1. 类的默认成员函数2. 构造函数&#x1f34e;概念&#x1f34e;特点&#x1f34c;特点一&#x1f34c;特点二&#x1f34c;特点三&#x1f34c;特点四&#x1f34c;特点五&#x1f34c;特点六&#x1f34c;特性七 &#x1f34e;总结 3.析构函数&#x1f34e;概念…

Foxmail新版本迁移邮箱的数据文件教程

Foxmail作为轻量化办公中使用最多的邮件沟通应用&#xff0c;而当其邮件积累到一定数量后&#xff0c;会几乎占满所在的硬盘空间&#xff0c;小编接下来为大家介绍如何将邮件数据文件迁移到其他硬盘&#xff0c;且迁移后保持foxmail的旧邮件数据存在&#xff0c;方便搜索和转发…

职升网:一建和注安哪个难度大?哪个含金量高?选择哪个?

从考试难度来看&#xff0c;一级建造师&#xff08;简称一建&#xff09;的考试难度通常被认为要高于注册安全工程师&#xff08;简称注安&#xff09;。一建考试涵盖的内容比较广泛&#xff0c;需要考生对教材进行全面了解和深入复习&#xff0c;特别是在实务这一块内容&#…

第三季度加密市场动荡:市场缺乏炒作题材,波动加剧

摘要 根据 Arkham 的数据&#xff0c;德国政府联邦刑事调查局 (BKA) 可能已完成抛售&#xff0c;其持有量从 6 月中旬的约 50,000 BTC&#xff08;35.5 亿美元&#xff09;减少到 7 月 12 日的数据为 0 BTC。市场担忧美国经济在今年晚些时候或 2025 年初陷入衰退&#xff0c;导…

使用mitmproxy抓包详细记录(一)

1、安装mitmproxy pip install mitmproxy 安装失败解决方案&#xff0c;见上一篇 2、编辑代码&#xff0c;可以直接复制我的. 给文件起名&#xff0c;attacy.py import mitmproxyimport csv from mitmproxy import httpclass RequestRecorder:def __init__(self):self.records…

植物大战僵尸杂交版等超火的版本汇总(附说明和下载链接)

1.杂交版 &#xff08;最火的一版&#xff09; B站游戏作者潜艇伟伟迷&#xff08;点击进进入作者空间&#xff09; 夸克网盘链接&#xff1a;https://pan.quark.cn/s/095de551d1d1 UC网盘链接&#xff1a;https://drive.uc.cn/s/86debb3ce1294 新增7月5日更新的2.2版本链接…