应用场景:
用java生成CSV格式文件UTF-8编码,用文本编译器打开是正常显示的,然后用Excel打开是乱码。
问题描述
用java生成的的CSV文件是不带BOM的,windows的Excel是使用bom来确认utf8编码的,全部须要把bom写到文件的开头。这样用Excel打开CSV文件时就会出现乱码的现象。
CSV文件生成示例
String pdfPath = "D://示例文件.csv" ;
File csvFile = new File(pdfPath);
BufferedWriter csvWtriter = null;
File parent = csvFile.getParentFile();
if (parent != null && !parent.exists()) {
parent.mkdirs();
}
csvFile.createNewFile();
csvWtriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), StandardCharsets.UTF_8), 1024);
String[] title = {"字段1","字段2"};
//使用工具类
writeRow(title,csvWtriter);
csvWtriter.flush();
csvWtriter.close();
CSV文件生成工具类
/**
* 写一行数据方法
* @param row
* @param csvWriter
* @throws IOException
*/
public static void writeRow(String[] row, BufferedWriter csvWriter) throws IOException {
// 写入文件头部
for (Object data : row) {
StringBuffer sb = new StringBuffer();
String rowStr = sb.append("\"").append(data).append("\",").toString();
csvWriter.write(rowStr);
}
csvWriter.newLine();
}
/**
* 导出csv格式工具类
* 创建文件并放置数据 这里放置了表头一行数据
* @param result 导出数据
* @param fileName 文件名
*/
public static void createCsvFile(List result,String fileName,String path){
try {
File csvFile = new File(fileName);
//导入HuTool中CSV工具包的CsvWriter类
//设置导出字符类型, CHARSET_UTF_8
CsvWriter writer = cn.hutool.core.text.csv.CsvUtil.getWriter(csvFile, CharsetUtil.CHARSET_UTF_8);
writer.write(result);
writer.close();
//保存文件
FileInputStream fileInputStream=new FileInputStream(csvFile);
saveFile(fileInputStream,csvFile.getName(),path);
}
catch (Exception e){
System.out.println(e);
}
}
/**
* 文件保存 覆盖保存
* @param inputStream
* @param fileName
*/
public static void saveFile(InputStream inputStream, String fileName, String path) {
OutputStream os = null;
try {
//保存文件路径
// 1K的数据缓冲 1024000 1M
byte[] bs = new byte[1024000];
// 读取到的数据长度
int len;
// 输出的文件流保存到本地文件
File tempFile = new File(path);
if (!tempFile.exists()) {
tempFile.mkdirs();
}
os = new FileOutputStream(tempFile.getPath() + File.separator + fileName);
// 开始读取
while ((len = inputStream.read(bs)) != -1) {
os.write(bs, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 完毕,关闭所有链接
try {
os.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
可能产生问题地方:
1、生成的CSV文件用Excel打开会产生中文乱码,需要加载写入第一行数据之前加入这行代码。
csvWtriter.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));
2、生成的CSV文件里面如果某个字段值是纯数字且长度大于11位 在打开的Excel中展示的是科学计数法
在纯数字等有问题的列后面加上制表符"\t"