196

プログラムで (PHP 5.2 を使用して) データを .csv テスト ファイルにエクスポートしています。
データの例: Numéro 1(アクセント付きの e に注意してください)。データはutf-8(先頭に BOM なし) です。

このファイルを MS Excel で開くと、次のように表示されNuméro 1ます。

これを正しく表示するテキスト エディター (UltraEdit) で開くことができます。UE は、キャラクターが であると報告しますdecimal 233

できればインポート ウィザードやデフォルト以外のウィザード設定を強制的に使用せずに、MS Excel がテキスト データを正しくレンダリングできるように、テキストデータを .csv ファイルにエクスポートするにはどうすればよいですか?

4

22 に答える 22

255

正しくフォーマットされた UTF8 ファイルは、最初の 3 つのオクテットとしてバイト オーダー マークを持つことができます。これらは 16 進値 0xEF、0xBB、0xBF です。これらのオクテットは、ファイルを UTF8 としてマークするのに役立ちます (「バイト オーダー」情報とは関係がないため)。1 この BOM が存在しない場合、消費者/リーダーは、テキストのエンコーディング タイプを推測する必要があります。UTF8 に対応していないリーダーは、バイトを Windows-1252 などの他のエンコーディングとして読み取り、ファイルの先頭に文字を表示します。

Excel がファイルの関連付けを介して UTF8 CSV ファイルを開くと、UTF8 BOM の存在を無視して、ファイルが 1 バイト エンコーディングであると想定するという既知のバグがあります。これは、システムのデフォルト コードページまたは言語設定では修正できません。BOM は Excel ではわかりません。機能しません。(少数派の報告によると、BOM によって [テキストのインポート] ウィザードが起動されることがあるとのことです。) このバグは、Excel 2003 以前に存在するようです。ほとんどのレポート (ここでの回答の中で) は、これは Excel 2007 以降で修正されていると述べています。

開いているファイルのエンコーディングを指定できる [テキストのインポート] ウィザードを使用して、常に* Excel で UTF8 CSV ファイルを正しく開くことができることに注意してください。もちろん、これはあまり便利ではありません。

この回答の読者は、Excel < 2007 を特にサポートしていないが、生の UTF8 テキストを Excel に送信している状況にある可能性が最も高く、それが誤解され、テキストにÃ他の同様の Windows-1252 文字が散らばっています。 UTF8 BOM を追加することは、おそらく最善かつ最速の修正です。

古い Excel のユーザーで立ち往生していて、Excel が CSV の唯一のコンシューマーである場合は、UTF8 ではなく UTF16 をエクスポートすることでこれを回避できます。Excel 2000 および 2003 では、これらを正しくダブルクリックして開きます。(他の一部のテキスト エディターでは UTF16 で問題が発生する可能性があるため、オプションを慎重に検討する必要がある場合があります。)


* できない場合を除き、(少なくとも) Excel 2011 for Mac のインポート ウィザードは、実際には、指定した内容に関係なく、常にすべてのエンコーディングで機能するとは限りません。</事例証拠> :)

于 2008-09-30T21:30:17.317 に答える
42

ExcelがファイルをUTF-8として認識したので、BOM(\ uFEFF)を先頭に追加するとうまくいきました(Excel 2007)。それ以外の場合、保存してインポート ウィザードを使用することはできますが、あまり理想的ではありません。

于 2008-11-24T17:11:18.583 に答える
33

以下は、Microsoft Excel をユーザーに送信するときにプロジェクトで使用する PHP コードです。

  /**
   * Export an array as downladable Excel CSV
   * @param array   $header
   * @param array   $data
   * @param string  $filename
   */
  function toCSV($header, $data, $filename) {
    $sep  = "\t";
    $eol  = "\n";
    $csv  =  count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
    foreach($data as $line) {
      $csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
    }
    $encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv;
    exit;
  }

更新: ファイル名の改善とバグ修正により、正しい長さの計算が行われました。TRiGと@ivanhoe011に感謝

于 2009-10-30T08:50:24.100 に答える
15

Excel のバージョン (2003 + 2007) とファイルの種類のすべての組み合わせに対する答え

ここでの他のほとんどの回答は、Excel のバージョンのみに関するものであり、必ずしもあなたの役に立ちません。

たとえば、BOM 文字を追加すると、自動列区切り認識で問題が発生しますが、すべての Excel バージョンでは問題が発生するわけではありません。

ほとんどの Excel バージョンで機能するかどうかを決定する 3 つの変数があります。

  • エンコーディング
  • BOM キャラクターの存在
  • セルセパレーター

SAP のストイックな人がすべての組み合わせを試し、結果を報告しました。最終結果?ほとんどの Excel バージョンで動作するようにするには、区切り文字として BOM とタブ文字を含む UTF16le を使用します。

あなたは私を信じていませんか?私もそうしませんが、ここを読んで泣きます: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator

于 2013-08-22T08:26:09.377 に答える
10

インポート時に UTF-8 エンコーディングを選択します。Office 2007 を使用している場合は、ファイルを開いた直後に選択した場所です。

于 2008-09-30T21:33:51.617 に答える
9

CSV データを出力する前に UTF-8 BOM をエコーし​​ます。これにより、Windows のすべての文字の問題が修正されますが、Mac では機能しません。

echo "\xEF\xBB\xBF";

Windows PCでのみ使用されるファイルを生成する必要があるため、私にとってはうまくいきます。

于 2011-03-30T16:26:55.417 に答える
7

Office 2007 で UTF-8 が機能しない サービス パックなしで、BOM の有無にかかわらず (U+ffef または 0xEF,0xBB,0xBF 、どちらも機能しません) SP3 をインストールすると、0xEF,0xBB,0xBF BOM の場合に UTF-8 が機能します先頭に追加。

UTF-16 は、先頭に 0xff 0xef BOM を付けて "utf-16-le" を使用し、セパレータとしてタブを使用して Python でエンコードする場合に機能します。BOM を手動で書き出す必要があり、"utf-16" ではなく "utf-16-le" を使用する必要がありました。二行目以降。

今は戻れないので、spがインストールされていなくてもUTF-16が機能するかどうかはわかりません。はぁ

これはWindows上にあり、MACのオフィスについては知りません。

どちらの場合も、ブラウザーから直接ダウンロードを開始するとインポートが機能し、テキスト インポート ウィザードは介入しません。期待どおりに機能します。

于 2012-02-18T00:03:28.023 に答える
4

Fregal が言ったように、\uFEFF が最適です。

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("\uFEFF");
// csv text here
%>
于 2009-02-27T17:29:40.663 に答える
3

拡張子「xls」を付けて html ファイルを保存すると、アクセントが機能します (少なくとも 2007 年より前)。

例: これを test.xls として保存します (メモ帳で [utf8 として保存] を使用):

<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
  <th>id</th>
  <th>name</th>
</tr>
<tr>
 <td>4</td>
 <td>Hélène</td>
</tr>
</table>
</html>
于 2009-06-05T20:06:12.283 に答える
3

I've also noticed that the question was "answered" some time ago but I don't understand the stories that say you can't open a utf8-encoded csv file successfully in Excel without using the text wizard.

My reproducible experience: Type Old MacDonald had a farm,ÈÌÉÍØ into Notepad, hit Enter, then Save As (using the UTF-8 option).

Using Python to show what's actually in there:

>>> open('oldmac.csv', 'rb').read()
'\xef\xbb\xbfOld MacDonald had a farm,\xc3\x88\xc3\x8c\xc3\x89\xc3\x8d\xc3\x98\r\n'
>>> ^Z

Good. Notepad has put a BOM at the front.

Now go into Windows Explorer, double click on the file name, or right click and use "Open with ...", and up pops Excel (2003) with display as expected.

于 2009-06-12T03:01:12.187 に答える
1

Excel 2007は、BOM(EF BB BF)でエンコードされたcsvを使用してUTF-8を正しく読み取ります。

Excel 2003(およびそれ以前)は、BOM(FF FE)を使用してUTF-16LEを読み取りますが、コンマまたはセミコロンの代わりにTABを使用します。

于 2009-11-05T09:56:03.233 に答える
1

これは文字エンコーディングの問題です。データを UTF-8 としてエクスポートしているようです: UTF-8 の é は 2 バイト シーケンス 0xC3 0xA9 で、Windows-1252 で解釈すると é です。データを Excel にインポートするときは、使用している文字エンコーディングが UTF-8 であることを必ず伝えてください。

于 2008-09-30T21:11:09.283 に答える
1

UTF-8 BOM を含めることは必ずしも良い考えではないことに注意してください - Mac バージョンの Excel はそれを無視し、実際には BOM を ASCII として表示します...スプレッドシートの最初のフィールドの先頭にある 3 つの厄介な文字...</p>

于 2012-07-20T04:26:02.163 に答える
1

Excel 2007 では、適切なバイト オーダー マークで始まるタブ区切りのリトル エンディアン UTF-16 として CSV を正しく解析することしかできません。

于 2009-12-09T13:22:14.920 に答える
1

BOM を出力 CSV ファイルに書き込むと、実際に Django でうまくいきました。

def handlePersoonListExport(request):
    # Retrieve a query_set
    ...

    template = loader.get_template("export.csv")
    context = Context({
        'data': query_set,
    })

    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=export.csv'
    response['Content-Type'] = 'text/csv; charset=utf-8'
    response.write("\xEF\xBB\xBF")
    response.write(template.render(context))

    return response

詳細についてはhttp://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.htmlみんなありがとう!

于 2011-05-26T13:16:14.040 に答える
1

私が見つけた別の解決策は、結果を Windows Code Page 1252 (Windows-1252 または CP1252) としてエンコードすることでした。これは、たとえば、Content-Type適切に何かtext/csv; charset=Windows-1252を設定し、応答ストリームの文字エンコーディングを同様に設定することによって行われます。

于 2011-10-19T15:44:32.823 に答える
1

CSV 形式は、Excel では Unicode ではなく ASCII として実装されているため、分音記号が乱れます。同じ問題が発生しました。これは、公式の CSV 標準が Excel で ASCII ベースとして定義されていることを突き止めた方法です。

于 2008-09-30T21:30:01.077 に答える
0

ファイルを生成しているエンコーディングを確認してください。Excel でファイルを正しく表示するには、システムの既定のコードページを使用する必要があります。

どの言語を使用していますか? .Net の場合は、ファイルの生成時に Encoding.Default を使用するだけで済みます。

于 2008-09-30T21:12:25.613 に答える
0

私のようにvb.netにレガシーコードがある場合、次のコードがうまくいきました:

    Response.Clear()
    Response.ClearHeaders()
    Response.ContentType = "text/csv"
    Response.Expires = 0
    Response.AddHeader("Content-Disposition", "attachment; filename=export.csv;")
    Using sw As StreamWriter = New StreamWriter(Context.Response.OutputStream, System.Text.Encoding.Unicode)
        sw.Write(csv)
        sw.Close()
    End Using
    Response.End()
于 2011-12-13T11:06:04.090 に答える
0

問題を解決する方法を見つけました。これは厄介なハックですが、機能します。ドキュメントをOpen Officeで開き、任意の Excel 形式で保存します。結果の.xlsor.xlsxは、強調された文字を表示します。

于 2011-11-28T16:35:23.427 に答える
0

Ruby 1.8.7 では、すべてのフィールドを UTF-16 にエンコードし、BOM を破棄します (おそらく)。

次のコードは、active_scaffold_export から抽出されます。

<%                                                                                                                                                                                                                                                                                                                           
      require 'fastercsv'                                                                                                                                                                                                                                                                                                        
      fcsv_options = {                                                                                                                                                                                                                                                                                                           
        :row_sep => "\n",                                                                                                                                                                                                                                                                                                        
        :col_sep => params[:delimiter],                                                                                                                                                                                                                                                                                          
        :force_quotes => @export_config.force_quotes,                                                                                                                                                                                                                                                                            
        :headers => @export_columns.collect { |column| format_export_column_header_name(column) }                                                                                                                                                                                                                                
      }                                                                                                                                                                                                                                                                                                                          

      data = FasterCSV.generate(fcsv_options) do |csv|                                                                                                                                                                                                                                                                           
        csv << fcsv_options[:headers] unless params[:skip_header] == 'true'                                                                                                                                                                                                                                                      
        @records.each do |record|                                                                                                                                                                                                                                                                                                
          csv << @export_columns.collect { |column|                                                                                                                                                                                                                                                                              
            # Convert to UTF-16 discarding the BOM, required for Excel (> 2003 ?)                                                                                                                                                                                                                                     
            Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]                                                                                                                                                                                                                                        
          }                                                                                                                                                                                                                                                                                                                      
        end                                                                                                                                                                                                                                                                                                                      
      end                                                                                                                                                                                                                                                                                                                        
    -%><%= data -%>

重要な行は次のとおりです。

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]
于 2011-10-14T08:29:31.890 に答える
-2

ファイル csv を notepad++ で開く [エンコード] をクリックし、[UTF-8 に変換] を選択します (UTF-8 に変換しない (BOM なし)) Excel でダブルクリックして保存します

于 2013-04-25T16:54:44.327 に答える