数据转换为excel模板下载

news2024/11/20 18:35:01

 一、引入依赖

<dependency>
     <groupId>org.jxls</groupId>
     <artifactId>jxls-poi</artifactId>
     <version>2.12.0</version>
 </dependency>

二、准备解析的数据封装 

package com.dst.modules.business.after.sale.parts.sparepartsprocurepo.service;

import com.dst.common.util.ConvertCNMoneyUtils;
import com.dstcar.common.utils.date.DateUtil;
import com.dstcar.common.utils.spring.BeanUtil;
import com.dstcar.entitys.sparepartsprocurepo.*;
import lombok.extern.slf4j.Slf4j;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;


@Slf4j
@Component
public class SparePartsProcurePoQuoteTemplateRender {


    private Resource spTemplate;

    @PostConstruct
    protected void init() {
        ResourceLoader resourceLoader = new DefaultResourceLoader();
        spTemplate = resourceLoader.getResource("classpath:/templates/excelTemp/SparePartsProcurePoQuoteTemplate.xlsx");
    }

    /**
     * 渲染
     * @param os    输出流
     */
    public void render(SparePartsProcurePoDTO procurePoDTO, OutputStream os) {
        try (InputStream is = spTemplate.getInputStream()) {
            Context context = new Context();
            context.putVar("data", buildData(procurePoDTO));
            JxlsHelper.getInstance().processTemplate(is, os, context);
        } catch (Exception e) {
            log.error("采购订单模版渲染异常", e);
        }
    }

    private SpareParsProcurePoQuoteTemplateData buildData(SparePartsProcurePoDTO procurePoDTO) {
        final SpareParsProcurePoQuoteTemplateData templateData = new SpareParsProcurePoQuoteTemplateData();
        SparePartsProcurePo sparePartsProcurePo = procurePoDTO.getSparePartsProcurePo();
        BeanUtil.copyProperties(sparePartsProcurePo,templateData);
        List<SparePartsProcurePoDetail> procurePoDetailList = procurePoDTO.getProcurePoDetailList();
        AtomicReference<Integer> i = new AtomicReference<>(1);
        final List<SpareParsProcurePoQuoteSkuTemplateData> skuTemplateData = procurePoDetailList.stream().map(pro -> {
            final SpareParsProcurePoQuoteSkuTemplateData quoteSkuTemplateData = new SpareParsProcurePoQuoteSkuTemplateData();
            quoteSkuTemplateData.setSequence(i.getAndSet(i.get() + 1));
            BeanUtil.copyProperties(pro, quoteSkuTemplateData);
            return quoteSkuTemplateData;
        }).sorted(Comparator.comparing(SpareParsProcurePoQuoteSkuTemplateData::getSequence)).collect(Collectors.toList());
        //大小写金额转换
        templateData.setTotalAmountStr(ConvertCNMoneyUtils.toChinese(String.valueOf(templateData.getTotalAmount())));
        templateData.setTotalPurchaseQuantity(skuTemplateData.stream().map(SpareParsProcurePoQuoteSkuTemplateData::getPurchaseQuantity)
                .reduce(BigDecimal.ZERO, BigDecimal::add));
        templateData.setOrderTime(DateUtil.convert2String(sparePartsProcurePo.getOrderTime(), DateUtil.DATEFORMAT));
        templateData.setContractCode(procurePoDetailList.get(0).getContractCode());
        templateData.setDetails(skuTemplateData);
        return templateData;
    }


}

三、对应导出excel数据的实体类

1.订单主档

package com.dstcar.entitys.sparepartsprocurepo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.math.BigDecimal;
import java.util.List;


@Data
public class SpareParsProcurePoQuoteTemplateData {


    /** 采购订单号 规则:CGDD+日期+流水号,按日期累加 **/
    private String orderCode;

    /** 订单日期 **/
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private String orderTime;

    /** 甲方名称 **/
    private String partyAName;

    /** 乙方名称 **/
    private String partyBName;

    /** 需方授权代表 **/
    private String demandAgent;

    /** 供方授权代表 **/
    private String supplierAgent;

    /** 需方地址 **/
    private String demandAddress;

    /** 供方地址 **/
    private String supplierAddress;

    /** 需方联系方式 **/
    private String demandContactsStyle;

    /** 供方联系方式 **/
    private String supplierContactsStyle;

    /** 结算方式:1月结30天|2月结60天|3月结90天|4先款后货(字典:spare_parts_payment_method) **/
    private String paymentMethodName;

    /** 发票类型:1增值税发票2普通发票(字典:spare_parts_po_invoice_type) **/
    private String invoiceTypeName;

    /** 订单总额(产品明细含税总额合计【含税总额(含税单价unitPriceIncludeTax * 采购数量purchaseQuantity)】) **/
    private BigDecimal totalAmount;

    /**
     * 订单总额大写文字
     */
    private String totalAmountStr;

    /**
     * 总的采购数量
     */
    private BigDecimal totalPurchaseQuantity;

    /** 备注 **/
    private String remark;

    /** 关联合同号 **/
    private String contractCode;

    /** po订单明细 */
    private List<SpareParsProcurePoQuoteSkuTemplateData> details;

}

2.订单明细实体

package com.dstcar.entitys.sparepartsprocurepo;

import com.dstcar.common.translation.Translation;
import lombok.Data;

import java.math.BigDecimal;


@Data
public class SpareParsProcurePoQuoteSkuTemplateData {

    /**
     * 序号
     */
    private Integer sequence;

    /** 零配件编码,逗号分割 **/
    @Translation(convertName = "partsMaterialNameBatchConvert", convertTo = {"materialCodes-materialName"})
    private String materialCodes;

    /**
     * 物料名称
     */
    private String materialName;

    /** 零配件规格 */
    private String specs;

    /** 计量单位 */
    private String productUnitName;

    /** 采购数量 **/
    private BigDecimal purchaseQuantity;

    /** 含税单价 **/
    private BigDecimal unitPriceIncludeTax;

    /** 税率 **/
    private BigDecimal taxRate;

    /** 含税总额(含税单价*采购数量) **/
    private BigDecimal includeTotalAmount;

    /** 收货人 **/
    private String receivedPerson;

    /** 收货人联系电话 **/
    private String receivedPhone;

    /** 收货人地址 **/
    private String receivedAddress;

    /** 备注 **/
    private String remark;


}

3.转化为导出url路径


    /**
     * 下载po订单模板接口
     * @param id
     * @return
     */
    public Results downloadOrder(String id,SSOUser ssoUser) {
        SparePartsProcurePoDTO procurePoDTO = this.getProcurePoDetailById(id);
        Integer priceSource = procurePoDTO.getProcurePoDetailList().get(0).getPriceSource();
        // 渲染
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        if (SparePartsFirmConstant.PRICE_SOURCE_2.equals(priceSource) ||
                SparePartsFirmConstant.PRICE_SOURCE_1.equals(priceSource) ||
                SparePartsFirmConstant.PRICE_SOURCE_4.equals(priceSource)) {
            sparePartsProcurePoCatalogTemplateRender.render(procurePoDTO, outputStream);
        } else if (SparePartsFirmConstant.PRICE_SOURCE_3.equals(priceSource) ||
                SparePartsFirmConstant.PRICE_SOURCE_5.equals(priceSource) ){
            sparePartsProcurePoQuoteTemplateRender.render(procurePoDTO, outputStream);
        } else {
            log.error("价格来源类型不存在:{}",priceSource);
            sparePartsProcurePoQuoteTemplateRender.render(procurePoDTO, outputStream);
        }
        // 上传
        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        String fileName = getFileName();
        final String aliObjName = genAliObjName(fileName);
        final String fileUrl = aliOSSStoreClient.uploadFile(inputStream, aliObjName, fileName);
        log.info("渲染采购订单模板并上传路径:{}, 文件名:{}", aliObjName, fileName);
        uploadExcel(AliOSSHelper.getAccessUrl(fileUrl),fileName,ssoUser);
        return succeed();
    }

    /**
     * 生成订单附件文件
     * @return
     */
    private String getFileName() {
        return "易维&供应商名称-采购订单" + ".xlsx";
    }

    /**
     * 生成文件上传路径
     * @return
     */
    private String genAliObjName(String FileName) {
        return "/operate/spare/parts/procure/po/template/"+dstIdUtils.getPrimaryKey()+"/" + FileName;
    }

    /**
     *
     * @param url
     * @param fileName
     */
    public  void uploadExcel(String url, String fileName, SSOUser ssoUser){
        Date date = new Date();
        ExportRecord exportRecord = new ExportRecord();
        exportRecord.setFileUrl(url);
        exportRecord.setFileName(fileName);
        exportRecord.setModule(10);
        exportRecord.setModuleName("零配件采购订单");
        //处理完成
        exportRecord.setStatus(2);
        exportRecord.setSource(0);
        exportRecord.setFileClassification(0);
        exportRecord.setRequestMethod("GET");
        exportRecord.setServerName("dst-operate-basic-api");
        exportRecord.setFileType(FileTypeConstant.EXCEL_2007);
        exportRecord.setCreateUserId(ssoUser.getId());
        exportRecord.setCreateUserName(ssoUser.getRealname());
        exportRecord.setCreateTime(date);
        exportRecord.setUpdateUserId(ssoUser.getId());
        exportRecord.setUpdateUserName(ssoUser.getRealname());
        exportRecord.setUpdateTime(date);
        exportRecordService.save(exportRecord);
    }

 4.导出订单模板填充

采 购 订 单
签订时间:${data.orderTime}订单编号:${data.orderCode}
需方(甲方):${data.partyAName}供方(乙方):${data.partyBName}
授权代表:${data.demandAgent}授权代表:${data.supplierAgent}
地址:${data.demandAddress}地址:${data.supplierAddress}
联系方式:${data.demandContactsStyle}联系方式:${data.supplierContactsStyle}
经双方友好协议确认,根据下列条款订立本合同:
一、内容:(甲方向乙方订购以下货物):
序号物料名称物料编码物料规格及描述单位数量单价(元)
含税
税率(%)金额(元)
含税
收货人收货人联系方式收货地址备注(交期)
${detail.sequence}${detail.materialName}${detail.materialCodes}${detail.specs}${detail.productUnitName}${detail.purchaseQuantity}${detail.unitPriceIncludeTax}${detail.taxRate}${detail.includeTotalAmount}${detail.receivedPerson}${detail.receivedPhone}${detail.receivedAddress}${detail.remark}
货款合计(大写):(含税费及运费)${data.totalAmountStr} ${data.totalPurchaseQuantity}小写合计${data.totalAmount}    
备注交付时间由甲乙双方书面确认。
二、结算方式:${data.paymentMethodName}
三、订单有效期:
四、质保期:
五、包装标准和要求:物品的包装除可靠保护内存物品外,必须整洁完好,并符合国内各地常规仓储条件的包装要求;外标识清晰正确,并与送货单所示内容一致,乙方应按照包装要求进行包装,并承担运费。甲方应自收到上述物料之日起【2】个工作日内完成上述物料的清点及验收。甲方对乙方上述物料的验收仅视为对其数量、规格、外包装等确认,不代表对物料质量的确认。
六、质量要求与交付期限要求:乙方保证货品质量和品质符合甲方要求,按甲方技术要求、图纸成封样为准,产品封样后未经甲方书面许可,乙方不可擅自更改任何材料和生产工艺、否则导致所供产品质量下降,最终使产品质量下降而需蒙受重大损失(包括:人员全检损失、特采损失,返工更换等待损失、甲方客户退货损失等),乙方要承担造成甲方损失的全部责任,质量不满足要求的,甲方有权要求乙方免费退换物料,乙方需按照本订单约定的交付时间完成物料交付,如因乙方未正常交货影响甲方整个项目进程的,乙方需承担本订单总金额50%的违约责任,违约金不足以弥补甲方损失的,乙方还应继续承担损害赔偿责任。
七、其他约定:

1)甲乙任何一方因不可抗力原因不能履行合同,应及时向对方通报并提供证明,以减轻可能给对方造成的损失。
2)产品交付前产品所有权由乙方保留,产品灭失及损坏风险由乙方承担。产品交付后产品所有权由甲方保留,产品灭失和损坏风险由甲方承担。但所有权和风险转移并不免除乙方对由于其自身原因其或产品固有缺陷导致的产品故障、损坏或灭失所应承担的责任。
3)乙方同意若甲方购买产品后质保期内因产量质量本身问题所产生的需要进行售后或者维修等事项,乙方应积极响应,并应免费为甲方退还或进行维修售后处理。
4)甲乙双方因履行本订单如发生纠纷,当事人双方应当及时协商解决,如协商不成,任何一方均有权向需方所在地人民有管辖权的人民法院提起诉讼。
5)本订单自甲乙双方签字盖章之日起生效,本订单执行期内,甲乙双方均不得随意变更或解除本订单,如有未尽事宜,须经双方共同协商,作出补充规定,补充规定与本订单具有同等法律效力。
6)本订单正本一式两份,甲乙双方各执一份,经双方盖章生效,传真件与原件同等有效,手写或更改无效。
甲 方乙 方
甲 方(盖章): ${data.partyAName}乙 方(盖章): ${data.partyBName}
授权代表(签字):授权代表(签字):

四、效果预览

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

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

相关文章

Java学习复杂的对象数组操作

Java学习复杂的对象数组操作 定义一个长度为3的数组&#xff0c;数组存储1~3名学生对象作为初始数据&#xff0c;学生对象的学号&#xff0c;姓名各不相同。 学生的属性&#xff1a;学号&#xff0c;姓名&#xff0c;年龄。 要求1&#xff1a;再次添加一个学生对象&#xff0…

什么是React的虚拟DOM(Virtual DOM)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

nginx服务---2

如何统计连接数&#xff0c;以及根据域名配置虚拟主机 cd /usr/local/nginx/conf vim nginx.conf server {listen 80;server_name www.abc.com;charset utf-8;access_log logs/www.abc.com;error_log logs/www.abc.error.log;location / {root /var/www/html/zzr;in…

Pytorvh之Vision Transformer图像分类

文章目录 前言一、Transformer1.Transformer概览2.Self-Attention3.Multi-head Attention4.Position-wise Feed-Forward Networks(位置前馈网络)5.残差连接和层归一化6.Positional Encodings(位置编码) 二、Vision Transformer1.Vision Transformer概览2.Embedding层结构&#…

DetailView/货币详情页 的实现

1. 创建货币详情数据模型类 CoinDetailModel.swift import Foundation// JSON Data /*URL:https://api.coingecko.com/api/v3/coins/bitcoin?localizationfalse&tickersfalse&market_datafalse&community_datafalse&developer_datafalse&sparklinefalseR…

滚珠螺母在工业机器人中的应用优势

工业机器人是广泛用于工业领域的多关节机械手或多自由度的机器装置&#xff0c;具有一定的自动性&#xff0c;可依靠自身的动力能源和控制能力实现各种工业加工制造功能。滚珠螺母作为工业机器人中的重要传动配件&#xff0c;在工业机器人的应用中有哪些优势呢&#xff1f; 1、…

华为云云耀云服务器L实例评测 | 实例评测使用之硬件参数评测:华为云云耀云服务器下的监控 glances

华为云云耀云服务器L实例评测 &#xff5c; 实例评测使用之硬件参数评测&#xff1a;华为云云耀云服务器下的监控 glances 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云云耀…

【操作系统】信号量机制及PV操作问题总结

【操作系统】信号量机制及PV操作问题总结 文章目录 【操作系统】信号量机制及PV操作问题总结题型分类解题的基本思路1、前置知识 &#xff08;信号量机制&#xff09;&#xff08;1&#xff09;整型信号量&#xff08;2&#xff09;记录型信号量&#xff08;3&#xff09;信号量…

PCB板子上一坨黢黑的可不简单,你知道吗?

有些电路板上我们会看到这么一坨黑色的东西&#xff0c;其实这是一种封装工艺&#xff0c;我们称之为软封装&#xff0c;也叫邦定封装。 它是芯片生产工艺中一种打线的方式&#xff0c;一般用于封装前将芯片内部的电路用金线与封装管脚连接&#xff0c;是裸芯片贴装技术之一&am…

36 WEB漏洞-逻辑越权之验证码与Token及接口

目录 验证码安全token安全接口安全问题未授权访问涉及案例验证码识别插件及工具操作演示-实例验证码绕过本地及远程验证-本地及实例Token客户端回显绕过登录爆破演示-本地Callback自定义返回调用安全-漏洞测试-实例补&#xff1a;上述在实战中如何做到漏洞发现-bp功能点 文章分…

C++ PCL点云曲率分割颜色标识

程序示例精选 C PCL点云曲率分割颜色标识 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《C PCL点云曲率分割颜色标识》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学…

信息系统项目管理师第四版学习笔记——配置与变更管理

配置管理 管理基础 配置管理是为了系统地控制配置变更&#xff0c;在信息系统项目的整个生命周期中维持配置的完整性和可跟踪性&#xff0c;而标识信息系统建设在不同时间点上配置的学科。 配置项的版本号规则与配置项的状态定义相关。例如&#xff1a;①处于“草稿”状态的…

strncpy,strncat,strncmp字符串函数详解(长度受限制)

目录 一&#xff0c;strncpy函数 1&#xff0c;strncpy函数简介 2&#xff0c;strncpy函数示例 3&#xff0c;注意事项 二&#xff0c;strncat函数 1&#xff0c;strncat函数简介 2&#xff0c;strncat函数示例 3&#xff0c;注意事项 三&#xff0c;strncmp函数 1&…

通讯录的完善(文件操作)

目录 前言&#xff1a; 保存联系人 读取联系人&#xff1a; 总结&#xff1a; 前言&#xff1a; 对于我们之前利用动态内存实现的通讯录来说&#xff0c;存在一个严重的问题。 就是当我们的程序运行结束&#xff0c;此时我们在通讯录所添加的全部联系人信息会全部丢失。 …

网页设计学习记录-常用圆角按钮css

.button {border: 0px;padding: 5px;border-radius: 100px;background-color: #9eb80c;width: 150px;height: 50px;color: white; } .button:hover {cursor: pointer; } 效果图

【AN-Animate教程——了解AN用途】

【AN-Animate教程——了解AN用途】 Animate是啥Animate能做什么2D动画制作帧动画制作矢量图形绘制和编辑角色建模与骨骼绑定动画特效和过渡效果动画导出与发布 除了动画还能做什么&#xff1f; 这一段时间没更新&#xff0c;主要是工作生活陷入了一个瓶颈。本想着阅读一些人工智…

安卓三防平板在行业应用中有哪些优势

在工业维修和检测中&#xff0c;安卓三防平板的应用也十分广泛。它可以搭载各种专业软件和工具&#xff0c;帮助工人们进行设备故障排查和维护&#xff0c;降低了维修成本和停机时间。 一、产品卖点&#xff1a; 1. 防水性能&#xff1a;该手持平板采用了防水设计&#xff0c;…

go mod 使用三方包、go get命令

一、环境变量设置 go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,https://goproxy.io,direct 二、goland开启 go mod 三、go mod 使用 在go.mod文件中声明三方包地址&版本号即可&#xff0c;如下&#xff1a; 开发工具goland会自动解析go.mod文件&#x…

Vscode中使用Romote远程开发调试Ros2环境

首先&#xff0c;成功安装ros2环境&#xff0c;参考官方文档中的教程&#xff0c;能用运行出来此处的代码 Writing a simple publisher and subscriber (Python) — ROS 2 Documentation: Iron documentation 下载vscode&#xff0c;进行远程开发&#xff0c;具体参考&#xf…

微软 AR 眼镜新专利:包含热拔插电池

近日&#xff0c;微软在增强现实&#xff08;AR&#xff09;领域进行深入的研究&#xff0c;并申请了一项有关于“热插拔电池”的专利。该专利于2023年10月5日发布&#xff0c;描述了一款采用模块化设计的AR眼镜&#xff0c;其热插拔电池放置在镜腿部分&#xff0c;可以直接替代…