导出CSV文件

news2024/11/25 23:51:30

从数据库导出csv文件

从HeidiSQL 导数据出来成.csv文件

SELECT * FROM csv INTO OUTFILE 'C:\\feiniu\\note\\csv\\demo.csv' fields terminated by ','

CSV是什么

Excel表差不多

csvexcel对比:

  • csv只能用于存储纯文本内容,excel不仅支持纯文本内容还支持二进制数据
  • csv可以看做是excel的轻量级简单版实现,excelcsv更加强大
  • csv文件可以被excel软件直接打开,csv文件一般用于表格数据的传输

纯文本形式存储表格数据,分隔字符有:逗号、分号 空格等

每行一条记录

关于操作csv文件

  1. 读取CSV 文件转Java对象
  2. CSVExcel
  3. CSV转对象后存数据库
  4. 下载(导出)CSV文件

依赖:opencsveasyexcel

导出Java对象转CSV导出文件

maven: OpenCSV

   <dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>5.6</version>
   </dependency>

controller

@RestController
@Slf4j
@RequestMapping("/file")
public class FileController extends BaseController{


    @Autowired
    private FileService fileService;

    @PostMapping("/downloadUserListCsv")
    public void downloadUserListCsv(HttpServletResponse response) {
        fileService.downUserListCsv(DownloadPublicUtil.UserListCsvHeader, response);
    }
}

service

@Service
public class FileServiceImpl implements FileService {
    @Override
    public void downUserListCsv(String[] head, HttpServletResponse response) {

        List<User> userList = List.of(
                User.builder().userId("1").userName("张三").sex("男").build(),
                User.builder().userId("2").userName("李四").sex("男").build(),
                User.builder().userId("3").userName("王五").sex("男").build()
        );

        ExportCsvUtils.exportCsv(head,userList,User.class,"user-list-1",response);
    }
}

utils

ExportCsvUtils
public class ExportCsvUtils {

    private ExportCsvUtils(){

    }

    public static <T> void exportCsv(String[] headers, List<T> list, Class c, String fileName, HttpServletResponse response){
        OutputStream outputStream = null;
        CSVWriter csvWriter = null;

        try {
            DownloadPublicUtil.setResponse(response, FileTypeEnum.CSV,
                    fileName, DownloadCharsetEnum.WINDOWS_1252);
            outputStream = response.getOutputStream();
//          prevent from turning Chinese into garbled code
            outputStream.write(0xEF);
            outputStream.write(0xBB);
            outputStream.write(0xBF);
       //     outputStream = response.getOutputStream();

            csvWriter = new CSVWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
            //写入标题行
            csvWriter.writeNext(headers);

            Map<String, String> map = new HashMap<>();
            Field[] declaredFields = c.getDeclaredFields();

            // each row
            for (T t : list) {
                for (Field declaredField : declaredFields){
                    declaredField.setAccessible(true);
                    Object o = null;

                    try {
                        o = declaredField.get(t);
                        if (o instanceof String){
                            // userId -> UserId
                            String fieldName = declaredField.getName();
                            String firstChar = fieldName.substring(0, 1).toUpperCase();
                            fieldName = firstChar + fieldName.substring(1);
                            map.put(fieldName,(String) o);
                        }
                    } catch (IllegalAccessException e) {
                        throw new RuntimeException(e);
                    }
                }
                ArrayList<String> values = new ArrayList<>();

                for(String header : headers){
                    //User Id -> UserId
                    header = header.replace(" ","");
                    String value = map.get(header);
                    values.add(value);
                }
                //  写入数据行
                csvWriter.writeNext(values.toArray(new String[0]));
                csvWriter.flush();
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
                try {
                    if (csvWriter != null) {
                        csvWriter.close();
                    }
                    if (outputStream != null) {
                        outputStream.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

DownloadPublicUtil
public class DownloadPublicUtil {

    public static String[] UserListCsvHeader =  {"User Id","User Name","Sex"};

    private DownloadPublicUtil(){

    }

    public static void setResponse(HttpServletResponse response, FileTypeEnum fileTypeEnum, String fileName, DownloadCharsetEnum charsets) {
        fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8).replaceAll("\\+", "%20");
        response.reset();
        response.setCharacterEncoding(charsets.getVal());
        if (fileTypeEnum.equals(FileTypeEnum.CSV)) {
            response.setContentType("text/" + fileTypeEnum + ";charset=" + charsets.getVal());
        } else {
            response.setContentType("application/" + fileTypeEnum + ";charset=" + charsets.getVal());
        }
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName + fileTypeEnum.getSuffix());
    }
}

enum

@Getter
@AllArgsConstructor
public enum DownloadCharsetEnum {

    UTF_8("utf-8"),
    WINDOWS_1252("windows-1252");

    private final String val;
}

@Getter
public enum FileTypeEnum {
    EXCEL(".xlsx"),
    PDF(".pdf"),
    CSV(".csv");

    private final String suffix;

    FileTypeEnum(String suffix) {
        this.suffix = suffix;
    }
}

没设置response

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

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

相关文章

Fwupd 1.9.9 发布

Fwupd 1.9.9 开源 Linux 固件升级工具今天发布了另一个维护更新&#xff0c;解决了各种错误并扩展了硬件支持。 继 fwupd 1.9.8 发布不到一周&#xff0c;fwupd 1.9.9 版本又推出了对联想 ThinkPad X1 Yoga Gen7 530E 二合一笔记本电脑和研华 BMC 设备的支持&#xff0c;以及对…

【目标跟踪】光流跟踪(python、c++代码)

文章目录 前言一、代码流程与思路二、python 代码2.1 代码详解2.2 完整代码 三、c 代码四、结果展示 前言 光流利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系&#xff0c;从而计算出相邻帧之间物体的运动信息的一种方法。…

OSHI-操作系统和硬件信息库

文章目录 引言一、快速入门1.1 OSHI的简介1.2 引入依赖1.3 涉及的包&#xff08;package&#xff09;1.4 涉及的核心类 二、操作系统信息&#xff1a;OperatingSystem2.1 总揽2.2 文件系统信息&#xff1a;FileSystem2.3 网络参数信息&#xff1a;NetworkParams2.4 进程信息&am…

【2023年APMCM亚太杯C题】完整代码+结果分析+论文框架(二)

2023年APMCM亚太杯C题 3、4问 问题三问题分析技术文档基于相关性分析的汽车产业影响分析3.1 分布检验模型的建立3.2 相关性模型的建立3.3 模型求解 问题四问题分析技术文档4 基于 Kruskal-Wallis H 检验的政策影响研究4.1 分布检验模型的建立4.2 方差齐性检验模型的建立4.3 Kru…

软件测试人员如何快速成长?

文章标题有点大&#xff0c;更贴切的描述应该是测试人员如何在工作中快速积累经验和提高技能。但是这么描述太长了&#xff0c;根据自己的工作经验和经历&#xff0c;谈一些个人观点。 在这我也准备了一份软件测试视频教程&#xff08;含接口、自动化、性能等&#xff09;&…

EXCEL小技巧, 用2种公式方法,查找1列数据里符合条件的最后1个单元格

目录 1 问题 2 解决办法 3 lookup()变形公式&#xff0c; lookup(1,0/((列1条件1)*(列2条件2)) 3.1 公式用法 3.2 局限性 4 数组公式&#xff0c;INDEX(H:H,MAX(IF(I:IK4,ROW(H:H)))) 4.1 语法 1问题 一般来说&#xff0c;EXCEL里使用 match()等只能查到符合条件的第一…

作为用户,推荐算法真的是最优解么?

前言 众所周知&#xff0c;随着互联网技术的发展&#xff0c;推荐算法也越来越普及。无论是购物网站、社交媒体平台还是在线影视平台&#xff0c;推荐算法已成为用户获取相关信息的主要途径。据悉&#xff0c;近期GitHub决定结合算法推荐&#xff0c;将“Following”和“For Yo…

Django连接数据库

连接数据库 接下来讲的几个步骤不需要区分先后&#xff0c;但都得进行操作 settings.py的操作 #!settings.py ....别的代码DATABASES {default: { ENGINE: django.db.backends.mysql, NAME: day1121, # 数据库名字&#xff0c;要先创建好 USER: root, PASSWORD: 123456, HO…

解决Unable to preventDefault inside passive event listener invocation.报错

报错信息&#xff1a; 这个报错大致说的是&#xff1a;无法在被动事件侦听器调用中防止Default 查了其他博主的解决办法&#xff1a;比如&#xff1a; 1、声明事件监听的时候设置为主动事件监听&#xff1a; window.addEventListener(‘touchmove’, handler, { passive: fal…

【方法】PowerPoint如何删除“限制编辑”?

如果PPT文件设置成“只读模式”&#xff0c;就会被限制编辑&#xff0c;也就是无法对PPT进行编辑或更改&#xff0c;那要如何删除这个“限制”呢&#xff1f; 下面小编会按照“无密码的只读方式”、“有密码的只读方式”以及“忘记了密码的只读方式”这3种情况&#xff0c;来说…

LabVIEW使用软件定义进行汽车电子测试

LabVIEW使用软件定义进行汽车电子测试 电子元件的逻辑和稳健性一直都是需要评估的对象。过去&#xff0c;汽车仅使用几种电子元件来执行简单的功能&#xff0c;每个元件都是在专门准备的环境中单独进行的。但随着电子元件日益多样化&#xff0c;且功能日益复杂&#xff0c;这种…

Vue修改密码功能的源代码

基本需求 输入框不能为空 旧密码表单提交时必须正确 两次输入新密码一致 限定新密码的复杂度&#xff0c;这里是长度在 6 到 20 个字符 <template><el-form ref"form" :model"user" :rules"rules" label-width"80px"><…

postgres在docker中使用

记录个人开发过程中postgres在docker中的使用&#xff0c;以便后续查看。 Dockerfile 个人是在M1电脑上开发&#xff0c;所以platform使用linux/amd64来兼容amd芯片。 FROM --platformlinux/amd64 postgres:16.1-alpine COPY ./poetrydb.sql /docker-entrypoint-initdb.d/po…

Jira Software最新版本(9.11.2)安装

软件获取 Jira Software 历史版本下载地址&#xff1a;Jira Server 下载存档 | Atlassian Atlassian-agent.jar https://github.com/haxqer/confluence/releases/download/v1.3.3/atlassian-agent.jar MySQL 驱动包 MySQL :: Download MySQL Connector/J (Archived Versio…

用Sublime编写Lua脚本

大家好&#xff0c;我是阿赵。   现在很多手游项目使用lua作为热更新的代码脚本&#xff0c;我一直很喜欢用Sublime来写lua程序。喜欢使用它的原因是它的轻量化&#xff0c;因为我经常要同时打开多个项目&#xff0c;Unity和VisualStudio这些软件都比较占用电脑的性能&#x…

Pycharm修改文件默认打开方式 + CSV Editor插件使用

1、File —> Settings —> Editor —> File Types 然后将*csv添加到最上面 在plugins中下载插件&#xff0c;CSV Editor 备注&#xff1a;不在上一步的“File Types”中将*.csv设置为CSV格式&#xff0c;插件是不起作用的 就可以使用了

微服务学习|初识elasticsearch、操作索引库、文档操作、RestClient操作索引库、RestClient操作文档

初识elasticsearch 什么是elasticsearch&#xff1f; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack (ELK)。被广泛应用在日志数据分析、实…

图书管理系统源码,图书管理系统开发,图书借阅系统源码配置和运行图解源码已附加

目录 配置简介和软件条件 数据库附件配置 vs应用程序web.config配置数据库链接字符串 数据库文件脚本代码 配置简介和软件条件 所需要的软件是Vs2017以上数据库是Sqlserver2012以上&#xff0c;如果数据库附件不了可以使用数据库脚本附件数据库脚本会在文章末尾写出来。可以…

TableAgent:首个国产可私有部署的企业级Code Interpreter

TableAgent公测地址&#xff1a;https://tableagent.DataCanvas.com 数字化时代&#xff0c;数据分析的重要性犹如空气般无处不在。商业数据分析是数字化管理、智能决策的基础&#xff0c;同时数据分析又是一个专业性极强的工作&#xff0c;描述性分析、诊断性分析、预测性分…

【经验贴】技术转项目经理,利用项目管理工具快速适应!

之前分享了我在项目管理过程中的一些实战经验&#xff0c;大家纷纷表示感同身受。其中&#xff0c;有一部分技术转项目经理岗位的小伙伴吐槽现在加的班比以前更多、工作更难开展了&#xff0c;想问问如何能快速适应新的工作岗位。 我们公司这几年随着业务的不断增加&#xff0c…