JAVA操作CSV

记录一下java 操作csv的代码。

1. 引入jar包

1
2
3
4
5
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>

2. 创建csv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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;
}

}
------------- 本文结束  感谢您的阅读 -------------
评论