我通过java创建带有数据的csv文件 . 我遇到了以下众所周知的问题:葡萄牙语中的字母在Excel中以错误的方式显示(通过双击打开时) .
我通过UTF-16LE BOM解决了这个问题,但是excel开始将标签识别为列分隔符而不是逗号 .
所以我查找了另一个解决方案并查看了很多帖子,其中人们说只需添加UTF-8 BOM并以UTF-8编写文件就可以完成Excel 2007及更高版本的工作 . 我在我的工作计算机上尝试了最简单的示例,但它失败了 . 但是当我在家用电脑上尝试这个时,它就像一个魅力 .
两台计算机都安装了相同版本的Java和操作系统Windows 7.我很困惑 . 有谁能说出什么会导致这种奇怪的行为?
您可以在下面看到我最简单的示例:
String filename = "D:/check/test_with_bom.csv";
FileOutputStream fos = new FileOutputStream(filename);
byte[] bom = new byte[] { (byte)0xEF, (byte)0xBB, (byte)0xBF };
fos.write(bom);
OutputStreamWriter osw = new OutputStreamWriter(fos , "UTF-8");
PrintWriter printWriter = new PrintWriter(osw);
printWriter.print("Hello,Olá,ão,ção");
printWriter.close();
1 回答
您应该知道Excel不是"open" csv文件 . 它使用默认值将它们动态转换为Excel文件 . 根据您的区域设置,这些默认值可能会有所不同 . 因此,it's never a good idea to let Excel open csv files using the defaults,因为你永远不会知道你最终会得到什么 .
更安全的方法是使用'从文本导入'方法,并明确指定分隔符,编码等...但是,请注意,在Excel中“另存为csv”是一个更糟糕的想法,因为它不允许你指定编码,分隔符或任何其他详细信息 . 访问权限 .
在美国Windows版本的Excel上,默认列分隔符是逗号 . 在欧洲Windows版本上,逗号保留为十进制符号,为避免冲突,默认情况下使用分号作为列分隔符 .
如果您-realy- -realy- -have-使用CSV,您可以考虑在csv文件的顶部添加"sep=," indicator . 但请注意,这可能会导致其他应用程序出现问题 .