problem - Microsoft Excel destruye Diacritics en archivos.csv?
excel utf-8 encoding csv export (22)
A continuación se muestra el código PHP que uso en mi proyecto al enviar Microsoft Excel al usuario:
/**
* Export an array as downladable Excel CSV
* @param array $header
* @param array $data
* @param string $filename
*/
function toCSV($header, $data, $filename) {
$sep = "/t";
$eol = "/n";
$csv = count($header) ? ''"''. implode(''"''.$sep.''"'', $header).''"''.$eol : '''';
foreach($data as $line) {
$csv .= ''"''. implode(''"''.$sep.''"'', $line).''"''.$eol;
}
$encoded_csv = mb_convert_encoding($csv, ''UTF-16LE'', ''UTF-8'');
header(''Content-Description: File Transfer'');
header(''Content-Type: application/vnd.ms-excel'');
header(''Content-Disposition: attachment; filename="''.$filename.''.csv"'');
header(''Content-Transfer-Encoding: binary'');
header(''Expires: 0'');
header(''Cache-Control: must-revalidate, post-check=0, pre-check=0'');
header(''Pragma: public'');
header(''Content-Length: ''. strlen($encoded_csv));
echo chr(255) . chr(254) . $encoded_csv;
exit;
}
ACTUALIZADO: Mejora de nombre de archivo y BUG corregir el cálculo de longitud correcta. Gracias a TRiG y @ivanhoe011
Estoy exportando datos mediante programación (usando PHP 5.2) en un archivo de prueba .csv.
Datos de ejemplo: Numéro 1
(observe la e acentuada). Los datos son utf-8
(no hay lista de materiales anterior).
Cuando abro este archivo en MS Excel, aparece como Numéro 1
.
Puedo abrir esto en un editor de texto (UltraEdit) que lo muestra correctamente. UE informa que el carácter es decimal 233
.
¿Cómo puedo exportar datos de texto en un archivo .csv para que MS Excel lo represente correctamente , preferiblemente sin forzar el uso del asistente de importación, o configuraciones de asistente no predeterminadas?
Como dijo Fregal, / uFEFF es el camino a seguir.
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("/uFEFF");
// csv text here
%>
Compruebe la codificación en la que está generando el archivo, para que Excel muestre el archivo correctamente, debe usar la página de códigos predeterminada del sistema.
¿Qué idioma estás usando? si es .Net, solo necesita usar Encoding.Default mientras genera el archivo.
Con Ruby 1.8.7 codifico cada campo a UTF-16 y descarto la lista de materiales (quizás).
El siguiente código se extrae de active_scaffold_export:
<%
require ''fastercsv''
fcsv_options = {
:row_sep => "/n",
:col_sep => params[:delimiter],
:force_quotes => @export_config.force_quotes,
:headers => @export_columns.collect { |column| format_export_column_header_name(column) }
}
data = FasterCSV.generate(fcsv_options) do |csv|
csv << fcsv_options[:headers] unless params[:skip_header] == ''true''
@records.each do |record|
csv << @export_columns.collect { |column|
# Convert to UTF-16 discarding the BOM, required for Excel (> 2003 ?)
Iconv.conv(''UTF-16'', ''UTF-8'', get_export_column_value(record, column))[2..-1]
}
end
end
-%><%= data -%>
La línea importante es:
Iconv.conv(''UTF-16'', ''UTF-8'', get_export_column_value(record, column))[2..-1]
Echo UTF-8 BOM antes de enviar datos CSV. Esto soluciona todos los problemas de carácter en Windows pero no funciona para Mac.
echo "/xEF/xBB/xBF";
Funciona para mí porque necesito generar un archivo que se utilizará solo en PC con Windows.
El formato CSV se implementa como ASCII, no unicode, en Excel, lo que daña los signos diacríticos. Experimentamos el mismo problema y así es como averigué que el estándar oficial de CSV se definió como basado en ASCII en Excel.
Encontré una manera de resolver el problema. Este es un hack desagradable, pero funciona: abra el documento con Open Office , luego guárdelo en cualquier formato de Excel; los .xls
o .xlsx
resultantes mostrarán los caracteres acentuados.
Escribir una lista de materiales para el archivo CSV de salida en realidad funcionó para mí en Django:
def handlePersoonListExport(request):
# Retrieve a query_set
...
template = loader.get_template("export.csv")
context = Context({
''data'': query_set,
})
response = HttpResponse()
response[''Content-Disposition''] = ''attachment; filename=export.csv''
response[''Content-Type''] = ''text/csv; charset=utf-8''
response.write("/xEF/xBB/xBF")
response.write(template.render(context))
return response
Para más información http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html Gracias chicos!
Esto es solo una cuestión de codificaciones de caracteres. Parece que está exportando sus datos como UTF-8: é en UTF-8 es la secuencia de dos bytes 0xC3 0xA9, que cuando se interpreta en Windows-1252 es à ©. Cuando importe sus datos en Excel, asegúrese de decirle que la codificación de caracteres que está usando es UTF-8.
Excel 2007 lee correctamente UTF-8 con BOM (EF BB BF) codificado csv.
Excel 2003 (y quizás antes) lee UTF-16LE con BOM (FF FE), pero con TAB en lugar de comas o punto y coma.
Otra solución que encontré fue simplemente codificar el resultado como la Página de códigos de Windows 1252 (Windows-1252 o CP1252). Esto se haría, por ejemplo, configurando Content-Type
apropiadamente para algo como text/csv; charset=Windows-1252
text/csv; charset=Windows-1252
y configura la codificación de caracteres de la secuencia de respuesta de manera similar.
Prefijo una BOM (/ uFEFF) funcionó para mí (Excel 2007), en que Excel reconoció el archivo como UTF-8. De lo contrario, guardarlo y usar el asistente de importación funciona, pero es menos ideal.
Puede guardar un archivo html con la extensión ''xls'' y los acentos funcionarán (al menos antes de 2007).
Ejemplo: guardar esto (usando Guardar como utf8 en el Bloc de notas) como test.xls:
<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
<th>id</th>
<th>name</th>
</tr>
<tr>
<td>4</td>
<td>Hélène</td>
</tr>
</table>
</html>
Si tiene código heredado en vb.net como yo, el siguiente código me funcionó:
Response.Clear()
Response.ClearHeaders()
Response.ContentType = "text/csv"
Response.Expires = 0
Response.AddHeader("Content-Disposition", "attachment; filename=export.csv;")
Using sw As StreamWriter = New StreamWriter(Context.Response.OutputStream, System.Text.Encoding.Unicode)
sw.Write(csv)
sw.Close()
End Using
Response.End()
Solo puedo hacer que CSV se analice correctamente en Excel 2007 como UTF-16 little-endian separado por tabuladores, comenzando con la marca de orden de bytes correcta.
También noté que la pregunta fue "respondida" hace un tiempo, pero no entiendo las historias que dicen que no se puede abrir un archivo csv con codificación utf8 correctamente en Excel sin utilizar el asistente de texto.
Mi experiencia reproducible: escriba Old MacDonald had a farm,ÈÌÉÍØ
en el Bloc de notas Old MacDonald had a farm,ÈÌÉÍØ
Enter, luego Save As (usando la opción UTF-8).
Usando Python para mostrar lo que está realmente allí:
>>> open(''oldmac.csv'', ''rb'').read()
''/xef/xbb/xbfOld MacDonald had a farm,/xc3/x88/xc3/x8c/xc3/x89/xc3/x8d/xc3/x98/r/n''
>>> ^Z
Bueno. Bloc de notas ha puesto una lista de materiales en la parte delantera.
Ahora vaya a Windows Explorer, haga doble clic en el nombre del archivo, o haga clic con el botón derecho y use "Abrir con ...", y hasta aparece Excel (2003) con la pantalla como se esperaba.
Tenga en cuenta que la inclusión de la lista de materiales UTF-8 no es necesariamente una buena idea: las versiones Mac de Excel la ignoran y en realidad la mostrará como ASCII ... tres desagradables caracteres al comienzo del primer campo en su hoja de cálculo ...
UTF-8 no funciona para mí en Office 2007 sin ningún service pack, con o sin BOM (U + ffef o 0xEF, 0xBB, 0xBF, ninguno funciona) al instalar sp3 hace que UTF-8 funcione cuando 0xEF, 0xBB, 0xBF BOM es antepuesto
UTF-16 funciona cuando se codifica en python usando "utf-16-le" con una lista de materiales 0xff 0xef antepuesta, y usando tab como separador. Tuve que escribir manualmente la lista de materiales, y luego usar "utf-16-le" en lugar de "utf-16", de lo contrario cada codificar () antepuso la lista de materiales a cada fila escrita que apareció como basura en la primera columna de la segunda línea y después.
no puedo decir si UTF-16 funcionaría sin ningún sp instalado, ya que no puedo volver ahora. suspiro
Esto está en windows, no sé de oficina para MAC.
para ambos casos de trabajo, la importación funciona al iniciar una descarga directamente desde el navegador y el asistente de importación de texto no interviene, funciona como era de esperar.
Un archivo UTF8 correctamente formateado puede tener una marca de orden de bytes como sus primeros tres octetos. Estos son los valores hexadecimales 0xEF, 0xBB, 0xBF. Estos octetos sirven para marcar el archivo como UTF8 (ya que no son relevantes como información de "orden de bytes"). 1 Si esta lista de materiales no existe, el consumidor / lector debe deducir el tipo de codificación del texto. Los lectores que no son compatibles con UTF8 leerán los bytes como otra codificación como Windows-1252 y mostrarán los caracteres 
al comienzo del archivo.
Existe un error conocido en el que Excel, al abrir los archivos UTF8 CSV a través de la asociación de archivos, asume que están en una codificación de un solo byte, sin tener en cuenta la presencia de la lista de materiales UTF8. Esto no puede ser arreglado por ninguna página de códigos predeterminada del sistema o configuración de idioma. La lista de materiales no mostrará ninguna pista en Excel, simplemente no funcionará. (Un informe de minorías afirma que la BOM a veces activa el asistente de "Importar texto".) Parece que esta falla existe en Excel 2003 y versiones anteriores. La mayoría de los informes (en medio de las respuestas aquí) dicen que esto está arreglado en Excel 2007 y versiones posteriores.
Tenga en cuenta que siempre puede * abrir correctamente los archivos CSV UTF8 en Excel utilizando el asistente "Importar texto", que le permite especificar la codificación del archivo que está abriendo. Por supuesto, esto es mucho menos conveniente.
Los lectores de esta respuesta probablemente se encuentren en una situación en la que no sean compatibles con Excel <2007, pero están enviando texto crudo UTF8 a Excel, lo cual es malinterpretar y rociar su texto con Ã
y otros caracteres similares de Windows-1252. Agregar la BOM UTF8 es probablemente su mejor y más rápida solución.
Si está atrapado con usuarios en Excels anteriores y Excel es el único consumidor de sus CSV, puede solucionar esto exportando UTF16 en lugar de UTF8. Excel 2000 y 2003 harán doble clic en abrirlos correctamente. (Algunos otros editores de texto pueden tener problemas con UTF16, por lo que es posible que deba sopesar cuidadosamente sus opciones).
* Excepto cuando no se puede, (al menos) Excel 2011 for Mac''s Import Wizard en realidad no funciona con todas las codificaciones, independientemente de lo que le indique. </ anecdotal-evidence> :)
abra el archivo csv con el bloc de notas ++ haga clic en Codificar, seleccione convertir a UTF-8 (no convertir a UTF-8 (sin lista de materiales)) Guardar abierto haciendo doble clic con excel Espero que ayuda Christophe GRISON
seleccione codificación UTF-8 al importar. si usa Office 2007, aquí es donde lo eligió: justo después de abrir el archivo.
La respuesta para todas las combinaciones de versiones de Excel (2003 + 2007) y tipos de archivos
La mayoría de las demás respuestas se refieren únicamente a su versión de Excel y no necesariamente lo ayudarán, porque es posible que su respuesta no sea cierta para su versión de Excel.
Por ejemplo, agregar el carácter BOM introduce problemas con el reconocimiento automático del separador de columnas, pero no con cada versión de Excel.
Hay 3 variables que determinan si funciona en la mayoría de las versiones de Excel:
- Codificación
- Presencia de personaje BOM
- Separador de celdas
Alguien estoico en SAP probó todas las combinaciones e informó el resultado. ¿Resultado final? Use UTF16le con BOM y carácter de tabulación como separador para que funcione en la mayoría de las versiones de Excel.
Usted no me cree? Yo tampoco lo haría, pero lea aquí y llore: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator