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

7
我通过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();

3
同样版本的Excel吗? - Robin Green
你为什么要创建那个过时的 PrintWriter?难道在 Writer 上调用 write 比在 PrintWriter 上调用 print 更困难吗? - Holger
Robin Green,我猜是的 - 两台机器都有2007年版的Excel。我看到的明显区别是,在工作机器上我有俄语版的Excel。 - me1111
Holger,将print更改为write并不会改变结果。这只是一个测试样例,我写这个样例是为了证明这种方法的可能性。 - me1111
1个回答

8
你需要知道的是,Excel并不会“打开”csv文件。它会使用默认设置将其实时转换为Excel文件。这些默认设置可能因地区而异。因此,让Excel使用默认设置打开csv文件永远都不是一个好主意,因为你永远无法确定最终结果。
更安全的方法是使用“从文本导入”的方法,并明确指定分隔符、编码等。然而,请注意,“在Excel中另存为csv”甚至更糟糕,因为它不允许你指定编码、分隔符或任何其他详细信息。Access可以。
在美国版的Windows Excel中,默认的列分隔符是逗号。在欧洲版的Windows中,逗号保留为小数点符号,为了避免冲突,默认使用分号作为列分隔符。
如果你确实必须使用CSV,可以考虑在csv文件顶部添加"sep=," indicator指示符。但要注意,这可能会在其他应用程序中引起问题。

是的,我知道通过Excel打开它们不是一个很好的主意,但客户希望通过双击打开CSV并希望逗号成为列分隔符。无论如何,我停留在UTF-8 BOM上。你之前提到了区域设置,你具体指的是什么?感谢您的建议。 - me1111
1
嘿,我在回复中添加了两个段落。但是,当使用CSV时,客户端将添加或更改数据并保存文件时,请确保向他们解释使用“保存”而不明确执行导出的CSV文件的限制。 - Wouter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接