記錄一下java 操作csv的代碼。
1. 引入jar包
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
2. 創建csv
package com.ysl;
import com.csvreader.CsvWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import javax.servlet.http.HttpServletResponse;
import com.ysl.CsvUtil;
/**
* 創建csv
* @author YSL
*/
public class CsvWriter {
public static void main(String[] args) throws IOException {
// 方式1. 直接創建本地的csv文件
localFileCsv();
// 方式2. 通過網頁返回csv
webResponseCsv(res);
}
public static void localFileCsv() throws IOException {
String filePath = "/home/yang/桌面/test-中文.csv";
// 創建CSV寫對象
CsvWriter csvWriter = new CsvWriter(filePath,',', Charset.forName("GBK"));
// CsvWriter csvWriter = new CsvWriter(filePath); // 會中文亂碼
// 表頭
String[] headers = {"列1","列2","列3\n"};
csvWriter.writeRecord(headers);
csvWriter.writeRecord(new String[]{"value1", "value2", "value3" + "\n"});
csvWriter.writeRecord(new String[]{"value1", "value2", "中文" + "\n"});
csvWriter.writeRecord(new String[]{"value1", "value2", "中文"});
csvWriter.writeRecord(new String[]{"value1", "value2", "中文" + "\n"});
csvWriter.close();
}
public static void webResponseCsv(HttpServletResponse response) {
// 導出csv 。CsvUtil見下文
CsvUtil.writeCsv("文件名稱", response, new CsvUtil.WriteCsv() {
@Override
public void write(CsvWriter csvWriter) throws IOException {
// csv表頭
csvWriter.writeRecord(new String[]{"列1","列2","列3",});
csvWriter.write("val1");
csvWriter.write("val2");
csvWriter.write("值3");
csvWriter.endRecord();
}
});
}
}
3. 讀取csv
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import com.ysl.CsvUtil;
/**
* 讀取csv
*/
public class CsvReader {
public static void main(String[] args) throws IOException {
// 這裏需要注意csv文件需要保存爲utf-8格式————可以用記事本打開,然後另存爲,選擇utf-8格式
InputStream in = getResourcesFileInputStream("test-中文.csv");
// 讀取csv
List<String[]> records = CsvUtil.readCsv(in);
}
/**
* 加載Resources目錄下的文件
* @param fileName 文件名
* @return
*/
public static InputStream getResourcesFileInputStream(String fileName){
// Resources目錄的絕對路徑
// String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("" + fileName);
return in;
}
}
4. CsvUtil工具類
package com.ysl;
import com.csvreader.CsvWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.Charset;
/**
* Csv工具類
* @author:YSL
*/
public class CsvUtil {
private static Logger logger = LoggerFactory.getLogger(CsvUtil.class);
private static String DEFAULT_ENCODE = "UTF-8";
private static String GBK_ENCODE = "GBK";
/*
* 自定義write csv 接口
*/
public interface WriteCsv {
void write(CsvWriter csvWriter) throws Exception;
}
/**
* 導出csv
* @param fileName 文件名稱(不包括.csv後綴)
* @param response
* @param writeCsv 自定義接口,需實現write方法
* @return 直接將csv返回給前端
* @author YSL
*/
public static void writeCsv(String fileName, HttpServletResponse response, CsvUtil.WriteCsv writeCsv){
try {
// 創建臨時文件
File tempfile = File.createTempFile(fileName, ".csv");
// 創建 CsvWriter 對象
CsvWriter csvWriter = new CsvWriter(tempfile.getCanonicalPath(),',', Charset.forName(GBK_ENCODE));
// 接口需要實現的方法
writeCsv.write(csvWriter);
// 關閉 CsvWriter 對象
csvWriter.close();
// 獲取寫入數據的臨時文件
File fileLoad=new File(tempfile.getCanonicalPath());
// 返回給前端
CsvUtil.downLoadCsv(fileName+".csv", fileLoad, response);
}catch (Exception e){
e.printStackTrace();
logger.error(e.getMessage(), e);
}
}
/**
* 導出csv文件
* @param fileName 文件名稱,含後綴
* @param fileLoad 要輸出的文件
* @param response
* @author YSL
*/
public static void downLoadCsv(String fileName, File fileLoad, HttpServletResponse response) {
try {
byte[] b=new byte[1024 * 1024];
OutputStream out=response.getOutputStream();
response.reset();
response.setContentType("application/csv");
//re.setContentType("application/x-msdownload;");
response.setHeader("content-disposition", "attachment; filename="+ URLEncoder.encode(fileName,DEFAULT_ENCODE));
Long filelength=fileLoad.length();
response.setHeader("Content_Length",String.valueOf(filelength));
FileInputStream fileInputStream=new FileInputStream(fileLoad);
int n;
while ((n = fileInputStream.read(b)) != -1) {
out.write(b, 0, n); //每次寫入out1024字節
}
// System.out.println(tempfile.getCanonicalPath());
fileInputStream.close();
out.flush();
out.close();
logger.info("export:"+fileName+" --- success");
} catch (IOException e) {
e.printStackTrace();
logger.error(e.getMessage(), e);
}
}
/**
* 導出csv文件
* @param fileName 文件名稱,含後綴
* @param content 逗號隔開的值,換行符:\r\n
* @param response
* @author YSL
*/
public static void downLoadCsv(String fileName, String content, HttpServletResponse response) {
try {
OutputStream out = response.getOutputStream();
//response.reset();
response.setContentType("application/csv");
response.setHeader("content-disposition", "attachment; filename="+StringUtil.encode(fileName,Constants.DEFAULT_GLOBAL_ENCODE));
response.setHeader("Content_Length",String.valueOf(content.length()));
out.write(content.getBytes(GBK_ENCODE));
out.close();
logger.info("export"+fileName+"success");
} catch (IOException e) {
e.printStackTrace();
logger.error(e.getMessage(), e);
}
}
/**
* 讀csv
* @param in
* @return
* @author YSL
* @throws IOException
*/
public static List<String[]> readCsv(InputStream in) throws IOException {
List<String[]> records = new ArrayList<String[]>();
String record;
// 設定UTF-8字符集,使用帶緩衝區的字符輸入流BufferedReader讀取文件內容
BufferedReader file = new BufferedReader(new InputStreamReader(in, "UTF-8"));
// file.readLine(); //跳過表頭所在的行
// 遍歷數據行並存儲在名爲records的ArrayList中,每一行records中存儲的對象爲一個String數組
while ((record = file.readLine()) != null) {
String fields[] = record.split(",");
records.add(fields);
}
// 關閉文件
file.close();
in.close();
return records;
}
}