前几天在做项目的时候,需要将数据库中读取的账单数据用IO流输出到.csv文件中保存,然后用excel表格打开查看。但是用excel表格打开时,出现的是乱码。想了很多办法都没有解决。最后我的导师想起来他之前也遇到过类似的问题。原来是微软的excel等编辑工具,为了将utf-8与其他编码区分开来,微软采用带有BOM(byte order marker 字节序标记)的UTF-8编码格式,这是微软的一种习惯。也就是说,在用输出流写出数据之前,要先将BOM写入到文件中,作为标记,然后再将数据写入到文件中,这样获得的文件才不会乱码。
代码如下:
BufferedWriter writer = null;
try {
byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};//BOM
FileOutputStream op = FileUtils.openOutputStream(file);
op.write(uft8bom);//先将BOM输出到文件中
writer = new BufferedWriter(new OutputStreamWriter(op,"UTF-8"));
writer.write("产品名称,流量大小,省份 ,运营商,使用范围,购买数量,销售价格,手机号,是否退款,状态,时间");
writer.newLine();
for(ClientCheckBillExportVo v : list){
writer.write(v.getProductName().toString() + ",");
writer.write(v.getFlow().toString() + ",");
writer.write(v.getProvinceName().toString() + ",");
writer.write(v.getOperatorName().toString() + ",");
writer.write(v.getScopName().toString() + ",");
writer.write(v.getBuyNum().toString() + ",");
writer.write(v.getShowSellPrice().toString() + ",");
writer.write(v.getPhone().toString() + ",");
writer.write(v.getRefundName().toString() + ",");
writer.write(v.getStatusName().toString() + ",");
writer.write(v.getUpdateTime());
writer.newLine();
}
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
输出的BOM是16进制的EF BB BF
关于BOM详细请参考BOM的相关资料