Итак, у нас есть это веб-приложение, в котором мы поддерживаем данные UTF8. Ура UTF8. И мы можем экспортировать предоставленные пользователем данные в CSV без проблем - в тот момент они все еще были в UTF8. Проблема в том, что когда вы открываете типичный CSV-файл UTF8 в Excel, он читает его как текст в кодировке ANSII и, соответственно, пытается прочитать двухбайтовые символы, такие как ø и ü, как два отдельных символа, и в результате вы получаете ошибку.
Итак, я немного покопался (у ребят из Интервалов есть интересный пост об этом здесь ), и есть некоторые ограниченные, если до смешного надоедливые варианты. Среди них:
- предоставляет файл UTF-16 Little Endian TSV, который Excel будет правильно интерпретировать, но который не будет поддерживать многострочные данные
- предоставление данных в таблице HTML с расширением mime-типа или расширением файла Excel (не уверен, поддерживает ли этот параметр UTF8)
- Существует три или четыре способа передачи данных XML в различные последние версии Excel, и те теоретически поддерживают UTF8. SpreadsheetML с использованием пользовательского XSLT или создание нового формата Excel XML с помощью шаблонов.
Похоже, что несмотря ни на что, я, вероятно, захочу продолжить предлагать простой старый файл CSV для людей, которые все равно не используют его для Excel, и отдельный вариант загрузки для Excel.
Какой самый простой способ создания файла Just-For-Excel, который будет правильно поддерживать UTF8, мои дорогие переполнения стека? Если этот самый простой вариант поддерживает только последнюю версию Excel, это по-прежнему представляет интерес.
Я делаю это в стеке Rails, но мне любопытно, как .Net-пользователи и люди в любых фреймворках справляются с этим. Я сам работаю в нескольких различных условиях, и это определенно станет проблемой.
Обновление 2010-10-22: Мы использовали гем Ruport в нашей системе отслеживания времени Tempo , чтобы обеспечить экспорт CSV, когда я впервые опубликовал этот вопрос. Один из моих коллег, Эрик Холленсби, собрал быстрый фильтр для Ruport, чтобы предоставить нам фактический вывод Excel XSL, и я решил поделиться этим здесь с любыми другими пользователями ruby:
require 'rubygems'
require 'ruport'
require 'spreadsheet'
require 'stringio'
Spreadsheet.client_encoding = "UTF-8"
include Ruport::Data
class Ruport::Formatter::Excel < Ruport::Formatter
renders :excel, :for => Ruport::Controller::Table
def output
retval = StringIO.new
if options.workbook
book = options.workbook
else
book = Spreadsheet::Workbook.new
end
if options.worksheet_name
book_args = { :name => options.worksheet_name }
else
book_args = { }
end
sheet = book.create_worksheet(book_args)
offset = 0
if options.show_table_headers
sheet.row(0).default_format = Spreadsheet::Format.new(
options.format_options ||
{
:color => :blue,
:weight => :bold,
:size => 18
}
)
sheet.row(0).replace data.column_names
offset = 1
end
data.data.each_with_index do |row, i|
sheet.row(i+offset).replace row.attributes.map { |x| row.data[x] }
end
book.write retval
retval.seek(0)
return retval.read
end
end