参考:https://blog.csdn.net/diyu122222/article/details/78685771
- 什么是CSV文件
CSV,逗号分隔值文件格式,有时也称为字符分隔值,因为分隔字符也可以不是逗号,其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本(NOTE)来开启,再则先另存新档后用EXCEL开启,也是方法之一。
- 为什么使用CSV
CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。最广泛的应用是在程序之间转移表格数据,因为大量程序都支持某种CSV变体。
- CSV的规则
开头是不留空,以行为单位。 可含或不含列名,含列名则居文件第一行。 一行数据不跨行,无空行。
以半角逗号(即,)作分隔符,列为空也要表达其存在。
列内容如存在半角引号(即”),替换成半角双引号(”“)转义,即用半角引号(即”“)将该字段值包含起来。 文件读写时引号,逗号操作规则互逆。
内码格式不限,可为 ASCII、Unicode 或者其他。 不支持特殊字符
- 使用技巧
Excel打开时无法正常显示数字字符串
数字字符串会被Excel自动转换成数字类型,长的数字字符串还会被用科学计数法表示,所以存储时可以采用如下方法存储:
=”520101199911110123”
=”2017-01-01 12:22:00”
- csvUtil 文件读写工具类 (先引入 javacsv-2.0.jar )
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
/*import javax.servlet.http.HttpServletResponse;*/
public class csvUtil {
/**
* 读取CSV文件
* @param csvFilePath 文件路径
*/
public static ArrayList<String[]> readeCsv(String csvFilePath) {
ArrayList<String[]> csvList = new ArrayList<String[]>(); // 用来保存数据
try {
CsvReader reader = new CsvReader(csvFilePath, ',',Charset.forName("GBK")); // 一般用这编码读就可以了
reader.readHeaders(); // 跳过表头 如果需要表头的话,不要写这句。
while (reader.readRecord()) { // 逐行读入除表头的数据
csvList.add(reader.getValues());
}
reader.close();
} catch (Exception ex) {
System.out.println(ex);
}
return csvList;
}
/**
* 读取CSV文件
* @param csvIs csv导入数据流
*/
public static ArrayList<String[]> readeCsvByIs(InputStream csvIs) {
ArrayList<String[]> csvList = new ArrayList<String[]>(); // 用来保存数据
try {
CsvReader reader = new CsvReader(csvIs,Charset.forName("GBK")); // 一般用这编码读就可以了
reader.readHeaders(); // 跳过表头 如果需要表头的话,不要写这句。
while (reader.readRecord()) { // 逐行读入除表头的数据
csvList.add(reader.getValues());
}
reader.close();
} catch (Exception ex) {
System.out.println(ex);
}
return csvList;
}
/**
* 写入CSV文件
*
* @param csvFilePath 写出路径
*
* @param contents 数据内容
*/
public static void writeCsv(String csvFilePath ,List<String[]> contents) {
try {
//String csvFilePath = "c:/test.csv";
CsvWriter wr = new CsvWriter(csvFilePath, ',',Charset.forName("GBK"));
for (int i = 0; i < contents.size(); i++) {
wr.writeRecord(contents.get(i));
}
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 输出文件
* @param ou 文件流
* @param list 需要输出的数据
* @throws java.io.IOException
*/
public static void writeCsv(OutputStream ou, List<String[]> list) throws IOException {
CsvWriter cw = new CsvWriter(ou, ',', Charset.forName("UTF-8"));
for(String[] s: list) {
cw.writeRecord(s);
}
//在文件中增加BOM,详细说明可以Google,该处的byte[] 可以针对不同编码进行修改
ou.write(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF });
cw.flush();
cw.close();
}
/**
* 导出csv模板
*
* @param response
* @param headers 模板列标题
* @param csvName csv文件名
* @throws java.io.IOException
*/
public static void exportCsv(HttpServletResponse response,String headers,String csvName) throws IOException {
OutputStream fos = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(fos);
try {
fos = response.getOutputStream();
bos = new BufferedOutputStream(fos);
//这个就就是弹出下载对话框的关键代码
response.setContentType("text/csv");
response.setHeader("Content-disposition","attachment;filename=" +URLEncoder.encode(csvName+".csv", "UTF-8"));
headers += "\n";
bos.write(headers.getBytes("GBK"));
bos.flush();
} catch (IOException ex) {
System.out.print(ex);
} finally {
fos.close();
bos.close();
}
}
} 复制代码