5

データのテーブルを CSV 形式にエクスポートしています。例:

    "COL1","COL2","COL3"
    "1","some text", "£232.00"
    "2","some more text", "£111.00"
    "3","other text", "£2.00"

エクスポートするコードは、ashx ハンドラーを使用して非常に単純です。

    context.Response.Clear()
    context.Response.ContentType = "text/csv"
    context.Response.AddHeader("Content-disposition", "attachment;filename=data.csv")
    context.Response.AddHeader("Cache-Control", "must-revalidate")
    context.Response.AddHeader("Pragma", "must-revalidate")
    context.Response.Write(data)
    context.Response.Flush()
    context.Response.End()

Â私の問題は、Excelがエクスポートされたファイルを£開こうとすると£232.00、値が£232.00.

4

2 に答える 2

7

Response.ContentEncodingエンコーディング、つまりプロパティを設定する必要があります。

これをReflectorで最終的に調べた後、構成セクションが存在する場合、その構成セクションのプロパティによってオーバーライドされない限り、デフォルトはまたはContentEncodingになる可能性があります。Encoding.DefaultEncoding.UTF8system.web/globalizationresponseEncoding

ContentEncodingプロパティを設定することと、設定しないこととでパフォーマンスが異なるかどうかについては、次のようにします。

  • 現在の設定と同じオブジェクトに設定すると、明示的にそれをキャッチして何もしません。
  • ただし、設定を変更すると、が呼び出されます。これは、書き込み用にバッファリングされているものがある場合は、新しいエンコーディングに切り替える前にHttpWriter.UpdateResponseEncoding呼び出します。HttpWriter.FlushCharBuffer
  • 設定しない場合はContentEncoding、最初にを参照することで前述のデフォルトに設定されます。これは、書き込みメソッドでチェックされ、の最後でのみ更新されるHttpWriter.UpdateResponseEncodingため、コンテンツが書き込まれる前に必ず呼び出されます。HttpWriter._responseEncodingUpdatedTrueHttpWriter.UpdateResponseEncoding

そのため、OPはエンコーディングをに変更する必要があるUnicodeと思います。PhilHaleのコメントは、system.web/globalizationオーバーライドが必要な構成セクションがあったことを意味していると思います。

ノート:

  • 既存のコード呼び出しResponse.Clearはコンテンツにのみ影響し、ヘッダーには影響しないため、以前の提案とは異なり、変更前に既存のコンテンツがフラッシュされる可能性を排除する以外は、関連性があるとは思いませんContentEncoding
  • これは、.NETFramework2.0からのReflector6の出力に基づいていSystem.Webます。
于 2010-03-16T08:45:48.307 に答える
0

これは私にとってはうまくいきました-他の人はしませんでした

Response.ContentEncoding = System.Text.Encoding.Default
于 2016-09-14T11:12:52.180 に答える