Excel에서 올바르게 읽는 PHP에서 UTF-8 CSV를 출력하려면 어떻게합니까?


14 Answers

나는 (또는 이와 유사한) 동일한 문제가있다.

내 경우 출력에 BOM을 추가하면 작동합니다.

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

나는 이것이 꽤 못생긴 해킹이라고 생각하지만 적어도 Excel 2007 Windows에서는 저에게 효과적이었습니다. Mac에서 작동하는지 확신하지 못합니다.

Question

CSV 형식의 내용을 출력하는 매우 간단한 것이 있지만 UTF-8이되어야합니다. TextEdit 또는 TextMate 또는 Dreamweaver에서이 파일을 열면 UTF-8 문자가 올바르게 표시되지만 Excel에서 열면 바보 같은 일을합니다. 내 문서의 머리 부분에 다음과 같은 내용이 있습니다.

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

Excel (Mac, 2008)이 제대로 가져 오기를 원하지 않는 경우를 제외하고는이 모든 것이 원하는 효과가있는 것 같습니다. Excel에서 "UTF-8로 열기"등의 옵션이 없기 때문에 조금 짜증납니다.

나는 많은 사람들이 똑같은 문제를 겪고 있음에도 불구하고, 어디서나 명확한 해결책을 찾지 못하고있다. 가장 많이 보는 것은 BOM을 포함하는 것입니다.하지만이를 수행하는 방법을 정확히 파악할 수는 없습니다. 위에서 볼 수 있듯이이 데이터를 보내고있는 중이며 파일을 쓰지 않습니다. 필요한 경우이를 수행 할 수 있습니다. 현재로서는 필요가없는 것처럼 보이기 때문에 아닙니다. 어떤 도움이 필요합니까?

업데이트 : BOM을 echo pack("CCC", 0xef, 0xbb, 0xbf); 으로 echo pack("CCC", 0xef, 0xbb, 0xbf); BOM을 감지하려고 시도한 사이트에서 방금 가져 왔습니다. 그러나 Excel은 수입시 첫 번째 셀에이 세 문자를 추가하고 여전히 특수 문자를 엉망으로 만듭니다.




그렇지 않으면 다음을 할 수 있습니다.

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);



iconv 로 CSV 문자열을 변환 할 수 있습니다. 예 :

$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) );



이것은 Windows와 Mac OS 모두에서 뛰어납니다.

분음 기호, 키릴 문자, 그리스 문자 및 통화 기호가 포함 된 문자를 표시하지 않는 Excel의 문제 해결.

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;
}



Mac Excel 2008의 간편한 솔루션 : 여러 번 어려움을 겪었으나 Texturerangler에서 .csv 파일을 열면 UTF-8 문자가 올바르게 열립니다. 이제 하단 상태 표시 줄에서 "유니 코드 (UTF-8)"에서 "Western (ISO Latin 1)"으로 파일 형식을 변경하고 파일을 저장하십시오. 이제 Mac Excel 2008로 이동하여 파일> 가져 오기> csv> 파일 찾기> 파일 원본에서 "Windows (ANSI)"를 선택하고 UTF-8 문자가 올바르게 표시되는지 확인하십시오. 적어도 그것은 나를 위해 ...




UTF8 인코딩은 Excel에서 잘 작동하지 않으므로 iconv() 사용하여 데이터를 다른 인코딩 유형으로 변환 할 수 있습니다.

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



//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"));



나를 위해 위의 해결 방법 중 아무 것도 작동하지 않았습니다. 아래는이 문제를 해결하기 위해 수행 한 작업입니다. PHP 코드에서이 함수를 사용하여 값을 수정하십시오.

$value = utf8_encode($value);

이 출력은 엑셀 시트에서 적절하게 표시됩니다.




나는 Mac에 있는데, 제 경우에는 "sep=;\n" 구분 기호를 지정하고 파일을 UTF-16LE로 다음과 같이 인코딩해야합니다.

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



CSV 파일에는 바이트 순서 표가 포함되어 있습니다.

아니면 제안 및 해결 방법으로 그냥 HTTP 본문으로 에코




방금 이러한 헤더를 시도하고 Windows 7 PC에서 Excel 2013을 사용하여 특수 문자로 CSV 파일을 올바르게 가져 왔습니다. Byte Order Mark (BOM)가 작동하게 한 최종 키입니다.


    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




난 그냥 같은 문제를 처리하고 두 가지 해결책을 생각해 냈습니다.

  1. PHPExcel 에서 제안한대로 PHPExcel 클래스 사용하십시오.

    • 이 클래스를 사용하면 가장 널리 호환되는 파일을 생성하므로 Excel 2008 Mac, Excel 2007 Windows 및 Google Docs에서 열리는 UTF-8 인코딩 데이터로 파일을 생성 할 수있었습니다.
    • PHPExcel을 사용할 때의 가장 큰 문제점은 속도가 느리고 합리적인 크기의 파일에서는 문제가되지 않는 많은 메모리를 사용하지만 Excel / CSV 파일에 수백 또는 수천 개의 행이 있으면이 라이브러리를 사용할 수 없게된다는 것 입니다.
    • 다음은 몇 가지 TSV 데이터를 가져와 브라우저로 Excel 파일을 출력하는 PHP 메소드입니다. Excel5 Writer를 사용한다는 점에 유의하십시오. 이는 파일이 이전 버전의 Excel과 호환되어야하지만 더 이상 액세스 할 수 없음을 의미합니다. 그래서 나는 그들을 시험 할 수 없다.

      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. PHPExcel의 효율성 문제로 인해 UTF-8 및 Excel 호환 CSV 또는 TSV 파일을 생성하는 방법을 알아야했습니다.

    • 가장 좋은 점은 Excel 2008 Mac 및 Excel 2007 PC와 호환되는 파일 이었지만 Google 문서 도구는 아니었기 때문에 내 응용 프로그램에 충분히 적합했습니다.
    • here 해결책, 특히이 대답을 찾았지만, 문제를 설명 할 때 수용된 대답 도 읽어야합니다.
    • 다음은 내가 사용한 PHP 코드입니다. tsv 데이터 (탭은 쉼표 대신 구분 기호로 사용됩니다)를 사용하고 있습니다.

      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;
      



내 경우에는 다음 작품은 UTF - 8 문자와 CSV 파일을 Excel에서 올바르게 표시 할 수있는 아주 좋은 작품.

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

0xEF 0xBB 0xBF BOM 헤더를 사용하면 Excel에서 올바른 인코딩을 알 수 있습니다.




나는 같은 문제가 있었는데 그것은 아래처럼 해결되었습니다 :

    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();



.txt 파일로 저장할 때 문제가 계속 발생하며 쉼표로 구분 기호로 Excel에서 열 때 문제가 발생합니까?

문제는 인코딩이 아닐 수도 있습니다. 파일이 Excel 표준에 따라 완벽한 CSV가 아닐 수도 있습니다.




Related