2015-12-14 3 views
1

Я пытаюсь реализовать простой импорт данных в мое приложение MVC из CSV-файла.Как предотвратить excel от изменения кодировки csv-файла после сохранения?

Чтобы удалить необходимость сохранения файла CSV-файла на своем компьютере и из-за проблемы с его получением, я создал кнопку в моей форме, которая генерирует шаблон.

сгенерировать строку из моей модели объекта в классе писателя:

this.Writer.GetCswTemplate() возвращает строку из ViewModel (т.е. COLUMN1; colum2 \ г \ п)

По How to GetBytes() in C# with UTF8 encoding with BOM?

I force excel для открытия CSV-файла с кодировкой UTF-8:

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 (без спецификации), измените указанный файл в excel и сохраните его, Excel не изменит свою кодировку в ANSI. Проблема в том, что Excel не распознает специальные символы внутри шаблона.

+0

Этот вопрос не имеет ничего общего ни с C#, ни с asp.net MVC. – ataravati

+0

Я не согласен, что это дублированный вопрос. Я все еще верю, что должен быть способ заставить excel не изменять кодировку, поскольку она не меняет его, когда он установлен как UTF-8 без спецификации. Если я не найду способ сделать это, я, вероятно, пойду так, как предложил Chriss в комментарии ответа, и будет проверять кодировку импорта файлов или выходить из csv complete и просто использовать excel it self. Если это произойдет, я буду принимать вопрос как дубликат. –

ответ

0

UTF-8 - это набор кодировок, который может содержать любой символ Юникода. К сожалению, не все приложения могут по умолчанию кодировать файлы в UTF-8, а Microsoft Excel - один из них.

Вместо Unicode, Excel кодирует CSV файлов с использованием ANSI

Один должен либо попросить пользователя, чтобы открыть файл в блокноте и сохранить в нужном формате (много работы!) Или работать некоторое обнаружение/логика преобразования.

+0

Да, я так понял, все еще не объясняет, почему excel не меняет кодировку файла csv, закодированного с помощью UTF-8 без спецификации. –

+0

Общее эмпирическое правило всегда предполагает, что конечный пользователь полностью уничтожит все, что вы им дадите. Если вы намереваетесь разрешить загружать на свой сайт то, что было в руках пользователя, то вы должны предпринять все необходимые шаги, чтобы убедиться, что он правильно закодирован, правильно отформатирован и т. Д. Смена этой ответственности на стороне клиента никогда не будет решение. –

+0

Я нашел много вариантов для сохранения CSV как UTF-8 из разных приложений здесь. https://help.surveygizmo.com/help/encode-an-excel-file-to-utf-8-or-utf-16 –

Смежные вопросы