Pregunta

Tengo esta cosa muy sencilla que simplemente da salida a un poco de materia en formato CSV, pero tiene que ser UTF-8. Abro este archivo en TextEdit o TextMate o Dreamweaver y muestra caracteres UTF-8 correctamente, pero si lo abro en Excel que está haciendo esta tonta IA tipo de cosas en su lugar. Esto es lo que tengo en la cabeza de mi documento:

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

Todo esto parece tener el efecto deseado, excepto Excel (Mac, 2008) no quiere importar correctamente. No hay opciones en Excel para mí "abierta como UTF-8" o cualquier cosa, así que ... estoy un poco molesto.

Me parece que no puede encontrar ninguna solución clara a esta en cualquier lugar, a pesar de una gran cantidad de personas que tienen el mismo problema. Lo que veo es el más para incluir la lista de materiales, pero no puedo averiguar exactamente cómo hacerlo. Como se puede ver arriba sólo estoy echoing estos datos, no estoy escribiendo cualquier archivo. Puedo hacer eso si necesito, yo no soy, porque no parece como una necesidad de que en este punto. Cualquier ayuda?

Actualización: He intentado haciendo eco de la lista de materiales como echo pack("CCC", 0xef, 0xbb, 0xbf); que acabo extraídos de un sitio que estaba tratando de detectar la lista de materiales. Pero Excel simplemente añade esos tres personajes a la primera celda cuando se importaciones, y todavía puede confundir los caracteres especiales.

¿Fue útil?

Solución

Para cotización un ingeniero de soporte de Microsoft ,

  

Excel para Mac no es compatible actualmente con UTF-8

Actualización de 2017 : Esto es cierto para todas las versiones de Microsoft Excel para Mac antes de Oficina 2016 . Las versiones más recientes (de la Oficina 365) no soportan ahora UTF-8.

Con el fin de salida UTF-8 contenido que Excel tanto en Windows y OS X será capaz de leer con éxito, tendrá que hacer dos cosas:

  1. Asegúrese de que convierta el texto UTF-8 a UTF-16LE

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    
  2. Asegúrese de que se agrega la marca de orden de bytes UTF-16LE

    chr(255) . chr(254)
    

El siguiente problema que aparece sólo con Excel en OS X (pero no Windows) habrá durante la visualización de un archivo CSV con valores separados por comas, Excel hará que sólo filas con una fila y toda la texto junto con las comas en la primera fila.

La forma de evitar esto es utilizar pestañas como su valor separado.

I utiliza esta función de los comentarios de PHP (utilizando pestañas " \ t" en lugar de comas) y funcionó perfectamente en OS X y Windows Excel.

Tenga en cuenta que para corregir un problema con una columna de vacío como el final de una fila, que yo tenía que cambiar la línea de código que dice:

    $field_cnt = count($fields);

a

    $field_cnt = count($fields)-1;

Como algunos de los otros comentarios en esta página por ejemplo, otras aplicaciones de hoja de cálculo, como OpenOffice Calc, propios números de Apple y la hoja de cálculo de Google Docs tienen problemas con UTF-8-archivos con comas.

la tabla en esta pregunta de lo que funciona y no funciona para archivos Unicode CSV en Excel


Como nota al margen, debo añadir que si está utilizando Compositor , usted debe echar un vistazo a la adición de League\Csv a su requiere. League\Csv tiene una muy buena API para la creación de archivos CSV .

Para usar League\Csv con este método de creación de archivos CSV, echa un vistazo a este ejemplo

Otros consejos

Tengo la misma (o similar) problema.

En mi caso, si añado una lista de materiales a la salida, funciona:

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

creo que esto es un truco bastante feo, pero funcionó para mí, al menos para Excel 2007 de Windows. No estoy seguro de que va a trabajar en Mac.

Aquí es cómo lo hice (eso es de navegador mensaje para descargar el archivo csv):

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();

Lo único que fija la codificación UTF8 problema en la vista previa CSV cuando se pulse la barra espaciadora en Mac .. pero no en Excel Mac 2008 ... no sé por qué

Yo sólo trataba con el mismo problema, y ??se acercó con dos soluciones.

  1. Utilice el PHPExcel clase según lo sugerido por bpeterson76 .

    • El uso de esta clase genera el archivo más ampliamente compatibles, yo era capaz de generar un archivo de datos de codificación UTF-8 que bien abre en Excel 2008 Mac, Excel 2007 de Windows, y Google Docs.
    • El mayor problema con el uso PHPExcel es que es lento y utiliza una gran cantidad de memoria, que no es un problema para los archivos de tamaño razonable, pero si el archivo de Excel / CSV tiene cientos o miles de filas, esta biblioteca se convierte en inservible .
    • Este es un método PHP que se llevará a algunos datos TSV y salida de un archivo de Excel en el explorador, nota que utiliza el escritor Excel5, lo que significa que el archivo debe ser compatible con versiones anteriores de Excel, pero sin ya no tienen acceso a cualquiera, así que no puedo probarlos.

      function excel_export($tsv_data, $filename) {
          $export_data = preg_split("/\n/", $tsv_data);
          foreach($export_data as &$row) {
              $row = preg_split("/\t/", $row);
          }
      
          include("includes/PHPExcel.php");
          include('includes/PHPExcel/Writer/Excel5.php');
      
          $objPHPExcel = new PHPExcel();          
      
          $objPHPExcel->setActiveSheetIndex(0);
          $sheet = $objPHPExcel->getActiveSheet();
          $row = '1';
          $col = "A";
          foreach($export_data as $row_cells) {
              if(!is_array($row_cells)) { continue; }
                  foreach($row_cells as $cell) {
                      $sheet->setCellValue($col.$row, $cell);
                      $col++;
                  }
              $row += 1;
              $col = "A";
          }
      
          $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
          header('Content-Type: application/vnd.ms-excel');
          header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
          header('Cache-Control: max-age=0');
          $objWriter->save('php://output');   
          exit;   
      }
      
  2. Debido a los problemas de eficiencia con PHPExcel, también tenía que encontrar la manera de generar un archivo CSV compatible con UTF-8 y Excel o un archivo TSV.

    • Lo mejor que podía venir fue un archivo que era compatible con Mac Excel 2008 y Excel 2007 PC, pero no Google Docs, que es lo suficientemente bueno para mi aplicación.
    • he encontrado la solución aquí , en concreto, esta respuesta , pero también se debe leer la accepted responder ya que explica el problema.
    • Este es el código PHP que usé, nota que estoy usando tsv de datos (fichas como delimitadores en lugar de comas):

      header ( 'HTTP/1.1 200 OK' );
      header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Last-Modified: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Content-Type: application/vnd.ms-excel') ;
      header ( 'Content-Disposition: attachment;filename=export.csv' );
      print chr(255) . chr(254) . mb_convert_encoding($tsv_data, 'UTF-16LE', 'UTF-8');
      exit;
      

Yo estaba teniendo el mismo problema y se resolvió, como a continuación:

    header('Content-Encoding: UTF-8');
    header('Content-Type: text/csv; charset=utf-8' );
    header(sprintf( 'Content-Disposition: attachment; filename=my-csv-%s.csv', date( 'dmY-His' ) ) );
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    $df = fopen( 'php://output', 'w' );

    //This line is important:
    fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!

    foreach ( $rows as $row ) {
        fputcsv( $df, $row );
    }
    fclose($df);
    exit();

Excel no soporta UTF-8. Usted tiene que codificar el texto UTF-8 en UCS-2LE.

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');

Para dar seguimiento a esto:

Parece que el problema es simplemente con Excel en el Mac. No es la forma en que estoy generando los archivos, ya que incluso la generación de CSV desde Excel se les romperse. Puedo guardar como CSV, y reimportación, y todos los personajes están en mal estado.

Así que ... no parece ser una respuesta correcta a esta. Gracias por todas las sugerencias.

Yo diría que a partir de todo lo que he leído, la sugerencia de @ Daniel Magliola acerca de la lista de materiales, probablemente sería la mejor respuesta por algún otro equipo. Sin embargo, todavía no resuelve mi problema.

En mi caso después de trabajos muy agradable para hacer archivo CSV con UTF-8 caracteres muestra correctamente en Excel.

$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);

La cabecera de lista de materiales 0xEF 0xBB 0xBF será que Excel interprete que la codificación correcta.

Esto funciona bien en Excel para Windows y Mac OS también.

Reparar incidencias en Excel que no se ven los caracteres diacríticos que contienen caracteres cirílicos letra griega y símbolos de moneda.

function writeCSV($filename, $headings, $data) {   

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel

    exit;
}

El archivo CSV MUSST incluir una marca de orden de bytes.

O como se sugiere y solucionar simplemente eco con el cuerpo HTTP

Desde la codificación UTF8 no juega bien con Excel. Puede convertir los datos a otro tipo de codificación utilizando iconv().

por ejemplo.

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),

Añadir:

fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));

O:

fprintf($file, "\xEF\xBB\xBF");

Antes de escribir cualquier contenido en el archivo CSV.

Ejemplo:

<?php
$file = fopen( "file.csv", "w");
fprintf( $file, "\xEF\xBB\xBF");
fputcsv( $file, ["english", 122, "বাংলা"]);
fclose($file);

no es necesaria la conversión ya UTF-8 texto codificado mediante el uso de mb_convert_encoding. Sólo tiene que añadir tres personajes frente al contenido original:

$newContent = chr(239) . chr(187) . chr(191) . $originalContent

Para mí esto resuelve el problema de los caracteres especiales en los archivos CSV.

A medida que investigué y encontré que UTF-8 no está funcionando bien en MAC y Windows, así que traté con Windows-1252, soporta bien en los dos, pero se debe seleccionar el tipo de codificación en ubuntu. Aquí está mi code$valueToWrite = mb_convert_encoding($value, 'Windows-1252');

$response->headers->set('Content-Type', $mime . '; charset=Windows-1252');
    $response->headers->set('Pragma', 'public');
    $response->headers->set('Content-Endcoding','Windows-1252');
    $response->headers->set('Cache-Control', 'maxage=1');
    $response->headers->set('Content-Disposition', $dispositionHeader);
    echo "\xEF\xBB\xBF"; // UTF-8 BOM
**This is 100% works fine in excel for both Windows7,8,10 and also All Mac OS.**
//Fix issues in excel that are not displaying characters containing diacritics, cyrillic letters, Greek letter and currency symbols.

function generateCSVFile($filename, $headings, $data) {

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel
    exit;
}

¿Qué tal la salida por sí mismo Excel? Esta es una excelente clase que le permite generar archivos XLS del lado del servidor. Yo lo uso con frecuencia para los clientes que no pueden "resolver" csv de y hasta ahora nunca han tenido una queja. También permite algo de formato extra (sombreado, rowheights, cálculos, etc) que csv no siempre va a hacer.

puede convertir su CSV cadena con iconv .  por ejemplo:

$csvString = "Möckmühl;in Möckmühl ist die Hölle los\n";
file_put_contents('path/newTest.csv',iconv("UTF-8", "ISO-8859-1//TRANSLIT",$csvString) );

Hay que utilizar la codificación "Windows-1252".

header('Content-Encoding: Windows-1252');
header('Content-type: text/csv; charset=Windows-1252');
header("Content-Disposition: attachment; filename={$filename}");

Tal vez usted tiene que convertir sus cadenas:

private function convertToWindowsCharset($string) {
  $encoding = mb_detect_encoding($string);

  return iconv($encoding, "Windows-1252", $string);
}

Se puede añadir los 3 bytes en el fichero antes de exportar, que funciona para mí. Antes de hacer que el sistema sólo funcionan en Windows y HP-UX pero fracasó en Linux.

FileOutputStream fStream = new FileOutputStream( f );
final byte[] bom = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
OutputStreamWriter writer = new OutputStreamWriter( fStream, "UTF8" );
fStream.write( bom );

Tener una lista de materiales UTF-8 (3 bytes, hexagonal EF BB BF) al inicio del archivo. De lo contrario Excel interpretará los datos de acuerdo con la codificación predeterminada de su entorno local (por ejemplo CP1252) en lugar de UTF-8

Generación de archivos CSV para Excel, cómo tener una nueva línea dentro de un valor

Estoy en Mac, en mi caso sólo tenía que especificar el separador con "sep=;\n" y codificar el archivo en UTF-16LE como esto:

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');

Para mí ninguno de la solución anterior funcionó. A continuación es lo que hice para resolver el problema: modificar el valor de utilizar esta función en el código PHP:

$value = utf8_encode($value);

Esta salida valora adecuadamente en una hoja de Excel.

Yo tenía el mismo problema cuando tuve una rutina de Excel VBA que los datos importados. Desde CSV es un formato de texto plano, que estaba trabajando en torno a esta abriendo programáticamente los datos en un simple editor de archivos como WordPad, y volver a guardarlo como texto Unicode, o copiar al portapapeles desde allí y pegándolo a Excel. Si Excel no analiza automáticamente el CSV en las células, esto se remedia fácilmente utilizando el construido en el "texto en columnas" característica.

¿El problema todavía se producen cuando se guarda como un archivo .txt y les abra que en Excel con coma como delimitador?

El problema no podría ser la codificación en absoluto, que sólo podría ser que el archivo no es un archivo CSV perfecto de acuerdo a los estándares de Excel.

Este mensaje es bastante antiguo, pero después de horas de intentar quiero compartir mi solución ... tal vez ayude a alguien trato con Excel y Mac y CSV y tropieza sobre esta amenaza. Estoy generando un csv dinámicamente a medida que la producción de una base de datos con los usuarios de Excel en mente. (UTF-8 con BOM)

He intentado un montón de iconv's pero no pudimos llegar diéresis alemanas que trabajan en Mac Excel 2004. Una solución: PHPExcel. Es grande, pero para mi proyecto un poco demasiado. Lo que funciona para mí está creando el archivo csv y convertir este archivo csv a xls con este PHPsnippet: csv2xls . xls el resultado trabaja con Excel diéresis alemanas (a, o, u, ...).

Me acaba de intentar estas cabeceras y consiguió Excel 2013 en un PC con Windows 7 para importar el archivo CSV con caracteres especiales correctamente. El byte de marca de orden (BOM) fue la clave final que hace que funcione.

    header('Content-Encoding: UTF-8');
    header('Content-type: text/csv; charset=UTF-8');
    header("Content-disposition: attachment; filename=filename.csv");
    header("Pragma: public");
    header("Expires: 0");
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

De lo contrario es posible que:

header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");

echo utf8_decode($output);

solución fácil para Mac Excel 2008: Luché con esta Soo muchas veces, pero aquí era mi solución fácil: Abra el archivo .csv en Textwrangler que debería abrir sus UTF-8 caracteres correctamente. Ahora bien, en el cambio de barra de estado inferior el formato de archivo "Unicode (UTF-8)" a "occidental (ISO Latin 1)" y guarde el archivo. Ahora van a su Mac Excel 2008 y seleccione Archivo> Importar> Seleccione csv> Encuentra su archivo> Archivo de origen seleccione "Windows (ANSI)" y listo el UTF-8 caracteres se muestran correctamente. Por lo menos lo hace para mí ...

Yo uso este y funciona

header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
    $rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];  
    $arr1[]["title"] =  $rcontent;
}
} else {
     echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
   fputcsv($output, $result1);
endforeach;

#output CSV UTF-8 en PHP que Excel leerá correctamente.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';
//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top