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.pswp.cn/bicheng/21719.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21719.shtml
英文地址,請注明出處:http://en.pswp.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設計