我通过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();
答案 0 :(得分:4)
你应该知道Excel不会打开" csv文件。它使用默认值将它们动态转换为Excel文件。根据您的区域设置,这些默认值可能会有所不同。因此,it's never a good idea to let Excel open csv files using the defaults,因为你永远不会确定你最终会得到什么。
更安全的方法是使用'从文本导入'方法,并明确指定分隔符,编码,等...但是,请注意'另存为csv'在Excel中是一个更糟糕的想法,因为它不允许您指定编码,分隔符或任何其他细节。访问确实。
在美国Windows版本的Excel上,默认列分隔符是逗号。在欧洲Windows版本上,逗号是为十进制符号保留的,为避免冲突,默认情况下使用分号作为列分隔符。
如果您-realy- -realy- -have-使用CSV,您可以考虑在csv文件的顶部添加"sep=," indicator。但请注意,这可能会导致其他应用程序出现问题。