通过Excel打开带有UTF-8 BOM的CSV

时间:2013-11-28 22:12:46

标签: java excel csv utf-8

我通过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 个答案:

答案 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。但请注意,这可能会导致其他应用程序出现问题。