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;

【一百零三】【算法分析与设计】并查集,并查集的实现,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;每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图…

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

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

操作系统(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;还差点格式转换就差不多出…

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

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

MySQL -- 连接查询

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

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

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

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

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

Flutter的Dart语法入门

文章目录 前言1. 类型声明2. 数据类型2.1 基本数据类型常量 2.2 String2.3 集合2.4 unicode 3. Dart函数特征3.1 可变参数列表和默认入参3.2 匿名函数3.3 typedef 4. Dart面向对象4.1 构造函数4.2 访问权限4.3 类的继承 参考资料附录 前言 每个语言都有控制流语句就不写测试代…

房地产vr全景展示交互视频让购房者更有参与感

在当今房地产市场中&#xff0c;购房者的需求日益多样化和个性化。为满足这一趋势&#xff0c;我们创新性地将VR虚拟现实技术应用于楼盘宣传&#xff0c;为购房者带来前所未有的沉浸式购房体验。 一、地理位置全景展示 通过实景拍摄与VR技术的结合&#xff0c;我们为购房者呈现…

day26-单元测试

1. 单元测试Junit 1.1 什么是单元测试&#xff1f;&#xff08;掌握&#xff09; 1.2 Junit的特点&#xff1f;&#xff08;掌握&#xff09; 1.3 基本用法&#xff1a;&#xff08;掌握&#xff09; 实际开发中单元测试的使用方式&#xff08;掌握&#xff09; public class …

C语言,排序

前言 排序&#xff0c;可以说是数据结构中必不可缺的一环。我们创造数据存储它&#xff0c;要想知道数据之间的联系&#xff0c;比较是必不可少的。不然&#xff0c;费劲心思得来的数据若是不能有更多的意义&#xff0c;那么拿到了又有什么用&#xff1f; 排序是计算机内经常进…

风险投资公司正在帮助小投资者购买Anthropic、OpenAI等热门公司的股票

近年来&#xff0c;风险投资公司对于人工智能&#xff08;AI&#xff09;领域的公司&#xff0c;如Anthropic、Groq、OpenAI等&#xff0c;表现出了极高的投资热情。这些公司因为它们在AI技术方面的创新而备受瞩目。但是&#xff0c;对于很多小投资者来说&#xff0c;由于资金有…

[C#]使用C#部署yolov8的目标检测tensorrt模型

【测试通过环境】 win10 x64 vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super 版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll&#xff0c;TensorRtExtern源码地址&#xff1a;TensorRT-CShar…