Vue2+SpringBoot实现数据导出到csv文件并下载

news2024/10/6 6:01:13

前言

  • 该功能用于导出数据到csv文件,并且前端进行下载操作。
  • 涉及到java后端以及前端。后端获取数据并处理,前端获取返回流并进行下载操作。
  • csvexcel文件不大相同。如果对导出的数据操作没有很高要求的话,csv文件就够了。具体差异自行百度。
  • 我这里使用的数据是假数据,并没有从数据库获取。

使用csv好处:

  • 由于功能少,所以要比excel文件小,下载快。
  • 后端不需要添加apache-poi等依赖,处理好数据,返回值为字符串字节即可。

1、后端代码

1.1、搭建springBoot项目

搭建项目就不说了,最基本的要求。不会的话需要先学习springBoot(下面演示是基于springBoot的)。

1.2、创建CSV工具类

package com.tcc.utils;

import org.springframework.util.CollectionUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class CsvUtils {
    /**
     * CSV文件列分隔符
     */
    private static final String CSV_COLUMN_SEPARATOR = ",";

    /**
     * CSV文件行分隔符
     */
    private static final String CSV_ROW_SEPARATOR = "\r\n";

    /**
     * @param dataList 集合数据
     * @param titles   表头部数据
     * @param keys     表内容的键值
     * @param os       输出流
     */
    public static void doExport(List<Map<String, Object>> dataList, String titles, String keys, OutputStream os)
            throws Exception {

        // 保证线程安全
        StringBuffer buf = new StringBuffer();

        String[] titleArr = null;
        String[] keyArr = null;

        titleArr = titles.split(",");
        keyArr = keys.split(",");

        // 组装表头
        for (String title : titleArr) {
            buf.append(title).append(CSV_COLUMN_SEPARATOR);
        }
        buf.append(CSV_ROW_SEPARATOR);
        // 组装数据
        if (!CollectionUtils.isEmpty(dataList)) {
            for (Map<String, Object> data : dataList) {
                for (String key : keyArr) {
                    buf.append("\t" +data.get(key)).append(CSV_COLUMN_SEPARATOR);
                }
                buf.append(CSV_ROW_SEPARATOR);
            }
        }

        // 写出响应
        os.write(buf.toString().getBytes("GBK"));
        os.flush();
    }

    /**
     * 设置Header 辅助函数, 可用可不用
     *
     * @param fileName
     * @param response
     * @throws UnsupportedEncodingException
     */
    public static void responseSetProperties(String fileName, HttpServletResponse response)
            throws UnsupportedEncodingException {
        // 设置文件后缀
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String fn = fileName + sdf.format(new Date()) + ".csv";
        // 读取字符编码
        String utf = "UTF-8";

        // 设置响应
        response.setContentType("application/ms-txt.numberformat:@");
        response.setCharacterEncoding(utf);
        response.setHeader("Pragma", "public");
        response.setHeader("Cache-Control", "max-age=30");
        response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fn, utf));
    }
}

1.3、编写接口

package com.tcc.controller;

import com.tcc.utils.CsvUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.util.*;

@RestController
@RequestMapping("/demo")
public class DemoController {

    @RequestMapping("generateCSV")
    // 解决跨域问题
    @CrossOrigin
    public void generateCSV(HttpServletResponse response) throws Exception {
        ServletOutputStream outputStream = response.getOutputStream();

        List<Map<String, Object>> dataList = new ArrayList();
        HashMap<String, Object> map = new HashMap<>();
        // 第一条数据
        map.put("name", "张三");
        map.put("age", 20);
        map.put("sex", "男");
        map.put("brithday",  new Date());
        dataList.add(map);

        // 第二条数据
        map = new HashMap<>();
        map.put("name", "李四");
        map.put("age", 22);
        map.put("sex", "女");
        map.put("brithday",  new Date());
        dataList.add(map);

        // 辅助函数,可用可不用
//        CsvUtils.responseSetProperties("test", response);
        CsvUtils.doExport(dataList,
                "姓名,年龄,性别,生日", // 所有列名
                "name,age,sex,brithday", // 列名对应的数据列的字段
                outputStream);
    }
}

2、前端代码

2.1、搭建vue2框架

也是最基本的,就不说了。

2.2、调用接口,并进行下载

<template>
  <div class="home">
    <button @click="downLoadFile">测试按钮</button>
  </div>
</template>

<script>
export default {
  name: 'HomeView',
  methods: {
    downLoadFile() {
      this.axios.post("http://localhost:8080/demo/generateCSV", {}, {
        responseType: 'blob' // 设置响应结果类型为blob类型
      }).then(res => {
         // 处理数据,并下载
        const blob = new Blob([res.data]);
        let url = window.URL.createObjectURL(blob)
        let link = document.createElement('a')
        link.href = url
        link.setAttribute('download', 'test.csv')
        document.body.appendChild(link)
        link.click()
      })
    }
  }
}
</script>

3、效果

在这里插入图片描述

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

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

相关文章

nodejs+vue教学辅助管理系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

nodejs+vue考研信息查询系统-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

python特别篇—github基本操作手册

一、开始使用 1.1 “Hello world” 1.1.1 github介绍 GitHub是一个基于Git版本控制系统的代码托管平台。它提供了一个在线的代码仓库&#xff0c;使开发者可以将自己的代码存储在云端&#xff0c;并与其他开发者进行协作。GitHub不仅仅是一个代码托管平台&#xff0c;还提供了…

IDEA中查看整个项目代码行数

近期正在手撸Spring源码&#xff0c;想要看下自己写了多少行代码。记录下如何查看项目的代码行数&#xff0c;方便日后查阅

【论文笔记】LLM-Augmenter

github&#xff1a;https://github.com/pengbaolin/LLM-Augmenter&#xff08;暂无处readme外其他文件&#xff09; paper&#xff1a;https://arxiv.org/pdf/2302.12813.pdf ![在这里插入图片描述](https://img-blog.csdnimg.cn/24cba6213c0f4c00a5646eb9007b3aa2.png#pic_cen…

【OS】操作系统课程笔记 第五章 并发性——互斥、同步和通信

并发性&#xff1a;并发执行的各个进程之间&#xff0c;既有独立性&#xff0c;又有制约性&#xff1b; 独立性&#xff1a;各进程可独立地向前推进&#xff1b; 制约性&#xff1a;一个进程会受到其他进程的影响&#xff0c;这种影响关系可能有3种形式&#xff1a; 互斥&am…

【从零开始学习Redis | 第三篇】在Java中操作Redis

前言&#xff1a; 本文算是一期番外&#xff0c;介绍一下如何在Java中使用Reids &#xff0c;而其实基于Java我们有很多的开源框架可以用来操作redis&#xff0c;而我们今天选择介绍的是其中比较常用的一款&#xff1a;Spring Data Redis 目录 前言&#xff1a; Spring Data…

Koordinator 协同 containerd NRI 增强容器 QoS,提升应用性能

作者&#xff1a;韩柔刚 - 阿里云&#xff0c;张康 - Intel 随着云基础业务类型和硬件资源的日益丰富&#xff0c;数据中心的资源利用率得到了显著提高&#xff0c;但也带来了资源争用的风险。在提高节点资源利用率的同时&#xff0c;确保应用程序的 QoS&#xff08;Quality o…

铜死亡+机器学习+WGCNA+分型生信思路

今天给同学们分享一篇单基因泛癌免疫实验生信文章“IGF2BP3 overexpression predicts poor prognosis and correlates with immune infiltration in bladder cancer”&#xff0c;这篇文章于2023年2月3日发表在BMC Cancer期刊上&#xff0c;影响因子为3.8。 膀胱癌是全球最常见…

利用向导创建MFC

目录 1、项目的创建&#xff1a; 2、项目的管理 &#xff1a; 3、分析以及生成的项目代码 &#xff1a; &#xff08;1&#xff09;、查看CFrame中的消息映射宏 &#xff08;2&#xff09;、自动生成事件 &#xff08;3&#xff09;、在CFrame中添加对应的鼠标处理函数 …

基于静电放电优化的BP神经网络(分类应用) - 附代码

基于静电放电优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于静电放电优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.静电放电优化BP神经网络3.1 BP神经网络参数设置3.2 静电放电算法应用 4.测试结果…

python爬虫入门详细教程-采集云南招聘网数据保存为csv文件

python爬虫之User-Agent大全、随机获取User-Agent 网站地址数据提取技术介绍采集目标流程分析python代码实现 网站地址 https://www.ynzp.com/ 这个网址特别适合新手拿来练习&#xff0c;你采集多了还有个验证码页面&#xff0c;验证码是4位数字&#xff0c;很清晰&#xff0c…

C++笔记之通用多态函数包装器std::function

C笔记之通用多态函数包装器std::function code review! 文章目录 C笔记之通用多态函数包装器std::function1.存储自由函数&#xff0c;lambda&#xff0c;std::bind 调用的结果2.存储到成员的调用3.存储到函数对象四.基本语法五.使用std::function定义函数对象六.使用std::fu…

UGUI交互组件ScrollView

一.ScrollView的结构 对象说明Scroll View挂有Scroll Rect组件的主体对象Viewport滚动显示区域&#xff0c;有Image和mask组件Content显示内容的父节点&#xff0c;只有个Rect Transform组件Scrollbar Horizontal水平滚动条Scrollbar Vertical垂直滚动条 二.Scroll Rect组件的属…

Unity角色或摄像机移动和旋转的控制脚本

该脚本挂载到需要被移动、旋转控制的物体身上&#xff0c;也可以之间挂在到摄像机上&#xff01; 挂载到摄像机上可以实现第一人称视角控制&#xff01; 挂载到物体身上&#xff0c;配合摄像机跟踪脚本可以实现&#xff0c;第三人称视角控制&#xff01; 第一人称视角 将角…

【每日一题】只出现一次的数字 II

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;位运算 写在最后 Tag 【位运算】【数组】【2023-10-15】 题目来源 137. 只出现一次的数字 II 题目解读 找出数组中仅出现一次的数字&#xff0c;其余数字仅出现三次。要求线性时间复杂度求解。 解题思路 本题的朴素…

基于nodejs+vue教学辅助管理系统

学生&#xff1b;首页、个人中心、本课程设计了线上教学辅助系统 ,学生可以此系统实现在线学习&#xff0c;作业提交管理、作业成绩管理。随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。教师&#xff1a;首页、个人中心、课程信息管理、教学资料管理、作业信息管…

C++笔记之std::future的用法

C笔记之std::future的用法 code review! 文章目录 C笔记之std::future的用法1.C中std::future和std::async总是一起出现吗&#xff1f;2.主要特点和用法3.一个完整的例子4.std::future 存放的是一个结果吗&#xff1f;5.cppreference——std::future 1.C中std::future和std::a…

NCV7724DQBR2G车规级半桥电机驱动芯片-专为汽车,工业自动化应用提供完美解决方案

车规级半桥电机驱动芯片是一种用于驱动直流电机的芯片&#xff0c;常用于电动汽车、电动自行车等领域。它可以控制电机的转速和方向&#xff0c;并且具有过流保护、过温保护等功能&#xff0c;可以保证电机的安全运行。 NCV7724DQBR2G是一款车规级八通道半桥驱动器&#xff0c;…

pdf格式的简历中的照片太小,如何修改图片的大小

问题描述&#xff1a;在使用一些在线版生成软件制作简历时&#xff0c;比如使用超级简历制作的简历存在着一个照片的尺寸比较小。如何去修改pdf中的证件照大小。 解决办法&#xff1a;使用一些在线编辑pdf的软件&#xff0c;比如我随便找了一个&#xff08;在线编辑pdf&#x…