tablas - macro para importar xml a excel
¿Cuál es la mejor manera de exportar datos UTF8 a Excel? (8)
Descubrí que si estableces la codificación del conjunto de caracteres de la página web en utf-8, y luego Response.BinaryWrite la marca de orden de bytes UTF-8 (0xEF 0xBB 0xBF) en la parte superior del archivo csv, entonces Excel 2007 (no estoy seguro otras versiones) lo reconocerán como utf-8 y lo abrirán correctamente.
Así que tenemos esta aplicación web en la que 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.
Así que he investigado un poco (la gente de Intervals tiene una publicación interesante al respecto ), y hay algunas opciones limitadas pero ridículamente molestas. Entre ellos:
- suministro de un archivo UTF-16 Little Endian TSV que Excel interpretará correctamente, pero que no admitirá datos de varias líneas
- suministrar los datos en una tabla HTML con una extensión de archivo o tipo MIME de Excel (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 esos serían compatibles con UTF8, en teoría. SpreadsheetML, utilizando XSLT personalizado o generando el nuevo formato XML de Excel mediante plantillas.
Parece que pase lo que pase, 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: Hemos estado utilizando la gema Ruport en nuestro sistema de seguimiento de tiempo Tempo para proporcionar las exportaciones de CSV la primera vez que publiqué esta pregunta. Uno de mis compañeros de trabajo, Erik Hollensbee, armó un filtro rápido para que Ruport nos proporcionara la salida real de Excel XSL, y pensé que lo compartiría aquí para cualquier otro rubí-ists:
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
Después de luchar con el mismo problema durante unas horas, encontré esta excelente publicación sobre el tema
http://blog.plataformatec.com.br/2009/09/exporting-data-to-csv-and-excel-in-your-rails-app/ quote:
Entonces, estas son las tres reglas para lidiar con Excel-friendly-CSV:
- Use tabulaciones, no comas.
- Los campos NO deben contener líneas nuevas.
- Use UTF-16 Little Endian para enviar el archivo al usuario. E incluye una pequeña lista de materiales de Endian manualmente.
Sin embargo, si estás usando ruby, tu problema está resuelto: primero tienes la gema FasterCSV
pero terminé usando la gema de la hoja de cálculo que genera directamente hojas de cálculo excell (tengo limitación de enlace, solo google spreadsheet + rubyforge) ¡Brillante!
Excel no maneja UTF-8 correctamente. En su lugar, debe usar una página de códigos que satisfaga sus necesidades
Response.ContentType = "text/plain";
// codepage: 28591, codepage name:iso-8859-1, codepage display name: Western European (ISO)
Response.ContentEncoding = System.Text.Encoding.GetEncoding(28591);
Me enamoré de esta publicación en busca de la respuesta de Ruby sobre por qué Excel no cargaría correctamente un archivo CSV con caracteres UTF-8. Después de buscar y experimentar, esta solución funcionó para mí:
csv_content = CSV.generate(col_sep: "/t", headers: :first_row, encoding: ''utf-8'') do |csv|
csv << ["header1", "header2"]
csv << ["content1", "content2"]
end
write_content = Iconv.conv("utf-16le", "utf-8", "/xEF/xBB/xBF")
write_content += Iconv.conv("utf-16le", "utf-8", csv_content)
File.open("listing.csv", ''wb'') {|f| f.write(write_content) }
Pruebe OpenOffice Calc - es mucho más amigable para Unicode - Importa y exporta archivos CSV con codificación UTF-8.
Se está olvidando de crear un origen de datos OleDB e Interoperación de Excel, pero también hay problemas con ellos.
Recomiendo la opción SpreadsheetML . Funciona bastante bien, es probable que su plataforma tenga algunas herramientas decentes para compilar archivos xml, y es totalmente compatible desde OfficeXP. Office2000 no es compatible, pero la experiencia personal es que funciona de manera limitada.
Si crea un XML con codificación utf y lo guarda como .xls, abrirá incluso esos caracteres de dos bytes:
xml version = "1.0" encoding = "utf-8"
Tuve exactamente el mismo problema de enviar datos UTF8 a Excel. Mi solución:
La versión actual de Perl Spreadsheet :: WriteExcel código cpan escribe correctamente archivos de Excel utilizando datos UTF8.
Así que escribí un plugin de Rails que a) abre un conducto bidireccional a un programa perl b) envía los datos, una fila a la vez, al programa perl. Yo uso Yaml como el formato de datos del mensaje. (Ruby yaml estándar no es UTF8, hay una versión especial disponible, ya2yaml) c) El programa perl crea el archivo excel d) Cuando el programa Rails indica (a través de un mensaje yaml) que se ha enviado la última fila, el programa perl crea el archivo de Excel y envía el estado nuevamente al programa de rieles.
Por supuesto, agregar un programa perl a un proyecto de rieles a través de un proceso paralelo y una tubería está muy en el espectro de "Ingeniería" en lugar de "Informática". (Hace el trabajo, pero no es elegante.) Pero funciona bien y me ahorró las semanas que tardaría en llevar el código WriteExcel a Ruby. También tenga en cuenta que el puerto Ruby actualmente disponible de WriteExcel no maneja utf8.
Mi SW es de código abierto permisivo pero aún no he tenido tiempo de publicarlo. Si lo quiere en su estado actual, consulte http://sandbox.kluger.com/write_excel_v.5.tar
Tenga en cuenta que querrá crear sus archivos de Excel en un proceso en segundo plano, no en el proceso del controlador de Rails, ya que eso bloquearía a otros clientes del navegador a medida que avanza produciendo el archivo de Excel. Uso el complemento DelayedJob, funciona bien.
Espero que esto ayude,
Larry