欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?導(dǎo)出?CSV?文件操作詳情

 更新時(shí)間:2022年08月17日 15:33:25   作者:苦糖????????  
這篇文章主要介紹了Java導(dǎo)出CSV文件操作詳情,文章通過(guò)導(dǎo)入坐標(biāo)展開(kāi)詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

首先第一步 導(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虛擬機(jī)最多支持多少個(gè)線程的探討

    Java虛擬機(jī)最多支持多少個(gè)線程的探討

    這篇文章主要介紹了Java虛擬機(jī)最多支持多少個(gè)線程的問(wèn)題,從StackOverflow上摘錄而來(lái),需要的朋友可以參考下
    2014-04-04
  • 深入了解Java中Synchronized關(guān)鍵字的實(shí)現(xià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
  • java 二分法算法的實(shí)例

    java 二分法算法的實(shí)例

    這篇文章主要介紹了java 二分法算法的實(shí)例的相關(guān)資料,希望通過(guò)本文大家能夠掌握二分法,需要的朋友可以參考下
    2017-09-09
  • 容器環(huán)境的JVM內(nèi)存設(shè)置實(shí)踐記錄

    容器環(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-03
  • SpringMVC如何獲取表單數(shù)據(jù)(radio和checkbox)

    SpringMVC如何獲取表單數(shù)據(jù)(radio和checkbox)

    這篇文章主要介紹了SpringMVC如何獲取表單數(shù)據(jù)(radio和checkbox)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 高內(nèi)聚低耦合原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    高內(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-08
  • Maven安裝過(guò)程圖文詳解

    Maven安裝過(guò)程圖文詳解

    這篇文章主要介紹了Maven安裝過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-07-07
  • Spring MVC 攔截器實(shí)現(xiàn)代碼

    Spring MVC 攔截器實(shí)現(xiàn)代碼

    本篇文章主要介紹了Spring MVC 攔截器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • SpringBoot集成Druid實(shí)現(xiàn)監(jiān)控功能的示例代碼

    SpringBoot集成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
  • Java讀取.properties配置文件方法示例

    Java讀取.properties配置文件方法示例

    這篇文章主要介紹了Java讀取.properties配置文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論