Adblockを無効にします

AdBlockはサイト上のコンテンツをブロックしています

ADBlock errore

Excelが適切に読み取るPHPでUTF-8 CSVを出力するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4348802
 チェックしました

質問

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 ASをエコーし​​てみました echo pack("CCC", 0xef, 0xbb, 0xbf); BOMを検出しようとしていたサイトから引き出しました。しかし、Excelは、これらの3人のキャラクターがインポートされたときに最初のセルに追加するだけで、まだ特殊文字を台無しにします。

解決

引用する Microsoftサポートエンジニア,

Excel for Macは現在、UTF-8をサポートしていません

更新、2017年: :これは、以前にMacのMicrosoftExcelのすべてのバージョンに当てはまります オフィス2016. 。新しいバージョン(Office 365から)は、UTF-8をサポートするようになりました。

WindowsとOS Xの両方で優れているUTF-8コンテンツを出力するには、読み取ることができます。2つのことを行う必要があります。

  1. UTF-8テキストをUTF-16LEに変換するようにしてください

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    
  2. UTF-16LEバイトオーダーマークを追加してください

    chr(255) . chr(254)
    

OS XのExcelでのみ表示される次の問題(ただし いいえ Windows)は、COSVファイルをコンマ分離値で表示するときに、Excelは1行とすべてのテキストとともに最初の行のすべてのテキストでのみ行をレンダリングします。

これを回避する方法は、タブを分離値として使用することです。

使った PHPコメントからのこの機能 (コンマの代わりにタブ「 t」を使用)、OS XとWindows Excelで完全に機能しました。

行の終わりとして空の列で問題を修正するには、次のようなコード行を変更する必要があることに注意してください。

    $field_cnt = count($fields);

    $field_cnt = count($fields)-1;

このページの他のコメントのいくつかが言っているように、OpenOffice Calc、Apple独自の数字、Google Docのスプレッドシートなどの他のスプレッドシートアプリは、Commasを備えたUTF-8ファイルに問題はありません。

見る この質問の表 ExcelのUnicodeCSVファイルで機能し、機能しないものについて


サイドノートとして、私はあなたが使用している場合に追加するかもしれません 作曲, 、追加を見てください League\Csv あなたの要求に。 League\Csv もっている CSVファイルを構築するための本当に素晴らしい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エンコードの問題を修正した唯一のもの..

私は同じ問題に対処し、2つのソリューションを思いつきました。

  1. 使用 phpexcel クラス BPETERSON76が示唆しているように.

    • このクラスを使用すると、最も広く互換性のあるファイルが生成されると、Excel 2008 Mac、Excel 2007 Windows、およびGoogle Docsで正常に開かれたUTF-8エンコードデータからファイルを生成できました。
    • phpexcelを使用することの最大の問題は、それが遅く、多くのメモリを使用していることです。これは、合理的なサイズのファイルの問題ではありませんが、 Excel/CSVファイルに数百または数千の行がある場合、このライブラリは使用できなくなります.
    • TSVデータをいくつか取得してExcelファイルをブラウザに出力するPHPメソッドは、Excel5ライターを使用することに注意してください。だから私はそれらをテストすることはできません。

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

これをフォローアップするには:

問題は単にMacのExcelにあるように思われます。 CSVを生成することさえあるので、それは私がファイルを生成する方法ではありません Excelから それらを壊しています。私はCSVとして保存し、Reimport、そしてすべてのキャラクターが台無しにされています。

だから…これに対する正解はないようです。すべての提案をありがとう。

私が読んだすべてから、@Daniel MagliolaのBOMについての提案は、おそらく他のコンピューターにとって最良の答えになるでしょう。しかし、それはまだ私の問題を解決しません。

私の場合、Excelで正しく表示されたUTF-8 charを使用してCSVファイルを作成するのは非常に素晴らしい作品です。

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

0xEF 0xBB 0xBF BOMヘッダーは、Excelに正しいエンコードを知らせます。

これは、WindowsとMac OSの両方でExcelで正常に機能します。

Diacritics、キリル文字、ギリシャ文字、通貨シンボルを含む文字を表示していない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;
}

CSVファイルマスストには、バイトオーダーマークが含まれています。

または提案されたように、httpボディでそれをエコーするだけです

UTF8エンコードはExcelでうまく機能しないためです。データを別のエンコードタイプに変換できます iconv().

例えば

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

追加:

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

または:

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

CSVファイルにコンテンツを書き込む前。

例:

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

既にUTF-8エンコードされたテキストを使用して変換します mb_convert_encoding 必要ありません。元のコンテンツの前に3文字を追加するだけです。

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

私にとって、これはCSVファイルの特殊文字の問題を解決しました。

私が調査したように、UTF-8はMacとWindowsでうまく機能していないことがわかったので、Windows-1252で試してみましたが、両方ともよくサポートしていますが、Ubuntuでエンコードの種類を選択する必要があります。これが私のコードです$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;
}

Excel自体を出力するだけではどうですか? これは素晴らしいクラスです これにより、XLSファイルサーバー側を生成できます。 CSVを「理解する」ことができないクライアントに頻繁に使用していますが、これまでのところ苦情は​​ありませんでした。また、CSVがこれまでに行かない追加のフォーマット(シェーディング、ロウハイト、計算など)も可能になります。

CSV文字列をで変換できます ICONV。例えば:

$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-1252」を使用する必要があります。

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

たぶんあなたはあなたの文字列を変換する必要があります:

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

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

エクスポートする前に、3バイトをファイルに追加することができます。このシステムを実行する前に、WindowsとHP uxでのみ動作しますが、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 );

ファイルの開始時にUTF-8 BOM(3バイト、16進EF BB BF)を持っています。それ以外の場合、Excelは、UTF-8の代わりに、Localeのデフォルトエンコード(例:CP1252)に従ってデータを解釈します

Excel用のCSVファイルの生成、値内に新しいラインを持つ方法

私はMacに乗っています、私の場合、私はちょうどセパレーターを指定しなければなりませんでした "sep=;\n" そして、このようにUTF-16leでファイルをエンコードしてください:

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

私にとっては、上記の解決策はありませんでした。以下は、問題を解決するために行ったことです。PHPコードでこの関数を使用して値を変更します。

$value = utf8_encode($value);

この出力値は、Excelシートで適切に値を付けます。

データをインポートするExcel VBAルーチンがあるとき、私は同じ問題を抱えていました。 CSVは単純なテキスト形式であるため、WordPadのような単純なファイルエディターでデータをプログラムで開いて、Unicodeテキストとして再節約するか、そこからクリップボードにコピーして貼り付けてExcelを貼り付けて、これを回避していました。 ExcelがCSVをセルに自動的に解析しない場合、これは組み込みの「テキストから列」機能を使用して簡単に改善されます。

.txtファイルとして保存し、デリミッターとしてコンマを使用してExcelで開くと、問題はまだ発生しますか?

問題はまったくエンコードではないかもしれません。それは、Excelの基準に従ってファイルが完全なCSVではないということかもしれません。

この投稿は非常に古いですが、試してみると、ソリューションを共有したいと思います。エクセルとMacとCSVに対処している人がこの脅威につまずくのに役立つかもしれません。 Excelユーザーを念頭に置いてデータベースから出力として動的にCSVを生成しています。 (BOMを使用したUTF-8)

私は多くのICONVを試しましたが、Mac Excel 2004でドイツのUmlautsを動作させることはできませんでした。1つの解決策:phpexcel。それは素晴らしいことですが、私のプロジェクトには少し多すぎます。私にとって有効なのは、CSVファイルを作成し、このPHPSNIPPETでこのCSVファイルをXLSに変換することです。 csv2xls. 。結果XLSは、ExcelドイツのUmlauts(ä、Ö、ü、...)で動作します。

これらのヘッダーを試してみると、Windows 7 PCでExcel 2013を入手して、特殊文字を正しく使用してCSVファイルをインポートしました。バイトオーダーマーク(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

それ以外の場合は:

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

Mac Excel 2008の簡単なソリューション:私はこれに何度も苦労しましたが、ここに簡単な修正がありました。TextWranglerで.CSVファイルを開き、UTF-8 charを正しく開く必要があります。ボトムステータスバーで、ファイル形式を「Unicode(UTF-8)」から「Western(ISO LATIN 1)」に変更し、ファイルを保存します。次に、Mac Excel 2008に移動し、[ファイル]> [インポート]> [csv]> [ファイルの検索]> [ファイル]> [windows(ansi)]を選択し、UTF-8チャーが正しく表示されている[windows(ansi)]を選択します。少なくともそれは私のためにします...

私はこれを使用し、それは機能します

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;

#Excelが適切に読み取られるPHPでUTF-8 CSVをOUTPUT。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow