保存后如何防止excel更改csv文件编码?

时间:2015-12-14 13:47:49

标签: excel csv utf-8

我试图从.csv文件中实现对我的MVC应用程序的简单数据导入。

为了消除用户在他的计算机中保存.csv文件模板的需要,并且从一开始就遇到麻烦,我在表单上创建了一个生成模板的按钮。

我在编写器类中从我的模型对象生成一个字符串:

this.Writer.GetCswTemplate()从viewModel返回字符串(即column1; colum2 \ r \ n

根据How to GetBytes() in C# with UTF8 encoding with BOM?

我强制excel打开UTF-8编码的.csv文件:

var templateResult = Encoding.UTF8.GetBytes(this.Writer.GetCswTemplate());
var preamble = Encoding.UTF8.GetPreamble();
var templateBytes = preamble.Concat(templateResult).ToArray();

将生成的模板发送给用户我使用MVC File()helper:

return this.File(templateBytes, "application/csv", "filename.csv");

效果很好,它会生成模板,将其返回给用户,使用Excel打开它并显示其中的所有特殊字符。如果我在Notepad ++中打开生成的文件,我可以看到它的编码是UTF-8。

当用户填充生成的模板并将其保存在Excel中时,会出现问题。出于某种原因,Excel决定将文件编码更改为ANSI。

我有什么方法可以阻止这种情况吗?我错过了什么(添加某种标题或其他东西)?

有趣的是,如果我使用UTF-8生成模板(没有BOM),在excel中修改所述文件并保存,Excel不会将其编码更改为ANSI。那么问题是Excel无法识别模板中的特殊字符。

1 个答案:

答案 0 :(得分:0)

UTF-8是一个可以包含任何Unicode字符的编码集。遗憾的是,并非所有应用程序都可以默认使用UTF-8编码文件,而Microsoft Excel就是其中之一。

Excel使用ANSI

对CSV文件进行编码,而不是Unicode

要么用户要求用户在记事本中打开文件并以正确的格式保存(要做很多工作!)或者找出一些检测/转换逻辑。