java中csv导出-追加-列转行

news2025/1/15 12:42:30

1、问题描述

业务数据量比较大,业务上查询条件写入数据库,java定时去读,然后导出csv,供用户下载,因为有模板要求,前一部分是统计信息,后一部分是明细信息;首先csv中写入统计信息,然后再追加明细信息,记录下;

2、问题说明

2.1 pom文件

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.6</version>
        </dependency>     

2.2 上代码

   public static void doExportCsv(List<String> titleList, List<LinkedHashMap<String, String>> contextList, String absFilePath) {
        FileOutputStream fileOutputStream = null;
        OutputStreamWriter outputStreamWriter = null;
        try {
            //获取文件流
            fileOutputStream = new FileOutputStream(absFilePath);
            //解决FileOutputStream中文乱码问题  解决MS office乱码问题
            //outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");
            outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK");
            String[] header = new String[titleList.size()];
            for (int i = 0; i < titleList.size(); i++) {
                String title = titleList.get(i);
                header[i] = title;
            }
            //默认头字段
            CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader(header);
            CSVPrinter csvPrinter = new CSVPrinter(outputStreamWriter, csvFormat);

            for (Map<String, String> map : contextList) {
                csvPrinter.printRecord(map.values());
            }
            csvPrinter.flush();
            csvPrinter.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (outputStreamWriter != null) {
                    outputStreamWriter.close();
                }
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

    public static void doAppendCsv(List<String> titleList, List<LinkedHashMap<String, String>> contextList, String absFilePath) {
        BufferedWriter writer = null;
        try {
            //解决乱码,gbk
            writer = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (absFilePath,true),"GBK"));
            String[] header = new String[titleList.size()];
            for (int i = 0; i < titleList.size(); i++) {
                String title = titleList.get(i);
                header[i] = title;
            }
            //表头
            CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader(header);
            //默认第一行是头字段
            //CSVFormat csvFormat = CSVFormat.DEFAULT.withFirstRecordAsHeader();
            CSVPrinter csvPrinter = new CSVPrinter(writer, csvFormat);
            for (Map<String, String> map : contextList) {
                csvPrinter.printRecord(map.values());
            }
            csvPrinter.flush();
            csvPrinter.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

说明:

(1)两个方法,doExportCsv是第一次生成的,doAppendCsv是追加的,客户的服务器是windows的,所以代码里面采用的gbk;

(2)至于入参吗,其实就是三个,一个表头,一个内容,一个路径三个参数;

小王这里有点特别的点,list里面是LinkedHashMap<String, String>,老王项目中要行转列,简单说就是要行转换成列进行展示,如下:

mysql行转列sql,下面sql的功能:

一是增加个序列,方便用户查看;

二是按照时间戳,将多个节点信息,按照时间戳行展示;

select (@i:=@i+1) AS '序号', t2.* from (select t1.SJGL_SJC as '时间戳' , 
MAX(CASE t1.SJGL_DWMC WHEN'2127PQ'THEN t1.SJGL_DWZ ELSE 0 END )2127PQ,
MAX(CASE t1.SJGL_DWMC WHEN'2128PQ'THEN t1.SJGL_DWZ ELSE 0 END )2128PQ,
MAX(CASE t1.SJGL_DWMC WHEN'3268PQ'THEN t1.SJGL_DWZ ELSE 0 END )3268PQ from zy_sjgl t1 WHERE
 t1.SJGL_SJC >= '2022-10-01 00:00:00' and t1.SJGL_SJC <= '2022-11-10 10:11:00' and t1.SJGL_DWMC 
in ('2127PQ','2128PQ','3268PQ') group by t1.SJGL_SJC order by t1.SJGL_SJC asc) t2,(SELECT @i:=0) AS itable limit 500000;

2.3 调用入参

这里需要用LinkedHashMap,否则导出的数据会乱序;

2.3.1 mybatis配置

  <select id="selectStatisSjgls" parameterType="java.util.Map" resultType="java.util.LinkedHashMap">
      </select>

2.3.2 java代码

List<LinkedHashMap<String, String>> statisSjgls =sjglMapper.selectStatisSjgls(queryMap);

List<String> stitleList = new ArrayList<>();
stitleList.add("点名");
stitleList.add("描述");
stitleList.add("最大值");
stitleList.add("最小值");
stitleList.add("平均值");
statisSjgls.add(new LinkedHashMap<>());
statisSjgls.add(new LinkedHashMap<>()); //模板格式,空两行再显示明细信息
            

2.4.最终效果


更多信息请关注公众号:「软件老王」,关注不迷路,软件老王和他的IT朋友们,分享一些他们的技术见解和生活故事。

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

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

相关文章

gradle安装配置

Gradle和Maven都是当前热门的自动化构建工具。 这里以安装6.8版本为例 下载地址 https://services.gradle.org/distributions/ 环境配置 新建系统环境 GRADLE_HOME D:\software\gradle-6.8 新建系统环境 GRADLE_USER_HOME D:\gradle\repository 找到path变量,后面添加 %…

uniapp 短信监听(验证码)插件 Ba-Sms

简介&#xff08;下载地址&#xff09; Ba-Sms 是一款用于拦截实时短信的插件&#xff0c;可以进行短信过滤&#xff0c;得到自己想要的内容&#xff0c;可以用于需要自动填写短信验证码的项目 支持监听当前接收到的短信信息支持过滤接收到的短信&#xff0c;默认过滤4~8位的…

Python学习笔记之进程池pool

平时很多操作都会用到多进程&#xff0c;比如爬虫、数据处理。 下面介绍一下多进程的函数方法、参数及使用方法。 目录 一.进程池Pool介绍 1.apply() 2.apply_async 3.map() 4.map_async() 5.close() 6.terminal() 7.join() 二&#xff0e;进程池Pool使用 1.map用法…

【虚幻引擎UE】UE5 材质动态修改的2种方法(含工程源码)

演示效果&#xff1a; 示例工程源码 一、直接材质参数变量 1、贴图变量&#xff1a; 在材质蓝图中右键&#xff0c;创建变量TextureSampeParameter2D&#xff08;贴图变量&#xff09;。 输入RGB到基础颜色 2、单色变量&#xff1a; 在材质蓝图中右键&#xff0c;创建变量…

[附源码]计算机毕业设计springboot高校商铺管理系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

要想后期修改少,代码重构要趁早

摘要&#xff1a;在敏捷中&#xff0c;让设计简单化&#xff0c;必须让设计从简单开始&#xff0c;然后变得成熟。要做到这一点&#xff0c;重构是唯一的出路。本文分享自华为云社区《敏捷技术实践之重构》&#xff0c;作者&#xff1a;华为云PaaS服务小智 。 前言 极限编程&…

Flink Forward Asia 2022 主论坛概览

2022 年 11 月 26-27 日&#xff0c;Flink Forward Asia&#xff08;FFA&#xff09;峰会成功举行。Flink Forward Asia 是由 Apache 软件基金会官方授权、由阿里云承办的技术峰会&#xff0c;是目前国内最大的 Apache 顶级项目会议之一&#xff0c;也是 Flink 开发者和使用者的…

使用nohup命令 或者 代码创建守护进程

目录 一、什么是守护进程&#xff1f; 1、守护进程的概念 2、为什么需要守护进程 二、理解进程组、会话、终端 三、创建守护进程的两种方式 1、nohup命令创建守护进程 2、代码创建守护进程 (1) 创建子进程&#xff0c;父进程退出 (2) 子进程创建新的会话 (3) 更改守护…

jsp美食共享平台系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 美食共享平台系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用mvc开发结构 serlvetdaobean模式&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.0,Myecl…

二叉树链式结构-c语言实现

文章目录二叉树链式结构实现1. 链式二叉树结构2. 二叉树的遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历2.4 层序遍历3. 常见功能3.1 二叉树结点个数3.2 二叉树叶子结点个数3.3 第K层结点的个数3.4 二叉树的深度3.5 判断是不是树是不是完全二叉树3.6 在二叉树中查找值为x的结点3.7…

VM系列振弦采集读数模块的测量模式

VM系列振弦采集读数模块的测量模式 模块有连续测量和单次测量两种测量模式&#xff0c; 通过向测量模式寄存器 WKMOD.[0]写入 1 使模块工作于连续测量工作模式&#xff0c; 写入 0 使模块工作于单次测量工作模式。 WKMOD.[15]用来设置是否在模块“ 忙” 时禁用数字接口&#xf…

京东低代码平台:水滴表单联动可视化配置的实现与思考

TL;DR drip-form在0.9.0的alpha版支持了可视化配置联动的功能&#xff08;仍在测试中&#xff09;drip-form通过协议到代码的转换&#xff0c;尽可能降低常见联动配置的开发成本探讨&#xff1a;JSON diff动态生成常见联动和校验drip form的后续更新&#xff1a;v0.9.0是v0最后…

计算机组成原理-总线详细讲解(持续更新中)

总线概念与分类 定义 总线是一组能为多个部件分时共享的公共信息传送线路 共享是指总线上可以挂接多个部件&#xff0c;各个部件之间互相交换的信息都可以通过这组线路分时共享。 分时是指同一时刻只允许有一个部件向总线发送信息&#xff0c;如果系统中有多个部件&#xf…

React源码分析1-jsx转换及React.createElement

jsx 的转换 我们从 react 应用的入口开始对源码进行分析&#xff0c;创建一个简单的 hello, world 应用&#xff1a; import React, { Component } from react; import ReactDOM from react-dom; export default class App extends Component {render() {return <div>h…

科普下抖音的规则,为什么别人的内容很容易火,而我的很难?

今天给大家科普下抖音的规则&#xff0c;为什么别人的内容很容易火&#xff0c;而我的很难&#xff1f; 上一篇给大家讲了现在做抖音还来得及么&#xff1f;肯定的回答&#xff0c;一直都来得及。 既然来得及&#xff0c;那么我们怎么才能做好抖音呢&#xff1f; 在我看来&a…

Rust 基础(四)

十、泛型、Traits和生命周期 每种编程语言都有有效处理概念重复的工具。在Rust中&#xff0c;一个这样的工具就是泛型:具体类型或其他属性的抽象替身。我们可以表达泛型的行为&#xff0c;或者它们如何与其他泛型相关联&#xff0c;而不知道在编译和运行代码时它们的位置会是什…

[C++]C++入门--引用

​ &#x1f941;作者&#xff1a; 华丞臧 &#x1f4d5;​​​​专栏&#xff1a;【C】 博主Gitee 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎>在评论区指出。 推荐一款刷题网站 &#x1f449;LeetCode…

IPv6进阶:IPv6 过渡技术之IPv6 over IPv4 手动隧道

实验拓扑 R1-R3-R2之间的网络为IPv4环境&#xff1b;PC1及PC2处于IPv6孤岛。 实验需求 R1及R2为IPv6/IPv4双栈设备&#xff1b;在R1及R2上部署IPv6 over IPv4手工隧道使得PC1及PC2能够互相访问。 配置及实现 R3的配置如下 [R3] interface GigabitEthernet0/0/0 [R3-Gigabi…

【Java实战】工作中如何规范控制语句

目录 一、前言 二、控制语句规范 1.【强制】使用switch注意事项 2.【强制】当 switch 括号内的变量类型为 String 并且此变量为外部参数时&#xff0c;必须先进行 null 判断。 3.【强制】在 if / else / for / while / do 语句中必须使用大括号。 4.【强制】三目运算符高…

[附源码]计算机毕业设计springboot本地助农产品销售系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…