Así que tenemos esta aplicación web donde admitimos datos UTF8. Hooray UTF8. Y podemos exportar los datos suministrados por el usuario a CSV sin ningún problema, todavía está en UTF8 en ese punto. El problema es cuando abre un CSV UTF8 típico en Excel, lo lee como texto codificado ANSII, y en consecuencia trata de leer caracteres de dos bytes como ø y ü como dos caracteres separados y termina con falla.¿Cuál es la mejor manera de exportar datos UTF8 a Excel?
Así que he hecho un poco de excavación (la gente de Intervals tiene una publicación interesante about it here), y hay algunas opciones limitadas aunque ridículamente molestas por ahí. Entre ellos:
- suministrar un archivo UTF-16 Little Endian TSV, que Excel interpretará correctamente, pero que no apoyará los datos multilínea
- que suministran los datos en una tabla HTML con un tipo MIME de Excel o extensión de archivo (no estoy seguro si esta opción es compatible con UTF8)
- Hay tres o cuatro formas de obtener datos XML en las diversas versiones recientes de Excel, y eso sería compatible con UTF8, en teoría. SpreadsheetML, utilizando XSLT personalizado o generando el nuevo formato XML de Excel mediante plantillas.
Parece que no importa qué, probablemente voy a querer continuar ofreciendo un archivo CSV sencillo para las personas que no lo usan para Excel de todos modos, y una opción de descarga por separado para Excel.
¿Cuál es la forma más sencilla de generar ese archivo Just-For-Excel que admitirá correctamente UTF8, mi querido Stack Overflowers? Si la opción más simple solo admite la última versión de Excel, eso sigue siendo interesante.
Estoy haciendo esto en una pila de Rails, pero es curioso cómo los .Neters y gente de cualquier framework manejan esto. Trabajo en algunos entornos diferentes y definitivamente este es un problema que volverá a surgir.
Actualización 2010-10-22: Nos había estado utilizando la gema Ruport en nuestro sistema de seguimiento de tiempo para proporcionar Tempo las exportaciones CSV cuando por primera vez esta pregunta. Uno de mis compañeros de trabajo, Erik Hollensbee, lanzaron conjuntamente un filtro rápido para Ruport que nos proporcione salida real Excel XSL, y pensé que me gustaría compartir aquí que para cualquier otro rubí-tas:
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
"Te estás olvidando ... un OleDB ..." Ssh! Este es un entorno Unix, así que me gustaría evitar ese tipo de Voodoo. ¡Gracias por el consejo! –
¿por qué está marcado como correcto? – hoju
@Richard: debido al segundo párrafo, que no depende de oledb. Aunque a partir de la actualización que se publicó más de 1 1/2 años después, debería haber una respuesta aquí señalando a la gente a Ruby Rupert. –