我试图从.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无法识别模板中的特殊字符。
答案 0 :(得分:0)
UTF-8是一个可以包含任何Unicode字符的编码集。遗憾的是,并非所有应用程序都可以默认使用UTF-8编码文件,而Microsoft Excel就是其中之一。
Excel使用ANSI
对CSV文件进行编码,而不是Unicode要么用户要求用户在记事本中打开文件并以正确的格式保存(要做很多工作!)或者找出一些检测/转换逻辑。