2010-03-15 16 views
3

j'exporter un tableau de données au format CSV, par exemple:numéro ASP.NET Excel CSV avec des personnages étranges

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

Le code à l'exportation est assez simple en utilisant un gestionnaire de 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() 

Mon problème est lorsque Excel essaie d'ouvrir le fichier exporté le caractère  apparaît avant tous les signes £, par exemple £232.00 lorsque la valeur doit être £232.00.

+1

Cela ressemble à un Unicode d'une erreur de traduction UTF-8. Cependant, je ne sais pas comment résoudre le problème. –

Répondre

5

Vous devez définir le codage, c'est-à-dire la propriété Response.ContentEncoding.

Après avoir finalement regardant cela dans réflecteur, la valeur par défaut ContentEncoding est susceptible d'être Encoding.Default ou Encoding.UTF8, si une section de configuration system.web/globalization existe, sauf si elle est remplacée par une propriété responseEncoding dans cette section de configuration.

Quant à savoir si définir la propriété ContentEncoding à tous de ne pas se comporte différemment le faire:

  • Si vous le réglez sur le même objet que le réglage actuel, il attrape explicitement que et ne fait rien;
  • Toutefois, si vous modifiez le paramètre, il appelle HttpWriter.UpdateResponseEncoding, qui appelle HttpWriter.FlushCharBuffer avant de basculer vers le nouveau codage s'il y a déjà quelque chose de tamponné à écrire.
  • Si vous ne définissez pas ContentEncoding il est réglé sur la valeur par défaut je l'ai mentionné ci-dessus en première référence à HttpWriter.UpdateResponseEncoding, qui est certainement appelée avant tout contenu est écrit parce HttpWriter._responseEncodingUpdated est cochée dans les méthodes d'écriture et seulement mis à jour à True à la fin de HttpWriter.UpdateResponseEncoding.

En tant que tel, je crois que l'OP nécessaire pour changer le codage en Unicode et je suppose que le commentaire de Phil Hale signifie qu'il avait une section de configuration system.web/globalization qui avait besoin primordial.

Notes:

  • Le code existant appeler uniquement le contenu Response.Clear affects, pas en-têtes, donc, contrairement à ma suggestion précédente, je ne le font pas croient qu'il est pertinent, autre que la suppression des chances d'exister contenu à être présent pour être vidé avant le changement ContentEncoding.
  • Ceci est basé sur la sortie Reflector 6 de System.Web de .NET Framework 2.0.
+1

merci pour les conseils cela l'a résolu "context.Response.ContentEncoding = System.Text.Encoding.Unicode" – user23048345

+3

J'ai corrigé ceci en ajoutant 'Response.ContentEncoding = Encoding.Default;'. Pas vraiment sûr pourquoi cela fonctionne pour être honnête –

0

Cela a fonctionné pour moi - d'autres ne l'ont pas

Response.ContentEncoding = System.Text.Encoding.Default 
Questions connexes