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

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

前言

  • 该功能用于导出数据到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")// 解决跨域问题@CrossOriginpublic 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 = urllink.setAttribute('download', 'test.csv')document.body.appendChild(link)link.click()})}}
}
</script>

3、效果

在这里插入图片描述

相关文章:

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

前言 该功能用于导出数据到csv文件&#xff0c;并且前端进行下载操作。涉及到java后端以及前端。后端获取数据并处理&#xff0c;前端获取返回流并进行下载操作。csv与excel文件不大相同。如果对导出的数据操作没有很高要求的话&#xff0c;csv文件就够了。具体差异自行百度。我…...

NewStarCTF2023week2-base!(base低位隐写)

附件内容是很多的base64编码的字符串 常见的Base64隐写一般会给一个txt文本文档&#xff0c;内含多个经过base64编码的字符串。解码规则是将所有被修改过的base64字符串结尾的二进制值提取出来组成一个二进制串&#xff0c;以8位分割并转为十进制值&#xff0c;最终十进制对应的…...

众和策略:国际油价走高,石油板块强势拉升,通源石油、和顺石油等涨停

石油板块16日盘中大幅拉升&#xff0c;到发稿&#xff0c;通源石油、和顺石油、贝肯动力、中曼石油、泰山石油、仁智股份等涨停&#xff0c;潜能恒信、博迈科涨约8%。 燃气板块亦上扬&#xff0c;到发稿&#xff0c;洪通燃气、美能动力涨约5%&#xff0c;新疆火炬、九丰动力涨…...

C++笔记之获取线程ID以及线程ID的用处

C笔记之获取线程ID以及线程ID的用处 code review! 文章目录 C笔记之获取线程ID以及线程ID的用处一.获取ID二.线程ID的用处2.1.线程池管理2.2.动态资源分配2.3.使用线程同步机制实现互斥访问共享资源2.4.使用线程 ID 辅助线程同步2.5.任务分发&#xff1a;线程ID可以用于将任务…...

机器人硬件在环仿真:解决实体开发与测试挑战,提升效率与安全性

工业机器人具备出色的灵活性和运动能力&#xff0c;广泛应用于工业制造领域。它们可以完成装配、焊接、喷涂、搬运、加工、品质检测等任务&#xff0c;提高了生产效率&#xff0c;保证了产品质量。此外&#xff0c;在医疗领域也有辅助手术等特殊应用&#xff0c;展现了其在多个…...

stream()

stream().map&#xff0c;stream().filter&#xff0c;stream().peek 1、stream().map&#xff1a;该方法用于将一个流中的元素通过指定的函数进行映射&#xff0c;最终生成一个新的流。例如&#xff0c;如果我们有一个存储了字符串的列表&#xff0c;可以使用 map 方法将列表…...

VBA之正则表达式(43)-- 从网页中提取指定数据

实例需求&#xff1a;由网页中提取下图中颜色标记部分内容&#xff0c;网页中其他部分与此三行格式相同。 方法1 Sub Demo()Dim objRegex As ObjectDim inputString As StringDim objMatches As ObjectDim objMatch As ObjectSet objRegex CreateObject("VBScript.RegEx…...

Elucidating the Design Space of Diffusion-Based Generative Models 阅读笔记

文章使用模块化&#xff08;modular&#xff09;的思想&#xff0c;分别从采样、训练、score network设计三个方面分析和改进diffusion-based models。 之前的工作1已经把diffusion-based models统一到SDE或者ODE框架下了&#xff0c;这篇文章的作者同样也从SDE和ODE的角度出发…...

计算机网络 | 传输层

计算机网络 | 传输层 计算机网络 | 传输层功能概述 参考视频&#xff1a;王道计算机考研 计算机网络 参考书&#xff1a;《2022年计算机网络考研复习指导》 计算机网络 | 传输层 功能概述 传输层是主机才有的层次。 复用&#xff1a;发送方的不同应用进程都可以使用同一个传…...

Android 13 隐私权限和安全变更之通知

介绍 根据官网https://developer.android.com/about/versions/13/summary?hlzh-cn展示的Android 13 功能和变更列表中提及的&#xff0c;Android 13&#xff08;API 级别 33&#xff09;引入了新的权限POST_NOTIFICATIONS。 使用 在Android 13及以上版本&#xff0c;如需向…...

docker-compose安装和使用(自启、redis、mysql、rabbitmq、activemq、es、nginx、java应用)

1.在线安装docker-compose&#xff1a; 参考官网&#xff1a;https://docs.docker.com/compose/install/other/ docker-compose安装及简单入门 [Docker] docker-compose使用教程 Docker系列教程22-docker-compose.yml常用命令 # 安装&#xff08;加速下载https://ghproxy.…...

dll文件缺失,ps,pr无法打开,游戏运行不了如何解决

最近重装了系统&#xff0c;然后打开原来的软件发现都会报错&#xff0c;说***.dll文件缺失 于是找了很多解决办法 方案一 说是下载一个dll文件恢复助手&#xff0c;一键恢复 不要信 统统不管用&#xff0c;不是收费高就是没作用 方案二 下载对应dll文件去c盘对应软件位置…...

前后端数据导入导出Excel

一&#xff1a;导入 Excel有读取也便有写出&#xff0c;Hutool针对将数据写出到Excel做了封装。 原理 Hutool将Excel写出封装为ExcelWriter&#xff0c;原理为包装了Workbook对象&#xff0c;每次调用merge&#xff08;合并单元格&#xff09;或者write&#xff08;写出数据&…...

RackNerd 圣何塞 VPS 测评

发布于 2023-07-06 on https://chenhaotian.top/vps/racknerd-ca/ RackNerd 圣何塞 VPS 测评 官网链接&#xff1a;https://my.racknerd.com/index.php?rp/store/kvm-vps 这款是2022年双十一特别款&#xff0c;现在已经买不到了 网络是G口&#xff0c;4T流量 稳定性不错&…...

php74 安装sodium

下载编译安装libsodium wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.18-stable.tar.gz tar -zxf libsodium-1.0.18-stable.tar.gz cd libsodium-stable ./configure --without-libsodium make && make check sudo make install下载编译安装…...

优思学院:想成为质量工程师?了解质量工程师职责和能力是关键!

在职场中&#xff0c;质量工程师的角色显得至关重要。但如果你不清楚质量工程师的工作职责以及所需具备的能力&#xff0c;那么这个岗位可能会显得遥不可及。本文将为你详细介绍质量工程师的工作内容以及如何选择适合自己的质量工程师岗位。 一、质量工程师的工作职责 1. 质量…...

Rollup failed to resolve import

问题描述 我在打包vue3的项目的时候报了以下错误 问题原因 打包时&#xff0c;静态资源目录没有识别出来&#xff0c;导致打包终止并报错 问题解决 需要把路径改为跟路径&#xff0c;就可以打包啦 错误资源路径写法 <img src"src/assets/image/底部导航背景/book2…...

基于VScode 使用plantUML 插件设计状态机

本文主要记录本人初次在VScode上使用PlantUML设计 本文只讲述操作的实际方法&#xff0c;假设java已安装成功 。 1. 在VScode下安装如下插件 2. 验证环境是否正常 新建一个文件夹并在目录下面新建文件test.plantuml 其内容如下所示: startuml hello world skinparam Style …...

2023年中国汽车智能工厂市场规模不断增大,智能化已成趋势[图]

汽车智能工厂是在数字化工厂的基础上&#xff0c;通过互联网技术与工业技术结合&#xff0c;数据监管设备以及AI等技术的结合&#xff0c;实现汽车整车从原材料及零部件的生产到运输、组装一系列的自动化生产。汽车智能工厂很大程度上降低成本和人为干扰&#xff0c;实现自动化…...

cola架构:一种扩展点的实现思路浅析

目录 1.扩展点使用实例 2.主要技术点 2.1 注解加持 2.2 注解解析 2.3 扩展点路由 在实际项目中&#xff0c;我们经常使用策略模式、或者状态模式来隔离同一接口下不同的实现逻辑&#xff0c;进而消除代码中ifelse硬编码分支&#xff0c;使代码结构更清晰&#xff0c;也大大…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...