2009-12-29 18 views
1

J'exporte un datatable to word, quand je passe un nom de fichier il ne semble pas obtenir le nom du fichier dans la boîte de dialogue Ouvrir/Enregistrer.Exporter au mot avec un nom de fichier ne semble pas fonctionner

Voici ce que je fais

public static void Convertword(DataTable dt, HttpResponse Response,string filename) 
{ 
    try 
    { 
     Response.Clear(); 
     Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".doc"); 
     Response.Charset = ""; 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.ContentType = "application/vnd.word"; 
     System.IO.StringWriter stringWrite = new System.IO.StringWriter(); 
     System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite); 
     System.Web.UI.WebControls.GridView dg = new System.Web.UI.WebControls.GridView(); 
     dg.DataSource = dt; 
     dg.DataBind(); 
     dg.RenderControl(htmlWrite); 
     Response.Write(stringWrite.ToString()); 
     Response.End(); 
    } 
    catch(Exception err) 
    { 
     throw err; 
    } 
} 

Quand je passe le nom "report(" + System.DateTime.Now.ToString("dd/MM/yyyy"); + ")" il ne prend pas la valeur dd/MM/AAAA au lieu qu'il affiche le nom de fichier comme dd_MM_YYYY

+0

Le problème est de fichier de sauvegarde de dialogue dit « dd_MM_yyyy » au lieu de « jj/mm/aaaa » ou le problème est-il dit quoi que ce soit d'autre (comme mypage. aspx ...)? Si vous voulez envoyer un fichier Word réel, vous devez utiliser une bibliothèque pour écrire des fichiers Word et écrire dans la réponse outputstream (c'est, envoyez les octets) – helios

Répondre

4

Quelques remarques sur votre code:

  1. Vous définissez l'en-tête du type de contenu sur un document Word bu t vous envoyez réellement des contenus HTML en affichant un GridView
  2. dd/MM/YYYY n'est pas un nom de fichier valide en raison du caractère /.
  3. Vous n'avez pas besoin d'un bloc try/catch si la seule déclaration catch que vous faites throw err
  4. Appel Response.End à la fin n'est pas nécessaire.
  5. Utilisez toujours l'instruction using lorsque vous traitez des objets jetables tels que des flux et des lecteurs/graveurs pour vous assurer que la méthode Dispose est invoquée dans tous les cas.
+1

En plus du point 3: "throw err;" il supprime la pile d'appels. Utilisez simplement 'throw;' à la place si vous voulez relancer une exception. –

+0

J'ai remplacé mon Response.End par HttpContext.Current.ApplicationInstance.CompleteRequest(); –

+0

Et en plus du point 1: Cela fonctionne réellement bien que cela puisse sembler faux (essayez de renommer un fichier .html en .doc et il sera ouvert dans Word). –

0

Un nom de fichier ne peut pas avoir "/".

0

C'est probablement parce que / n'est pas un caractère valide pour les noms de fichiers. Votre nom doit remplir certains critères, veillez à ne pas utiliser l'une des

* . "/\ [ ] : ; | = ,

0

Si vous avez des barres obliques en avant dans le nom du fichier, je suppose que cela casserait l'URL du fichier et par conséquent les barres obliques sont remplacées à un moment donné?

2

Vous devez utiliser un nom de fichier comme

String.Format("report{0:ddMMyyyy}.doc", DateTime.Now);