excel导出标准化

news2025/1/12 15:59:59

虽然标题叫标准化,只不过是我自己的习惯,当一件事情变得流程标准化之后,开发程序就会飞快,开发评估工作总是 搞个1~2天,实则前端后端一起开发,1个小时就可以搞定。
1 前端

const exportXls = async () => {
    var now = moment(new Date()).format('YYYYMMDDHHMMSS')
	let name = '商品收发明细表.xls'
    const res = await proxy.$api.invOrder.goodsRdDetail.export({...condForm.value})
    let data = res.data;
	let url = window.URL.createObjectURL(new Blob([data], ))
	let link = document.createElement('a')
	link.style.display = 'none'
	link.href = url;
	console.log(link);
	link.setAttribute('download', now + name)
	document.body.appendChild(link)
	link.click()
	document.body.removeChild(link)
}

请求的代码如下

public postOnlyFile = (url: string, data = {} , config: AxiosRequestConfig<any> = {}): Promise<any> =>
	axios({
		...this.baseConfig,
		headers:{
			...this.baseConfig.headers,
			'Content-Type': "application/json"
		},
		responseType:'blob',
		url,
		method: 'post',
		data,
		...config,
	})

2 后端
controller层基本就是复制粘贴,传参数给到service层而已。

    @PostMapping("export")
    @ApiOperation("导出商品收发明细表")
    public void export(@RequestBody PsiInvOrderReportCondDto condDto, HttpServletResponse response){
        //设置响应头
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        //设置防止文件名中文乱码
        try {
            //设置防止文件名中文乱码
            String fileName = URLEncoder.encode("商品收发明细表", "utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            //
            if (!CheckEmptyUtil.isEmpty(condDto.getBillDateRange())){
                condDto.setStartBillDate(condDto.getBillDateRange().get(0));
                condDto.setEndBillDate(condDto.getBillDateRange().get(1));
            }
            goodsRdDetailService.export(response.getOutputStream(),"xls/GoodsRdDetail.xls", condDto);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }

service层主要通过easyexcel填充数据

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
    @Override
    public void export(OutputStream outputStream, String pathName, PsiInvOrderReportCondDto condDto) {
        List<GoodsRdDetailListDto> goodsRdDetailListDtos = select(condDto);
        int line = 1;
        for (GoodsRdDetailListDto goodsRdDetailListDto:goodsRdDetailListDtos){
            goodsRdDetailListDto.setLine(String.valueOf(line++));
            goodsRdDetailListDto.setBillDateStr(DateUtil.formatDate(goodsRdDetailListDto.getBillDate()));
            BusinessTypeEnum businessTypeEnum = BusinessTypeEnum.getInvBusinessTypeEnum(goodsRdDetailListDto.getBusiType());
            goodsRdDetailListDto.setBusiType(businessTypeEnum.display());
        }
        org.springframework.core.io.Resource resource = new ClassPathResource(pathName);
        InputStream inputStream = null;
        String fileName = DateUtil.getDateRandom() + ".xls";
        File file = new File(TmpDic.url + File.separator + fileName);
        try {
            inputStream = resource.getInputStream();
            FileUtils.copyInputStreamToFile(inputStream, file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(file).build();
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
        //
        WriteSheet sheet0 = EasyExcel.writerSheet(0,"单据明细(不合并表头)")
                //单元格
//                .registerWriteHandler(new CustomCellWriteHandler())
                .build();
        excelWriter.fill(goodsRdDetailListDtos, fillConfig, sheet0);
        //
        PsiAccountSet psiAccountSet = psiAccountSetService.getById(condDto.getAsId());
        GoodsRdDetailExcelHeaderDto excelHeaderDto = new GoodsRdDetailExcelHeaderDto();
        excelHeaderDto.setCompanyName(psiAccountSet.getName());
        excelHeaderDto.setStartBillDate(DateUtil.formatDate(condDto.getStartBillDate()));
        excelHeaderDto.setEndBillDate(DateUtil.formatDate(condDto.getEndBillDate()));
        excelWriter.fill(excelHeaderDto,sheet0);
        //
        excelWriter.finish();
        file.delete();
    }

3 excel模板
定义excel模板,就是上面的xls/GoodsRdDetail.xls
1

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

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

相关文章

2024环境工程、能源系统与化学材料国际会议(ICEEESCM 2024)

2024环境工程、能源系统与化学材料国际会议&#xff08;ICEEESCM 2024) 一、【会议简介】 2024环境工程、能源系统与化学材料国际会议&#xff08;ICEEESCM 2024)将于2024年在西安举行。会议将围绕环境工程、能源系统与化学材料等议题展开讨论&#xff0c;旨在为从事环境工程…

省赛模板构建——ADC

一般考试只考一个滑动变阻器&#xff0c;考R37的比较多 打开STM32CubeMX 四步配置 配置PB12对应R38的ADC1_IN11&#xff0c;配置PB15对应R37的ADC2_IN15 把通道11设置为单通道 时钟分频为异步/2(对应ADC的时钟来源)&#xff0c;异步一般都选2 配置最大采样周期为640.5 配置A…

Nacos进阶

目录 Nacos支持三种配置加载方案 Namespace方案 DataID方案 Group方案 同时加载多个配置集 Nacos支持三种配置加载方案 Nacos支持“Namespacegroupdata ID”的配置解决方案。 详情见&#xff1a;Nacos config alibaba/spring-cloud-alibaba Wiki GitHub Namespace方案…

vue实现自定义树形穿梭框功能

需求&#xff1a; 我们在开发过程中&#xff0c;会遇到需要将一个数据选择做成穿梭框&#xff0c;但是要求穿梭框左侧为树形结构、右侧为无层级结构的数据展示&#xff0c;ElementUI自身无法在穿梭框中添加树形结构&#xff0c;网上搜到了大佬封装的插件但是对于右侧的无树形结…

three.js 叉乘判断物体在人前左,前右,后左、后右

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div><div style"padding: 10px;text-align: left;">叉乘判断物体…

Flutter修改了函数申明后hotload会失效

文章目录 问题描述问题原因解决方法 问题描述 在 Flutter 开发中&#xff0c;如果修改了函数的声明&#xff0c;Hot Reload 功能通常不能正常使用&#xff0c;需要重新编译。 问题原因 Hot Reload 功能的工作原理是通过注入新的 Dart 代码来更新运行中的应用程序。当您修改函…

从零学算法289

289.根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 …

全面评估2023年最受欢迎的 3 类型原型设计工具

与其他设计工具相比&#xff0c;原型设计工具往往强调快速设计&#xff0c;界面建设和交互设计可以通过预设的组件、模板等内容快速完成。这可以在短时间内呈现和表达这个想法。 在原型设计工具市场上&#xff0c;有遥遥领先的基准产品、积累的新兴产品、没有创新的模仿产品、…

Tomcat布署及优化-----JDK和Tomcat

1.Tomcat简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;Tomcat 属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 JSP 程序的首选。一般来说&…

Springboot项目集成短信验证码(超简单)

操作流程 注册验证码平台创建验证码模版开始集成&#xff08;无需引入第三方库&#xff09; 注册并登陆中昱维信验证码平台 获取AppID和AppKey。 创建验证码模版 创建验证码模版&#xff0c;获取验证码模版id 开始集成 创建controller import org.springframework.web.bi…

YOLOv8涨点技巧,添加SE注意力机制提升目标检测效果

目录 论文地址 摘要 SE结构图 代码实现 Squeeze Excitation SE-Inception and SE-ResNet yaml文件编写 完整代码分享 总结 论文地址 http://openaccess.thecvf.com/content_cvpr_2018/papers/Hu_Squeeze-and-Excitation_Networks_CVPR_2018_paper.pdf 摘要 卷积神…

day06_菜单管理(查询菜单,添加菜单,添加子菜单,修改菜单,删除菜单,角色分配菜单,查询菜单,保存菜单,动态菜单)

文章目录 1 菜单管理1.1 表结构介绍1.2 查询菜单1.2.1 需求说明1.2.2 页面制作1.2.3 后端接口SysMenuSysMenuControllerSysMenuServiceMenuHelperSysMenuMapperSysMenuMapper.xml 1.2.4 前端对接sysMenu.jssysMenu.vue 1.3 添加菜单1.3.1 需求说明1.3.3 页面制作1.3.3 后端接口…

续上一篇---Jetson Xavier NX 开发板Yolov4 环境搭建和摄像头实时检测教程

1.已成功安装完CUDA&#xff0c;OpenCV&#xff0c;cuDNN&#xff0c;配置如下&#xff1a; 2.下载yolov4 自行去GitHub下载&#xff0c;然后再导入NX中&#xff0c;这样比较快且不容易出错。 https://github.com/AlexeyAB/darknet.git 3.配置 下载好包后解压缩&#xff0c;进…

一个完整的Flutter项目的基本构成

目录 1.页面跳转2.本地数据库和读取2.1 在pubspec.yaml中添加数据库框架依赖2.2 创建db.dart 初始化数据库并创建表2.3 安装JsonToDart插件2.4 创建实体类 user_bean.dart2.5 增删改查&#xff1a; 3.网络请求数据解析UI渲染 本篇主要总结下一个完整的Flutter项目有哪些基本构成…

C语言第三十三弹---动态内存管理(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 动态内存管理 1、为什么要有动态内存分配 2、malloc和free 2.1、malloc 2.2、free 3、calloc和realloc 3.1、calloc 3.2、realloc 4、常见的动态内存的错…

【单片机学习的准备】

文章目录 前言一、找一个视频是二、画图软件三、装keil5 仿真protues总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 项目需要&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、找一个视频是 https://www.b…

mariadb数据库——安装,创建数据库

MariaDB是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是MySQL的一个分支。 安装 apt -y install mariadb-servervi /etc/mysql/mariadb.conf.d/50-server.cnf character-set-server utf8mb4 collation-server utf8mb4_general_c…

让AI给你写代码,初体验(三)- AI加上格式化对话,实现对单个文件的修改/保存

上一篇中&#xff0c;AI生成web应用初步解决了简单web应用生成&#xff0c;但是存在两方面的问题 1&#xff09; 无法向AI提供增量需求&#xff0c;特别是一个对话结束之后&#xff0c;只能把全部需求&#xff08;包括新需求&#xff09;再描述一遍 2&#xff09; 无法用AI对存…

深入学习NumPy库在数据分析中的应用场景

在数据科学与机器学习领域&#xff0c;NumPy&#xff08;Numerical Python&#xff09;是一个经常被提及的重要工具。它是Python语言中一个非常强大的库&#xff0c;提供了高性能的多维数组对象以及用于处理这些数组的工具。NumPy不仅仅是一个用于数值计算的库&#xff0c;它还…

Redis第6讲——主从复制模式详解

Redis的读写性能很高&#xff0c;但在面对大规模数据和高发访问的挑战时&#xff0c;单节点的Redis可能无法满足需求&#xff0c;这就引出了Redis集群的概念。本节先介绍一下Redis高可用方案之一的主从复制模式&#xff0c;虽说现在基本不会用这种模式&#xff0c;但是无论是哨…