2010-12-10 45 views
1

Je suis en train de formater une date pour un fichier Excel spécifique Export à partir d'un DataSet/DataGrid.
La date est formaté comme ceci:Format automatique de la date d'arrêt lors de l'exportation de DataGrid vers Excel en C#

DateTime date = Convert.ToDateTime(entry.Date); 
string formatdate = String.Format("{0:yyyy/MM/dd}", date); 

création Une fois que le DataSet est dit et fait, j'utilise le code suivant pour exporter le DataSet dans un fichier Excel:

public static void ExportDStoExcel(DataSet ds, string filename) 
    { 
     HttpResponse response = HttpContext.Current.Response; 
     response.Clear(); 
     response.Charset = ""; 

     response.ContentType = "application/vnd.ms-excel"; 
     response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); 

     using (StringWriter sw = new StringWriter()) 
     { 
      using (HtmlTextWriter htw = new HtmlTextWriter(sw)) 
      { 
       DataGrid dg = new DataGrid(); 
       dg.DataSource = ds.Tables[0]; 
       dg.DataBind(); 
       dg.RenderControl(htw); 
       response.Write(sw.ToString()); 
       response.End(); 
      } 
     } 

    } 

Mon seul problème est Une fois que j'exporte ceci dans Excel, Excel formate automatiquement les dates comme suit: MM/JJ/AAAA au lieu de AAAA/MM/JJ. Je comprends que cela pourrait être réalisé manuellement en ouvrant dans Excel, mais l'exportation est en cours de construction dans un système automatisé et doit être codé en dur.

Existe-t-il un moyen de contourner la mise en forme automatique DateTime d'Excel?

Répondre

1

À l'heure actuelle, vous ne faites que sortir une table HTML, qu'Excel interprète comme il aime. Vous auriez dû vous rendre au niveau d'Excel pour pouvoir spécifier les propriétés de la colonne (définissez le type sur Texte au lieu de Général). Cela signifie que vous devez générer un fichier xls réel (il existe plusieurs bibliothèques pour cela). Ou (si la restriction à Office 2010 est acceptable) obtenu avec le format Open XML que vous pouvez écrire avec l'API .NET régulière.

+0

va aller la route Open XML en utilisant Microsoft Open XML SDK 2.0, il semble que ça devrait faire l'affaire! Merci de m'indiquer dans la bonne direction! – Lando

3

J'ai eu le même problème et l'ai résolu en ajoutant un espace non brisant (& nbsp) devant le texte. Arrêté Excel de formatage automatique. Pas la solution la plus propre, mais a fait l'affaire pour moi ...

0

de style Vous pouvez exceller cellules avec mso-number format

mso-number-format:"\\@"

\@ va indiquer à Excel pour traiter toutes les données uniquement au format texte. Donc, le format automatique ne se produira pas.

S'il vous plaît mettre à jour votre code comme ceci:

response.ContentType = "application/vnd.ms-excel"; 
response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); 
response.Write("<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\">"); 
response.Write("<head><style> td {mso-number-format:\\@;} </style></head><body>"); 

using (StringWriter sw = new StringWriter()) 
{ 
    using (HtmlTextWriter htw = new HtmlTextWriter(sw)) 
    { 
     DataGrid dg = new DataGrid(); 
     dg.DataSource = ds.Tables[0]; 
     dg.DataBind(); 
     dg.RenderControl(htw); 
     response.Write(sw.ToString()); 

     response.Write("</body></html>"); 
     response.End(); 
    } 
} 

OU

vous pouvez essayer avec le format de date précise également. Référez: http://cosicimiento.blogspot.in/2008/11/styling-excel-cells-with-mso-number.html

mso-number-format:"yyyy\/mm\/dd"