Csv--01--ExportUtil 写文件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • ExportUtil
  • 案例: ExportUtil.writeCsvFile


ExportUtil

import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StopWatch;import javax.annotation.PostConstruct;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;@Component
public class ExportUtil {private final static Logger logger = LoggerFactory.getLogger(ExportUtil.class);/*** 导出文件存储路径*/
//    public static String defaultRootPath = System.getProperty("user.dir") + File.separator;/*** set注入配置*/private static String folder;@Value("${download.folder:download-file}")public void setFolder(String folder){ExportUtil.folder = folder;}/*** 失败日志保存地址(生产环境必须使用共享盘),eg:D:\tuzhan_zhonghang_worksp\goods_media\import_error.csv**/private static String importFailLogDirectory;/** CSV文件列分隔符 */private static final String CSV_COLUMN_SEPARATOR = ",";/** CSV文件列分隔符 */private static final String CSV_RN = "\r\n";/**CSV文件编码*/private static final String CSV_CODE="gbk";@PostConstructpublic void init() {// 共享文件夹初始化importFailLogDirectory = folder + File.separator + "goods_media" + File.separator;}/**** @param fileName* @param headerList* @param filePath* @param dataList*/public static void writeCsvFile(String fileName,List<List<Object>> headerList,String filePath, List<List<Object>> dataList) {writeCsvFile(fileName,headerList,filePath,dataList,false);}public static void writeCsvFile(String fileName,List<List<Object>> headerList,String filePath, List<List<Object>> dataList,boolean append){BufferedWriter csvWriter = null;File file = new File(filePath);try {csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file,append), StandardCharsets.UTF_8), 1024);//解决csv导出文件,中文乱码//以csv方式导出的文件中默认不含BOM信息,通过给将要输出的内容设置BOM标识(以 EF BB BF 开头的字节流)即可解决该问题csvWriter.write(new String(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}));for (List<Object> header : headerList) {writeRow(header, csvWriter);}if(CollectionUtils.isEmpty(dataList)){writeRow(Lists.newArrayList("未查找到符合条件的数据,请修改查询条件"),csvWriter);}else{for (List<Object> row : dataList) {writeRow(row, csvWriter);}}csvWriter.flush();} catch (Exception e) {logger.error("生成csv文件错误=【{}】", e);} finally {try {if (csvWriter != null) {csvWriter.close();}} catch (IOException e) {e.printStackTrace();}}logger.info("文件生成完成,文件名称:{}", file.getName());}public static void createCsvFile(String fileName,List<List<Object>> headerList,String rootPath, List<List<Object>> dataList){// 声明文件路径及名称if(rootPath==null){rootPath = importFailLogDirectory;}logger.info("导出路径=【{}】",rootPath);File folder = new File(rootPath);if(!folder.exists() && !folder.isDirectory()){folder.mkdirs();}File csvFile = new File(rootPath + fileName + ".csv");BufferedWriter csvWriter = null;try {csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), StandardCharsets.UTF_8), 1024);//解决csv导出文件,中文乱码//以csv方式导出的文件中默认不含BOM信息,通过给将要输出的内容设置BOM标识(以 EF BB BF 开头的字节流)即可解决该问题csvWriter.write(new String(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}));for (List<Object> header : headerList) {writeRow(header, csvWriter);}for (List<Object> row : dataList) {writeRow(row, csvWriter);}csvWriter.flush();} catch (Exception e) {logger.error("生成csv文件错误=【{}】", e);} finally {try {if (csvWriter != null) {csvWriter.close();}} catch (IOException e) {}}logger.info("文件生成完成,文件名称:{}", csvFile.getName());}public static void createCsvFile(List<List<Object>> headerList,String fileName, List<List<Object>> dataList) {createCsvFile(fileName,headerList,null,dataList);}/*** 导出并下载* @param fileName* @param headerList* @param dataList*/public static void exportAndDownLoadCsvFile(String fileName, List<List<Object>> headerList,List<List<Object>> dataList, HttpServletResponse response) throws IOException {BufferedWriter csvWriter = null;ServletOutputStream fileOutputStream;response.setContentType("application/vnd.ms-excel;charset=utf-8");if(fileName!=null && fileName.endsWith(".csv")){response.addHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));} else {response.addHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".csv");}fileOutputStream = response.getOutputStream();StopWatch stopWatch = new StopWatch();stopWatch.start();try {csvWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8), 1024);//解决csv导出文件,中文乱码//以csv方式导出的文件中默认不含BOM信息,通过给将要输出的内容设置BOM标识(以 EF BB BF 开头的字节流)即可解决该问题csvWriter.write(new String(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}));for (List<Object> header : headerList) {writeRow(header, csvWriter);}if(CollectionUtils.isEmpty(dataList)){writeRow(Lists.newArrayList("未查找到符合条件的数据,请修改查询条件"),csvWriter);}else{for (List<Object> row : dataList) {writeRow(row, csvWriter);}}csvWriter.flush();} catch (Exception e) {logger.error("生成csv文件错误,文件名称:{};错误信息:【{}】", fileName,e);} finally {try {if (csvWriter != null) {csvWriter.close();}if (fileOutputStream != null) {fileOutputStream.close();}} catch (IOException e) {e.printStackTrace();}}stopWatch.stop();logger.info("文件生成完成,文件名称:{} 耗时:{} ms", fileName,stopWatch.getTotalTimeMillis());}public static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException {for (Object data : row) {if(data==null){data="";}StringBuilder sb = new StringBuilder();String rowStr = sb.append("\"").append(data).append("\",").toString();csvWriter.write(rowStr);}csvWriter.newLine();}public static long parseLong(String s) throws NumberFormatException {if(StringUtils.isBlank(s) || !StringUtils.isNumeric(s)){return 0L;}return Long.parseLong(s);}/*** 删除单个文件** @return 单个文件删除成功返回true,否则返回false*/public static boolean deleteFile( File file) {// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除if (file.exists() && file.isFile()) {if (file.delete()) {return true;} else {return false;}} else {return false;}}public static byte[] exportCSV(List<List<Object>> dataList) {ByteArrayOutputStream out = new ByteArrayOutputStream();BufferedWriter buffCvsWriter = null;try {buffCvsWriter = new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8));for (List<Object> row : dataList) {writeRow(row, buffCvsWriter);}// 刷新缓冲buffCvsWriter.flush();} catch (IOException e) {e.printStackTrace();} finally {// 释放资源if (buffCvsWriter != null) {try {buffCvsWriter.close();} catch (IOException e) {e.printStackTrace();}}}return out.toByteArray();}private static void fillDataToCsv(BufferedWriter buffCvsWriter, LinkedHashMap row) throws IOException {Map.Entry propertyEntry;for (Iterator<Map.Entry> propertyIterator = row.entrySet().iterator(); propertyIterator.hasNext(); ) {propertyEntry = propertyIterator.next();buffCvsWriter.write("\"" + propertyEntry.getValue().toString() + "\"");if (propertyIterator.hasNext()) {buffCvsWriter.write(",");}}}public static Object escapeNullToRod(Object o){if(o == null){return "-";}return o;}public static Object escapeNullToZero(Object o){if(o == null){return "0";}return o;}
}

案例: ExportUtil.writeCsvFile

    @Testpublic void CSVtest() throws IOException {//标题 数据头List<Object> titleHeader = Lists.newArrayList(new String(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF})+ "日期范围:"+ "2024-01-01"+ "~"+ "2024-06-03");List<List<Object>> headerList = new ArrayList<>();headerList.add(titleHeader);headerList.add(Arrays.asList("ID", "月份", "薪水"));//数据行List<List<Object>> dataList = new ArrayList<>();for (int i = 0; i < 3; i++) {ArrayList<String> values = Lists.newArrayList(i + "\t", (i + 1) + "月" + "\t", (1000 * i) + "\t");dataList.add(new ArrayList<>(values));}String fileName = "数据报表.csv";String path = "C:\\Users\\EDY\\Desktop\\fsdownload" + fileName;ExportUtil.writeCsvFile(fileName, headerList, path, dataList);}

在这里插入图片描述

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

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

相关文章

记录request中上传图片接口的测试过程

F12抓取的接口地址如下&#xff1a; 入参&#xff1a; 注意圈出来的部分参数 apifox调试接口 python相关代码&#xff1a; 接口调用相关文件&#xff1a; select_photo.py 输出结果&#xff1a; 相关接口的一些封装&#xff1a;

Window 批量改文件后缀,例如,test.xls文件改为 test.csv;或者sas 文件改 sql 文件

echo off setlocal enabledelayedexpansion :: 设置需要遍历的文件夹路径 set "folderPathD:\test" ::遍历文件夹内所有文件夹 for /d %%i in("folderPath%\*") do( echo Processing folder: %%i ::遍历当前文件夹内所有.sas文件 for %%j in ("%%i\*…

【一百零三】【算法分析与设计】并查集,并查集的实现,P3367 【模板】并查集

并查集的实现 描述 给定一个没有重复值的整形数组arr&#xff0c;初始时认为arr中每一个数各自都是一个单独的集合。请设计一种叫UnionFind的结构&#xff0c;并提供以下两个操作。 boolean isSameSet(int a, int b): 查询a和b这两个数是否属于一个集合 void union(int a, int …

K210视觉识别模块学习笔记2:固件的下载升级_官方数字识别例程导入方法

今日开始学习K210视觉识别模块:固件的下载升级_官方数字识别例程导入方法 主要学习如何升级固件库&#xff0c;在哪下载固件库&#xff0c;以及如何在TF卡正确导入官方例程&#xff1a; 亚博智能的K210视觉识别模块...... 固件库版本: canmv_yahboom_v2.1.1.bin 本次最终目…

医学数据属于小样本,或许源于资源不对等|罗小罗·说

小罗碎碎念 医学数据属于小样本&#xff0c;或许源于资源不对等 今天这篇推文&#xff0c;源于一场对话。 我和他&#xff08;粉丝&#xff09;聊完以后&#xff0c;觉得心里总是压了点什么东西&#xff0c;直到我写完那篇关于医学数据类别不平衡的文章&#xff0c;我才大致理…

SEO之关键词扩展(一)

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议2、新手上云 确定了核心关键词后&#xff0c;接下来就是进行关键词扩展。对一个稍有规模的网站来说&#xff0c;研究几十个…

Java设计模式 _行为型模式_状态模式

一、状态模式 1、状态模式 状态模式&#xff08;State Pattern&#xff09;是一种行为型模式。 它允许一个对象在其内部状态改变时改变它的行为。状态模式把所研究的对象的行为包装在不同的状态对象里&#xff0c;每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图…

【Python Cookbook】S01E13 筛选序列中的元素

目录 问题解决方案讨论 问题 序列中包含一些数据&#xff0c;我们需要提取出其中的值或根据某些标准对序列做删减。 解决方案 要筛选序列中的元素&#xff0c;通常最简单的办法是通过 列表推导式&#xff0c;例如&#xff1a; mylist [1, 4, -5, 10, -7, 2, 3, -1]print([…

JAVAEE之文件IO_数据流概念,字节流:InputStream、OutputStream,字符流:reader、writer,及实例代码

什么是数据流 顾名思义&#xff0c;I 表示input&#xff0c;O 表示output&#xff0c;也就是输入输出流&#xff0c;主要是在程序与文件之间&#xff0c;用于传输数据的通道。既然要传输数据&#xff0c;那么我们需要理解文件和程序之间哪种方向的传输是输入流&#xff0c;哪种…

SD-WAN供应商的类型及选择指南

在企业加速数字化转型的背景下&#xff0c;SD-WAN技术成为优化网络性能和提升连接效率的重要方案&#xff0c;受到了广泛关注。本文将介绍当前主要的SD-WAN供应商类型及其特点&#xff0c;并提供企业选择合适供应商的建议。 目前&#xff0c;市场上的SD-WAN供应商主要分为两类&…

操作系统(3) 处理机调度

目录 一、处理机调度概述 1.基本准则 &#xff08;1&#xff09;CPU利用率 &#xff08;2&#xff09;系统吞吐量 &#xff08;3&#xff09;周转时间 &#xff08;4&#xff09;等待时间 &#xff08;5&#xff09;响应时间 2.进程调度方式 &#xff08;1&#xff0…

现代密码学-数字签名

从消息认证码到数字签名 前面讲到&#xff0c;消息认证码无法防止否认&#xff0c;A,B之间共享密钥计算出MAC,A,B都能计算出MAC,对于第三方C来说&#xff0c;他无法证明这个MAC是A计算的还是B计算的。 通过数字签名解决问题。 A,B各自使用不同的密钥-公钥密码&#xff0c;A用…

LeetCode刷题之HOT100之组合总和

2024/6/3 周一&#xff0c;工作日的第一天。昨晚梦到被导师说去实验室不积极哈哈哈&#xff0c;风扇开到二级&#xff0c;早上被吹醒。买的书马上快要到了。上午刚来准备刷题&#xff0c;结果去搞了一下数据库sql&#xff0c;做的差不多了&#xff0c;还差点格式转换就差不多出…

springboot打包笔记

文章目录 多配置文件application.yml本地启动参数替换profiles&#xff0c;还是要复制文件 项目有各种环境&#xff0c;例如&#xff1a;local&#xff0c;uat&#xff0c;prd等。 各种打包方式一定要熟练掌握。 做此笔记是因为做了那么多项目&#xff0c;也打了很多包&#xf…

QT中如何对引入的第三方库进行翻译

1、背景 在我们的程序中,可能会加载其他人写的模块,,该模块是以库的形式提供的,那么我们程序翻译时,如何来对引入的第三方库进行翻译??? 2、方案 首先,第三方库会有自己的翻译文件,并且一般要给我们提供设置翻译的接口, 例如下:第三方库给我们暴露一个接口,我们…

军用电源性能测试有哪些测试项目?需要遵循什么标准?

为了确保军用电源在极端条件下能够正常工作&#xff0c;必须对其进行一系列严格的性能测试。这些测试不仅包括效率、电压调整率和负载调整率等基本参数的测试&#xff0c;还包括动态响应能力、绝缘电阻、耐压测试、温度系数以及高低温循环等综合性能的评估。 测试项目 效率 电压…

spring 优雅替换bean

方案一&#xff1a;使用 Primary/Qualifier 注解&#xff08;优选&#xff09; 如果有多个相同类型的 Bean 存在&#xff0c;可以将想要优先使用的 Bean 加上 Primary 注解。 Qualifier和Primary注解的区别&#xff1a;Primary注解用于标记具有相同类型的多个实例中的主要实例…

MySQL -- 连接查询

MySQL使用连接查询&#xff08;JOIN&#xff09;是为了从多个相关表中获取数据。连接查询是一种强大且常用的操作&#xff0c;可以根据某些条件将两张或多张表中的数据组合在一起&#xff0c;返回一个联合结果集。 1.为什么使用连接查询 数据规范化&#xff1a; 数据库设计时通…

站点被篡改快照被劫持解决服务方法教程_一招制敌

站点被篡改快照被劫持解决服务方法教程_一招制敌 被篡改表现形式&#xff1a; 站点打不开或跳转到别的网站。 攻击者目的&#xff1a; 报复、勒索、卖防御产品&#xff08;如DDOS防御产品&#xff09;。 攻击成本&#xff1a; 工具&#xff08;如VPN购买&#xff09;成本、人…

智能工厂生产设备实时监控技术的UI设计

智能工厂生产设备实时监控技术的UI设计