Java?導(dǎo)出?CSV?文件操作詳情
首先第一步 導(dǎo)入坐標(biāo):
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.6</version> </dependency>
第二步
引入工具類(lèi) 說(shuō)明下 因?yàn)檫@個(gè)工具類(lèi)用到是Listj集合
我就順帶吧 實(shí)體類(lèi)和map 之間的轉(zhuǎn)換也說(shuō)了
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.CSVRecord; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import java.io.*; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 導(dǎo)出至csv文件 * */ public class CsvUtil { //CSV文件分隔符 private final static String NEW_LINE_SEPARATOR="\n"; /** CSV文件列分隔符 */ private static final String CSV_COLUMN_SEPARATOR = ","; /** CSV文件列分隔符 */ private static final String CSV_RN = "\r\n"; /**寫(xiě)入csv文件 * @param headers 列頭 * @param data 數(shù)據(jù)內(nèi)容 * @param filePath 創(chuàng)建的csv文件路徑 * @throws IOException **/ public static void writeCsvWithHeader(String[] headers, List<Object[]> data, String filePath) { //初始化csvformat CSVFormat format = CSVFormat.DEFAULT.withHeader(headers); try { //根據(jù)路徑創(chuàng)建文件,并設(shè)置編碼格式 FileOutputStream fos = new FileOutputStream(filePath); OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK"); //創(chuàng)建CSVPrinter對(duì)象 CSVPrinter printer = new CSVPrinter(osw, format); if(null!=data){ //循環(huán)寫(xiě)入數(shù)據(jù) for(Object[] lineData:data){ printer.printRecord(lineData); } } printer.flush(); printer.close(); } catch (IOException e) { e.printStackTrace(); } } /**寫(xiě)入csv文件 * @param headers 列頭 * @param data 數(shù)據(jù)內(nèi)容 * @param filePath 創(chuàng)建的csv文件路徑 * @throws IOException **/ public static void writeCsvWithRecordSeparator(Object[] headers, List<Object[]> data, String filePath){ //初始化csvformat CSVFormat format = CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR); try { //根據(jù)路徑創(chuàng)建文件,并設(shè)置編碼格式 FileOutputStream fos = new FileOutputStream(filePath); OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK"); //創(chuàng)建CSVPrinter對(duì)象 CSVPrinter printer = new CSVPrinter(osw,format); //寫(xiě)入列頭數(shù)據(jù) printer.printRecord(headers); if(null!=data){ //循環(huán)寫(xiě)入數(shù)據(jù) for(Object[] lineData:data){ printer.printRecord(lineData); } } printer.flush(); printer.close(); System.out.println("CSV文件創(chuàng)建成功,文件路徑:"+filePath); } catch (IOException e) { e.printStackTrace(); } } /** * @filePath 文件路徑 */ public static List<CSVRecord> readCsvParse(String filePath){ List<CSVRecord> records = new ArrayList<>(); try { FileInputStream in = new FileInputStream(filePath); BufferedReader reader = new BufferedReader (new InputStreamReader(in,"GBK")); CSVParser parser = CSVFormat.EXCEL.parse(reader); records = parser.getRecords(); parser.close(); } catch (IOException e) { e.printStackTrace(); }finally { return records; } } /** * 自定義字段 * @filePath 文件路徑 */ public static List<CSVRecord> readCsvParseWithHeader(String filePath,String[] headers){ List<CSVRecord> records = new ArrayList<>(); try { FileInputStream in = new FileInputStream(filePath); BufferedReader reader = new BufferedReader (new InputStreamReader(in,"GBK")); CSVParser parser = CSVFormat.EXCEL.withHeader(headers).parse(reader); records = parser.getRecords(); /*for (CSVRecord record : parser.getRecords()) { System.out.println(record.get("id") + "," + record.get("name") + "," + record.get("code")); }*/ parser.close(); }catch (IOException e){ e.printStackTrace(); }finally { return records; } } /** * 導(dǎo)出至多個(gè)csv文件 * */ public void writeMuti() throws InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(3); CountDownLatch doneSignal = new CountDownLatch(2); List<Map<String, String>> recordList = new ArrayList<>(); executorService.submit(new CsvExportThread("E:/0.csv", recordList, doneSignal)); executorService.submit(new CsvExportThread("E:/1.csv", recordList, doneSignal)); doneSignal.await(); System.out.println("Finish!!!"); } /** * @param colNames 表頭部數(shù)據(jù) * @param dataList 集合數(shù)據(jù) * @param mapKeys 查找的對(duì)應(yīng)數(shù)據(jù) */ public static ByteArrayOutputStream doExport(String[] colNames, String[] mapKeys, List<Map> dataList) { try { StringBuffer buf = new StringBuffer(); // 完成數(shù)據(jù)csv文件的封裝 // 輸出列頭 for (int i = 0; i < colNames.length; i++) { buf.append(colNames[i]).append(CSV_COLUMN_SEPARATOR); } buf.append(CSV_RN); if (null != dataList) { // 輸出數(shù)據(jù) for (int i = 0; i < dataList.size(); i++) { for (int j = 0; j < mapKeys.length; j++) { buf.append(dataList.get(i).get(mapKeys[j])).append(CSV_COLUMN_SEPARATOR); } buf.append(CSV_RN); } } // 寫(xiě)出響應(yīng) ByteArrayOutputStream os = new ByteArrayOutputStream(); //OutputStream os = new ByteArrayOutputStream(); os.write(buf.toString().getBytes("GBK")); os.flush(); os.close(); return os; } catch (Exception e) { LogUtils.error("doExport錯(cuò)誤...", e); e.printStackTrace(); } return null; } public static HttpHeaders setCsvHeader(String fileName) { HttpHeaders headers = new HttpHeaders(); try { // 設(shè)置文件后綴 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String filename = new String(fileName.getBytes("gbk"), "iso8859-1") + sdf.format(new Date()) + ".csv"; headers.add("Pragma", "public"); headers.add("Cache-Control", "max-age=30"); headers.add("Content-Disposition", "attachment;filename="+filename); headers.setContentType(MediaType.valueOf("application/vnd.ms-excel;charset=UTF-8")); }catch (Exception e){ e.printStackTrace(); } return headers; } }
第三步
controller 層:
package com.example.demo.controller; import com.example.demo.service.DemoService; import com.example.demo.util.CsvUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/demo") public class DemoController { @Autowired private DemoService demoService; @RequestMapping("/exportCsv") public ResponseEntity<byte[]> exportCsv(){ //設(shè)置excel文件名 String fileName="用戶表"; //設(shè)置HttpHeaders,設(shè)置fileName編碼,排除導(dǎo)出文檔名稱(chēng)亂碼問(wèn)題 HttpHeaders headers = CsvUtil.setCsvHeader(fileName); byte[] value = null; try { //獲取要導(dǎo)出的數(shù)據(jù) value = this.demoService.exportCsv(); }catch (Exception e){ e.printStackTrace(); } return new ResponseEntity<byte[]>(value,headers, HttpStatus.OK); } }
第四步:
service 接口
package com.example.demo.service; public interface DemoService { /*導(dǎo)出csv文件*/ byte[] exportCsv(); }
第五步:
service 實(shí)現(xiàn)類(lèi)
package com.example.demo.service.impl; import com.example.demo.pojo.User; import com.example.demo.service.DemoService; import com.example.demo.util.CsvUtil; import org.apache.commons.beanutils.BeanUtils; import org.springframework.stereotype.Service; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; @Service public class DemoServiceImpl implements DemoService { @Override public byte[] exportCsv() { byte[] content = null; try { String[] sTitles = new String[]{"名稱(chēng)","年齡","性別"}; String[] mapKeys = new String[]{"name","age","sex"}; List<Map> dataList = new ArrayList<>(); //數(shù)據(jù) for (int i = 0; i < 10; i++) { User user = new User("小明" + i, i, "男" + i); Map map = BeanUtils.describe(user); dataList.add(map); } ByteArrayOutputStream os = CsvUtil.doExport(sTitles,mapKeys,dataList); content = os.toByteArray(); }catch (Exception e){ e.printStackTrace(); } return content; } }
補(bǔ)充 :
象和map 互相轉(zhuǎn)換
坐標(biāo)
<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency>
用到的工具類(lèi):
BeanUtils
1. bean(?? ?實(shí)體類(lèi)???)轉(zhuǎn)Map
例子:
Person person=new Person(); person1.setName("張三"); person1.setSex("不男不女"); Map<String, Object> map=null; map = BeanUtils.describe(person1);
2. map轉(zhuǎn)bean(實(shí)體類(lèi))
例子: 估計(jì)誰(shuí)沒(méi)事也不會(huì)用map 轉(zhuǎn)bean 可能是我見(jiàn)識(shí)短了/**
* Map轉(zhuǎn)換層Bean,使用泛型免去了類(lèi)型轉(zhuǎn)換的麻煩。 * @param <T> * @param map * @param class1 * @return */ public static <T> T map2Bean(Map<String, String> map, Class<T> class1) { T bean = null; try { bean = class1.newInstance(); BeanUtils.populate(bean, map); } catch (Exception e) { e.printStackTrace(); } return bean; }
到此這篇關(guān)于Java 導(dǎo)出 CSV 文件操作詳情的文章就介紹到這了,更多相關(guān)Java 導(dǎo)出 CSV 文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入了解Java中Synchronized關(guān)鍵字的實(shí)現(xiàn)原理
synchronized是JVM的內(nèi)置鎖,基于Monitor機(jī)制實(shí)現(xiàn),每一個(gè)對(duì)象都有一個(gè)與之關(guān)聯(lián)的監(jiān)視器?(Monitor),這個(gè)監(jiān)視器充當(dāng)了一種互斥鎖的角色,本文就詳細(xì)聊一聊Synchronized關(guān)鍵字的實(shí)現(xiàn)原理,需要的朋友可以參考下2023-06-06容器環(huán)境的JVM內(nèi)存設(shè)置實(shí)踐記錄
Docker和K8S的興起,很多服務(wù)已經(jīng)運(yùn)行在容器環(huán)境,對(duì)于java程序,JVM設(shè)置是一個(gè)重要的環(huán)節(jié),這里總結(jié)下我們項(xiàng)目里的最佳實(shí)踐,對(duì)容器環(huán)境的JVM內(nèi)存相關(guān)知識(shí)感興趣的朋友一起看看吧2022-03-03SpringMVC如何獲取表單數(shù)據(jù)(radio和checkbox)
這篇文章主要介紹了SpringMVC如何獲取表單數(shù)據(jù)(radio和checkbox)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07高內(nèi)聚低耦合原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
耦合度就是某模塊(類(lèi))與其它模塊(類(lèi))之間的關(guān)聯(lián)、感知和依賴(lài)的程度,是衡量代碼獨(dú)立性的一個(gè)指標(biāo),也是軟件工程設(shè)計(jì)及編碼質(zhì)量評(píng)價(jià)的一個(gè)標(biāo)準(zhǔn)2017-08-08SpringBoot集成Druid實(shí)現(xiàn)監(jiān)控功能的示例代碼
這篇文章主要介紹了SpringBoot集成Druid實(shí)現(xiàn)監(jiān)控功能,Druid是阿里巴巴開(kāi)發(fā)的號(hào)稱(chēng)為監(jiān)控而生的數(shù)據(jù)庫(kù)連接池,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,天生就是針對(duì)監(jiān)控而生的DB連接池,文中通過(guò)代碼示例講解非常詳細(xì),需要的朋友可以參考下2024-02-02