1. ホーム
  2. php

[解決済み】PHPでUTF-8のCSVを出力して、Excelが正しく読めるようにするにはどうしたらいいですか?

2022-04-12 05:49:48

質問

あるものを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はインポートする際、これらの3文字を一番最初のセルに追加するだけで、まだ特殊文字を台無しにしています。

解決方法は?

引用元 マイクロソフトのサポートエンジニア ,

<ブロッククオート

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

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

WindowsとOS XのExcelが正常に読み込めるUTF-8のコンテンツを出力するためには、次の2つのことが必要です。

  1. UTF-8のCSVテキストをUTF-16LEに変換していることを確認する。

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    
    
  2. を追加していることを確認してください。 UTF-16LEバイトオーダーマーク をファイルの先頭に追加してください。

    chr(255) . chr(254)
    
    

次にOS XのExcelにのみ現れる問題(ただし ではなく Windowsでは、カンマ区切りのCSVファイルを表示すると、Excelは1行だけ表示し、最初の行にカンマと一緒にすべてのテキストが表示されます。

これを避けるには、区切り値をタブで区切ることです。

を使いました。 この関数は、PHPのコメント欄から (カンマの代わりにタブ "\t" を使用) OS X と Windows Excel で完全に動作しました。

なお、行の末尾に空の列がある場合の問題を解決するために、次のようなコードの行を変更する必要がありました。

    $field_cnt = count($fields);

になります。

    $field_cnt = count($fields)-1;

このページの他のコメントにもあるように、OpenOffice Calc、Apple独自のNumbers、Google DocのSpreadsheetなど他の表計算アプリでは、カンマがあるUTF-8ファイルでも問題はありません。

参照 この質問の表 ExcelでUnicodeのCSVファイルを扱えるもの、扱えないものについては


余談ですが、もしあなたが コンポーザー を追加することを検討してみてください。 League\Csv をrequireに追加してください。 League\Csv があります。 CSV ファイルを作成するための非常に優れた API .

使用方法 League\Csv この方法でCSVファイルを作成する場合は、以下を参照してください。 この例