Java实现生成csv文件并导入数据

2023-11-17

一、需求:

        下载列表,在没有过滤之前下载列表所有数据,点击过滤之后,下载过滤之后对数据,生成csv文件。

二、思路:

        先根据条件(是否过滤了数据)筛选出数据,将数据导入csv文件,生成文件并返回。

三、代码实现:

1、controller层

 /**
     * 文件下载(失败了会返回一个有部分数据的Excel)
     * <p>
     * 1. 创建excel对应的实体对象
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然外面再关闭流问题不大
     */
    @ApiOperation(value = "downloadCSV", notes = "download solution")
    @CactusAction(url = "api/downloadCSV", method = HttpMethod.POST)
    @PostMapping("/downloadCSV")
    public void downloadAndJudgeFilter(HttpServletResponse response, HttpServletRequest request
            ,@ApiIgnore CactusContext context, @Validated @RequestBody OrderSolutionDownloadDTO downloadDTO) throws IOException {
        //-------传入参数根据自己的传  CactusContext为获取到用户信息-------OrderSolutionDownloadDTO为查询的参数dto--------
        //-------这一块------ 根据自己的条件筛选出需要导出的数据 ---------------
        JSONObject criteria = null;
        if(downloadDTO.getFilterId() > 0){
            Filters filter = filtersService.getOne(Wrappers.<Filters>lambdaQuery().eq(Filters::getAccountId, context.getAccountId())
                    .eq(Filters::getCreatorId, context.getUserId()).eq(Filters::getId, downloadDTO.getFilterId()));
            if (Objects.nonNull(filter)){
                criteria = JSONObject.parseObject(filter.getCriteria());
            }
        }else{
            criteria = JSONObject.parseObject(downloadDTO.getF());
        }
        List<SolutionDocument> solutionDocuments = returnAndRefundListService.downloadAndJudgeFilter(context, criteria);
        // --------------数据为List集合solutionDocuments------------------------------
        // ----------将数据传入ExportCsvUtils中
        ExportCsvUtils.exportCsv(response,request,solutionDocuments);

    }

2、ExportCsvUtils

import com.shulex.cloud.platform.ticket.consts.SolutionListConstants;
import com.shulex.cloud.platform.ticket.es.document.SolutionDocument;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
  * @Author: c
  * @Description:
  * @Date:  2022/4/13
  */
public class ExportCsvUtils {

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

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

    /**
     * export csv
     * @param response
     * @param request
     * @param  list
     * SolutionListConstants为自定义的表头常量类
     */
    public static void exportCsv(HttpServletResponse response, HttpServletRequest request
            , List<SolutionDocument> list){
        // 设置表格头
        Object[] head = {SolutionListConstants.TICKET_NUMBER,SolutionListConstants.TICKET_CREATE_DATE,
                SolutionListConstants.CUSTOMER_EMAIL,SolutionListConstants.CUSTOMER_NAME,
                SolutionListConstants.PLATFORM,SolutionListConstants.MARKET,SolutionListConstants.SELLER,
                SolutionListConstants.ORDER_PURCHASE_DATE,SolutionListConstants.ORDER_NUMBER,
                SolutionListConstants.PRODUCT_CATEGORY,SolutionListConstants.SKU,SolutionListConstants.ITEMS,
                SolutionListConstants.SKU_QUANTITY,SolutionListConstants.SKU_AMOUNT,
                SolutionListConstants.SOLUTION_CREATE_DATE,SolutionListConstants.SOLUTION_TYPE,
                SolutionListConstants.SOLUTION_QUANTITY,SolutionListConstants.SOLUTION_AMOUNT,
                SolutionListConstants.CURRENCY,SolutionListConstants.SOLUTION_NOTE};
        List<Object> headList = Arrays.asList(head);

        List<List<Object>> dataList = getNovel(list);
        // 导出文件路径
        String downloadFilePath = request.getSession().getServletContext().getRealPath("");
        // 导出文件名称
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");

        String fileName = "solution_List_"+ LocalDate.now()+"_"+dtf.format(LocalDateTime.now());

        // 导出CSV文件
        File csvFile = ExportCsvUtils.createCSVFile(headList, dataList, downloadFilePath, fileName);

        try {
            // 取得文件名。
            String filename = csvFile.getName();
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
            // 以流的形式下载文件。
            FileInputStream fis = new FileInputStream(csvFile);
            // 设置response的Header
            String userAgent = request.getHeader("User-Agent");
            // 针对IE或者以IE为内核的浏览器:
            if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
                filename = java.net.URLEncoder.encode(filename, "UTF-8");
            } else {
                // 非IE浏览器的处理:
                filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
            }
            response.setHeader("Content-disposition",String.format("attachment; filename=\"%s\"", filename));
            response.setContentType("multipart/form-data");
            response.setCharacterEncoding("UTF-8");

            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");

            int content = 0;
            while ((content = fis.read()) != -1) {
                toClient.write(content);
            }
            fis.close();
            toClient.flush();
            toClient.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    /**
     * 导入的数据
     * @param list
     * @return
     */
    private static List<List<Object>> getNovel(List<SolutionDocument> list) {
        List<List<Object>> dataList = new ArrayList<List<Object>>();
        List<Object> rowList = null;
        // 1000000 data spent 13s
        if (list != null && list.size() > 0) {
            for (int i = 0; i < list.size(); i++) {
                rowList = new ArrayList<Object>();
                Object[] row = new Object[20];
                // 根据表头列数对应相应的数据
                row[0] = list.get(i).getTicketNumber();
                row[1] = list.get(i).getTicketCreateDate();
                row[2] = list.get(i).getCustomerEmail();
                row[3] = list.get(i).getCustomerName();
                row[4] = list.get(i).getPlatform();
                row[5] = list.get(i).getMarket();
                row[6] = list.get(i).getSeller();

                row[7] = list.get(i).getOrderPurchaseDate();
                row[8] = list.get(i).getOrderNumber();
                row[9] = list.get(i).getProductCategory();
                row[10] = list.get(i).getSku();
                row[11] = list.get(i).getItems();
                row[12] = list.get(i).getSkuQuantity();
                row[13] = list.get(i).getSkuAmount();

                row[14] = list.get(i).getSolutionCreateDate();
                row[15] = list.get(i).getSolutionType();
                row[16] = list.get(i).getSolutionQuantity();
                row[17] = list.get(i).getSolutionAmount();
                row[18] = list.get(i).getCurrency();
                row[19] = list.get(i).getSolutionNote();

                for(int j=0;j<row.length;j++){
                    rowList.add(row[j]);
                }
                dataList.add(rowList);
            }

        }

        return dataList;
    }


    /**
     *  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
     * CSV文件生成方法
     * @param head
     * @param dataList
     * @param outPutPath
     * @param filename
     * @return
     */
    public static File createCSVFile(List<Object> head, List<List<Object>> dataList,String outPutPath, String filename) {
        File csvFile = null;
        BufferedWriter csvWriter = null;
        try {
            csvFile = new File(outPutPath + File.separator + filename + ".csv");
            File parent = csvFile.getParentFile();
            if (parent != null && !parent.exists()) {
                parent.mkdirs();
            }
            csvFile.createNewFile();

            // GB2312使正确读取分隔符","
            csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile),
                    "GB2312"), 1024);

            // 测试乱码-------
//            csvWriter.write('\ufeff');

//            csvWriter.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));
            // --------------

            // 写入文件头部
            writeRow(head, csvWriter);
            // 写入文件内容
            for (List<Object> row : dataList) {
                writeRow(row, csvWriter);
            }
            csvWriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                csvWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return csvFile;
    }

    /**
     * 写一行数据方法
     * @param row
     * @param csvWriter
     * @throws IOException
     */
    private static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException {
        // 写入文件头部
        for (Object data : row) {
            StringBuffer buf = new StringBuffer();
            String rowStr =  buf.append("\"").append(data).append("\t\",").toString();
            csvWriter.write(rowStr);
        }
        csvWriter.newLine();
    }

}

3、SolutionListConstants常量类

/**
  * @Author: c
  * @Description:
  * @Date:  2022/4/13
  */
public class SolutionListConstants {

    private SolutionListConstants() {
    }

    public static final String TICKET_NUMBER = "Ticket Number";
    public static final String TICKET_CREATE_DATE = "Ticket Create Date";
    public static final String CUSTOMER_EMAIL = "Customer Email";
    public static final String CUSTOMER_NAME = "Customer Name";
    public static final String PLATFORM = "Platform";
    public static final String MARKET = "Market";
    public static final String SELLER = "Seller";

    public static final String ORDER_PURCHASE_DATE = "Order Purchase Date";
    public static final String ORDER_NUMBER = "Order Number";
    public static final String PRODUCT_CATEGORY = "Product Category";
    public static final String SKU = "SKU";
    public static final String ITEMS = "Items";
    public static final String SKU_QUANTITY = "SKU Quantity";
    public static final String SKU_AMOUNT = "SKU Amount";

    public static final String SOLUTION_CREATE_DATE = "Solution Create Date";
    public static final String SOLUTION_TYPE = "Solution Type";
    public static final String SOLUTION_QUANTITY = "Solution Quantity";
    public static final String SOLUTION_AMOUNT = "Solution Amount";
    public static final String CURRENCY = "Currency";
    public static final String SOLUTION_NOTE = "Solution Note";
}

四、总结

        由于需要传入参数,使用的是post请求,但前端弄了一天下载的数据会出现中文乱码(后端提供的这个接口通过postman测试下载的文件是完好的)遇到这个问题,不要再使用这个方法,请查看我使用的easyExcel生成excel文件的方法,强行将本文中导出的csv文件格式改成.xlsx会导致数据全部在一行,出现问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实现生成csv文件并导入数据 的相关文章

  • 将所有 BigDecimal 运算设置为特定精度?

    我的Java程序以高精度计算为中心 需要精确到至少120位小数 因此 程序中所有非整数都将由 BigDecimal 表示 显然 我需要指定 BigDecimal 的舍入精度 以避免无限小数表达式等 目前 我发现必须在 BigDecimal
  • Junit Mockito 测试一切

    我现在正在寻找更多时间但没有结果 请帮忙 这是我要测试的课程 public class DBSelectSchema extends Database private static final Logger LOG Logger getLo
  • 我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重

    我在解决我的练习时遇到问题 我读到了动态规划和算法 我认为我的练习是 特定背包问题 我用暴力法解决了它 但我无法用动态规划解决它 我有一艘重300吨的船 背包 有些晶体本身含有 3 种物质 X Y Z 每种物质都有重量 并且所有晶体都具有相
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • Java 相当于 Perl 的 s/// 运算符?

    我有一些代码正在从 Perl 转换为 Java 它大量使用了正则表达式 包括s 操作员 我已经使用 Perl 很长时间了 但仍然习惯 Java 的做事方式 特别是 字符串似乎更难使用 有谁知道或有一个完全实现的Java函数s 这样它就可以处
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • IntSummaryStatistics的summaryStatistics方法

    为什么空 IntStream 上的 summaryStatistics 方法返回整数的最大和最小值作为流中存在的最大和最小 int 值 IntStream intStream IntStream of IntSummaryStatistic
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • 处理 ANTLR 4 中的错误

    遵循后接受的答案 https stackoverflow com a 18137301 2279200的指示处理 ANTLR4 中的错误 https stackoverflow com q 18132078 2279200问题 我遇到了以下
  • “未找到 JAVA 路径。请检查 JAVA 是否已安装。”初始化 RSelenium 时出错

    我正在尝试启动一个 RSelenium 会话到 webscrape 但是 当运行此代码时 driver lt rsDriver browser c chrome chromever 76 0 3809 126 port 4444L 我收到此
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • 属性文件中的字符串主机名:Java

    这听起来可能是一个非常简单的问题 但我无法找到解决方法 我有一个 config properties 文件 其中包含两个键值 IP 地址和端口号 我读取此配置文件以提取字符串格式的键值 但是 当我尝试使用这些值时 我无法连接到从配置文件中检
  • iText7 将 SVG 添加到 PdfDocument 中以及可能出现的问题

    关于问题的答案 如何使用 iText7 将 SVG 添加到 PDF 这是一个链接点击这里 https stackoverflow com questions 50059456 how to add an svg to a pdf using
  • 如何在不同的班级中启动和停止计时器?

    我想测量从传入 HTTP 请求开始到应用程序到达某个点的时间 这两个时间点都位于不同的类中 我将如何启动和停止这些不同类别的计时器 我没有看到使用 MeterRegistry 中的 命名 计时器的方法 我该怎么办呢 您可以使用 AOP 如下
  • 通过 ssh 发送命令并读取输出结果

    我有代码通过 ssh 连接到远程服务器并向其发送 2 个或更多命令 例如 cd export home ops bin和 viewlinkload time 20131205 19 但我没有看到命令执行 也没有收到结果 我需要获取服务器返回
  • Java“非法访问操作”方法将被弃用? [复制]

    这个问题在这里已经有答案了 JDK 9 JVM 发出非法访问操作警告后 如果您使用一些非法访问 例如setAccessible 我的问题 Is setAccessible 以后会被封吗 此功能的官方参考 如果将被弃用 在哪里 我在任何地方都
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 在没有 ODBC 的情况下从 Java 操作 Access 数据库

    我想从我的 Java 项目操作 Microsoft Access 数据库 accdb 或 mdb 文件 我不想使用 Microsoft 的 JDBC ODBC Bridge 和 Access ODBC 驱动程序 因为 JDBC ODBC 桥

随机推荐

  • py去除文件空行

    去除d0 txt中空行并保存在d1 txt 如果要删除带有空格的空行 可以考虑把判断条件换成正则 with open d0 txt r encoding utf 8 as f open d1 txt w encoding utf 8 as
  • cloudstack api调度流程

    cloudstackapi调度流程 我们发往cloudstack的api命令由management端的ApiServlet的processRequest req resp 进性处理 该函数开启一个线程进行处理 对于login和logout命
  • Qt将程序打包成.exe文件,并添加图标

    1 在工程中添加一个Qt Resource File 文件名任意 2 将 ico后缀的图片放到跟工程文件 pro 文件同目录下 并在Qt Resource File文件中添加该 ico文件 3 添加相关代码 设置窗口图标 4 双击打开 pr
  • CMake入门教程:使用target_include_directories指定头文件目录

    CMake入门教程 使用target include directories指定头文件目录 在进行软件开发时 我们经常需要引用一些外部库或模块的头文件以便使用其功能 CMake是一个强大的跨平台构建工具 能够帮助我们管理项目并生成相应的构建
  • WSL2 局域网访问以及hosts注意事项

    说明 WSL2用的是NAT方式 虚拟机有内部的ip 所以访问虚拟机可用代理访问方法 要点 根据微软文档 powershell 下做端口转发代理 netsh interface portproxy add v4tov4 listenport
  • 双引号后面要加句号吗_小学二年级老师容易疏忽的一个知识点:冒号和双引号...

    标点符号是特殊的文字 使用得当 会为文章增色不少 同时也是考试丢分的一个知识点 应引起师生重视 到了小学二年级 必须学会使用冒号和双引号 冒号 是常用的标点符号之一 通常表示提示语后的停顿或表示提示下文或总结上文 它用在提示语的后面 如果老
  • 用Python写一个比大小的小游戏(代码解释)

    代码解释 游戏 猜数字 玩法 程序会随机生成一个1 30的数字 玩家有无限次 机会去猜这个数字程序会告诉你是大了还是小了 在最后猜中的时候程序会告诉你猜中了 并且告诉你结束游戏以及猜中该数字所花费的次数 代码 Python import r
  • PyTorch的官方bug:torch.optim.lr_scheduler.CosineAnnealingWarmRestarts

    torch optim lr scheduler CosineAnnealingWarmRestarts 低版本 如torch1 7 1 指定last epoch参数时报错 已有人反馈指出 升级torch1 11 0可以解决该问题 升级之后
  • Python数据可视化——图型参数介绍

    前言 利用Python 绘制常见的统计图形 例如条形 图 饼图 直方图 折线图 散点图等 通过这些常用图形的展现 将 复杂的数据简单化 这些图形的绘制可以通过matplotlib 模块 pandas 模 块或者 seaborn 模块实现 饼
  • java 垃圾回收 sys_深入理解Java虚拟机学习笔记2.1-G1垃圾回收

    G1 GC是Jdk7的新特性之一 Jdk7 版本都可以自主配置G1作为JVM GC选项 作为JVM GC算法的一次重大升级 DK7u后G1已相对稳定 且未来计划替代CMS 所以有必要深入了解下 不同于其他的分代回收算法 G1将堆空间划分成了
  • springmvc中的resolveView(视图解析器)

    视图解析器接口只有一个方法 就是根据名称解析出视图信息 一个视图对象View 采用的是模板模式 抽象模板类 AbstractCachingViewResolver 主要处理缓存 如果视图对象在缓存中有 则从缓存中取 如果没有则创建 publ
  • 整理最全的图床集合——三千图床

    2021 09 25 更新 去除部分图床 添加新的图床 优化排版 引言 古有弱水三千 今有三千图床 勿埋我心 图床一般是指储存图片的服务器 有国内和国外之分 国外的图床由于有空间距离等因素决定访问速度很慢影响图片显示速度 国内也分为单线空间
  • remote: HTTP Basic: Access deniedfatal: Authentication failed for ‘xxxxx‘的问题解决

    在没有修改git密码的情况下 使用vs code推送代码 总是会报错 remote HTTP Basic Access denied fatal Authentication failed for xxxxxxxx git仓库地址 网上试了
  • YOLOV7开源代码讲解--训练参数解释

    目录 训练参数说明 weights cfg data hpy epoch batch size img size rect resume nosave notest noautoanchor evolve bucket cach image
  • 【Basis】狄利克雷分布

    初次看狄利克雷分布 比较懵 主要是它有很多先行知识 所以我先介绍狄利克雷分布用到的多项式分布 gamma 函数 beta分布 然后再介绍狄利克雷分布 参考文献见文章末 目录 一 多项式分布 multinomial distribution
  • 仅仅是一张照片就是不能刷脸支付的

    科技改变未来并不是一句口号 就拿买东西来讲 以前人们都是一手交钱一手交货 拿到大额的纸币 还要验真假 而现在移动支付成为主要付款方式 只要一部手机 扫一扫就能付款 一开始也有很多人不习惯手机支付 因为觉得没有现金实在 整天就是一堆数字转来转
  • 解决TypeError: 'function' object is not subscriptable

    一 解决问题 在tensorflow中使用零矩阵初始化变量的时候出现的该异常 TypeError function object is not subscriptable 二 解决方法 问题代码如下 bias tf Variable tf
  • 深度学习(9):Inception危险物品检测

    目标 基于Inception网络实现对危险物品检测 将危险物品图片或视频经过图像预处理后输入模型推理 最后将检测结果进行可视化输出 一 原理 Google的Inception网络介绍 Inception为Google开源的CNN模型 至今已
  • Java的变量

    1 Java 变量类型 答 在Java语言中 所有的变量在使用前必须声明 声明变量的基本格式如下 type identifier value identifier value 格式说明 type为Java数据类型 identifier是变量
  • Java实现生成csv文件并导入数据

    一 需求 下载列表 在没有过滤之前下载列表所有数据 点击过滤之后 下载过滤之后对数据 生成csv文件 二 思路 先根据条件 是否过滤了数据 筛选出数据 将数据导入csv文件 生成文件并返回 三 代码实现 1 controller层 文件下载