【发布时间】:2016-03-20 00:40:46
【问题描述】:
我正在尝试将简单的数据从 .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() 助手的用户:
return this.File(templateBytes, "application/csv", "filename.csv");
它工作得很好,它生成模板,将它返回给用户,用 Excel 打开它并显示其中的所有特殊字符。如果我在 Notepad++ 中打开生成的文件,我可以看到它的编码是 UTF-8。
当用户填写生成的模板并将其保存在 Excel 中时,会出现此问题。出于某种原因,Excel 决定将文件编码更改为 ANSI。
我有什么办法可以防止这种情况发生吗?我错过了什么(添加某种标题或其他东西)吗?
有趣的是,如果我使用 UTF-8(无 BOM)生成模板,在 excel 中修改所述文件并保存,Excel 不会将其编码更改为 ANSI。那么问题是 Excel 无法识别模板中的特殊字符。
【问题讨论】:
-
这个问题与 C# 和 asp.net MVC 都没有任何关系。
-
我不同意这是一个重复的问题。我仍然相信必须有一种方法可以强制 excel 不更改编码,因为当它设置为没有 BOM 的 UTF-8 时它不会更改它。如果我找不到这样做的方法,我可能会采用 Chriss 在答案评论中建议的方式,并验证用户导入文件的编码,或者离开 csv 完整并只使用 excel 它自己。如果发生这种情况,我会接受这个问题是重复的。