当前位置: 首页 > news >正文

前端及后端实现csv文件下载功能

方法一、

前端内容:

const url = window.URL.createObjectURL(new Blob([res.data]));
const link = document.createElement('a');
link.href = url;
const fileNameDateTime = getFormattedDateTime();
const filename = "用户提现列表"+fileNameDateTime+'.csv';
link.setAttribute('download', filename);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(url);

 后端:

@GetMapping("/downloadCsv")
    @PreAuthorize("hasAuthority('system')")
    public ResponseEntity<byte[]> downloadCsv() {
        // 查询数据库获取数据
        List<SysUsdt> sysUsdtList = sysUsdtService.list(new QueryWrapper<SysUsdt>().orderByDesc("joinTime"));
        for (SysUsdt sysUsdt : sysUsdtList) {
            QueryWrapper<SysUser> queryuserWrapper = new QueryWrapper<>();
            queryuserWrapper.eq("id",sysUsdt.getUserid());
            SysUser sysUser = sysUserService.getOne(queryuserWrapper);
            if(sysUser==null){
                sysUsdt.setUsername("用户已删除");

            }else {
                sysUsdt.setUsername(sysUser.getUsername());
            }
        }
        // 创建字节数组输出流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream));
        // 写入 CSV 表头
        writer.println("ID,用户名,充值金额(人民币),充值金额(USDT),是否到账,到账时间");
        // 填充数据
        for (SysUsdt sysUsdt : sysUsdtList) {
            writer.println(
                    sysUsdt.getId() + "," +
                            sysUsdt.getUsername() + "," +
                            sysUsdt.getMoney().doubleValue() + "," +
                            sysUsdt.getUsdt().doubleValue() + "," +
                            sysUsdt.getStatus() + "," +
                            sysUsdt.getConfirmtime()
            );
        }
        writer.flush();
        byte[] csvBytes = outputStream.toByteArray();
        // 设置响应头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType("text/csv"));
        headers.setContentDispositionFormData("attachment", "充值明细.csv");
        return new ResponseEntity<>(csvBytes, headers, HttpStatus.OK);
    }

方法二、

直接纯前端实现:

const { fileName, fileData, fileType } = res.data;
        // 将 Base64 数据转换为二进制数据
        const byteCharacters = atob(fileData); // 解码 Base64
        const byteNumbers = new Array(byteCharacters.length);
        for (let i = 0; i < byteCharacters.length; i++) {
            byteNumbers[i] = byteCharacters.charCodeAt(i);
        }
        const byteArray = new Uint8Array(byteNumbers);
        // 创建 Blob 对象
        const blob = new Blob([byteArray], { type: fileType });
        // 创建下载链接
        const url = window.URL.createObjectURL(blob);
        const link = document.createElement('a');
        link.href = url;
        link.setAttribute('download', fileName);
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        window.URL.revokeObjectURL(url);
        urlsVisable.value = false;

http://www.dtcms.com/a/67433.html

相关文章:

  • 鸿蒙Next开发与实战经验总结
  • MicroPython 智能硬件开发完整指南
  • 《网络应用监测:Netinside的助力企业网络运维》
  • 使用Beanshell前置处理器对Jmeter的请求body进行加密
  • Ubuntu20.04安装运行DynaSLAM
  • cocos creator 3.8如何在代码中打印drawcall,fps
  • 交换机HSRP与VRRP的全面深入对比
  • 在 Windows 系统下使用 VMware 安装 Ubuntu 24.04 LTS 系统
  • 【设计模式】建造者模式——工厂模式
  • 文件解析漏洞靶场解析全集详解
  • 一次ORACLE 10G数据库REDO LOG损坏报错的解决办法ORA-00354: corrupt redo log block header
  • 纳米压印技术制备AR眼镜的参考步骤
  • React-dnd 拖拽排序,指定拖拽触发节点,拖拽预览图
  • Python开发合并多个PDF文件
  • 后端 - java - - 重写与重载的区别
  • Chatbox通过百炼调用DeepSeek
  • 医疗APP开发如何实现跨机构数据互通
  • 【HeadFirst系列之HeadFirstJava】第17天之深入解析 Java 包与 JAR:从代码组织到应用发布全流程(含实战)
  • FX-std::vector排序
  • SQLite Truncate Table
  • Selenium Manager和webdriver manager的区别与联系
  • chebykan阅读收尾
  • 数组逆序重存放(信息学奥赛一本通-1105)
  • 版本控制器Git(5)
  • 问deepseek: OpenFOAM并行分区后,是如何实现ldumatrix矩阵向量乘法计算逻辑的?
  • 05延迟任务精准发布文章(redis实现延迟任务、分布式锁)
  • 学习文章:Spring Boot 中如何使用 `@Async` 实现异步处理
  • vue项目清理node_modules缓存
  • 防汛应急包,快速响应,守护安全
  • 什么是后训练?大语言模型训练后优化方法综述,87页pdf