[php] Excel에서 올바르게 읽을 수 있도록 PHP에서 UTF-8 CSV를 출력하려면 어떻게해야합니까?

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을 포함시키는 것이지만 어떻게 그렇게하는지 정확히 알 수는 없습니다. 위에서 볼 수 있듯이 나는 echo이 데이터를 사용하고 있으며 파일을 쓰지 않습니다. 필요한 경우 할 수 있습니다.이 시점에서 필요하지 않은 것처럼 보이지 않기 때문입니다. 어떤 도움?

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



답변

인용 마이크로 소프트 지원 엔지니어 ,

Mac 용 Excel은 현재 UTF-8을 지원하지 않습니다

2017 년 업데이트 : Office 2016 이전의 모든 Mac 용 Microsoft Excel 버전에 해당 됩니다. Office 365의 최신 버전은 이제 UTF-8을 지원합니다.

Windows 및 OS X 모두에서 Excel에서 읽을 수있는 UTF-8 컨텐츠를 출력하려면 두 가지 작업을 수행해야합니다.

  1. UTF-8 CSV 텍스트를 UTF-16LE로 변환하십시오.

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. 파일의 시작 부분에 UTF-16LE 바이트 순서 표시 를 추가 하십시오

    chr(255) . chr(254)

OS X에서 Excel에만 나타나는 다음 문제 되지 쉼표, Excel에서 하나의 행과 첫 번째 행에서 쉼표와 함께 모든 텍스트와 행을 렌더링 값을 분리하여 CSV 파일을 볼 때 윈도우)입니다.

이를 피하는 방법은 탭을 분리 된 값으로 사용하는 것입니다.

PHP 주석 (쉼표 대신 “\ t”탭 사용) 에서이 기능을 사용했으며 OS X 및 Windows Excel에서 완벽하게 작동했습니다.

행의 끝으로 빈 열의 문제를 해결하려면 다음과 같은 코드 줄을 변경해야했습니다.

    $field_cnt = count($fields);

    $field_cnt = count($fields)-1;

이 페이지의 다른 의견 중 일부에서 알 수 있듯이 OpenOffice Calc, Apple 자체의 Numbers 및 Google Doc ‘s Spreadsheet와 같은 다른 스프레드 시트 응용 프로그램에는 쉼표가있는 UTF-8 파일에 문제가 없습니다.

Excel에서 유니 코드 CSV 파일에 작동하고 작동하지 않는 것은 이 질문의 표를 참조하십시오 .


참고로 Composer 를 사용하는 경우 League\Csv요구 사항 에 추가하는 것을 살펴 봐야한다고 덧붙일 수 있습니다 . League\CsvCSV 파일을 구축하기위한 정말 좋은 API를 .

League\Csv이 CSV 파일 작성 방법과 함께 사용하려면 이 예제를 확인하십시오.


답변

나는 같은 (또는 비슷한) 문제가 있습니다.

필자의 경우 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에서 작동하는지 확실하지 않습니다.


답변

다음은 내가 한 방법입니다 (브라우저가 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();

Mac에서 스페이스 바를 쳤을 때 CSV 미리보기에서 UTF8 인코딩 문제를 해결 한 유일한 것은 .. Excel Mac 2008에서는 그렇지 않습니다 … 이유를 모릅니다


답변

방금 동일한 문제를 해결하고 두 가지 해결책을 생각해 냈습니다.

  1. bpeterson76 에서 제안한대로 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 Docs는 아닙니다. 응용 프로그램에 충분합니다.
    • 여기 에서 해결책 , 특히이 대답을 찾았 지만 문제를 설명하는대로 받아 들인 대답 을 읽어야합니다 .
    • 다음은 내가 사용한 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;

답변

나는 같은 문제가 있었고 다음과 같이 해결되었습니다.

    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은 UTF-8을 지원하지 않습니다. UTF-8 텍스트를 UCS-2LE로 인코딩해야합니다.

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


답변

필자의 경우 다음은 UTF-8 문자가 포함 된 CSV 파일을 Excel에서 올바르게 표시하는 데 매우 효과적입니다.

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

0xEF 0xBB 0xBFBOM 헤더는 Excel이 올바른 인코딩을 알려드립니다.