views:

59

answers:

5

I export a datatable to word, when I pass a file name it doesn't seem to get the file name in Open/Save dialog box.

Here is what I am doing

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;
    }
}

When I pass filename "report(" + System.DateTime.Now.ToString("dd/MM/yyyy"); + ")" it doesn't take the value as dd/MM/YYYY instead it shows file name as dd_MM_YYYY

+3  A: 

Few remarks about your code:

  1. You are setting the content type header to a word document but you are actually sending HTML contents by rendering a GridView
  2. dd/MM/YYYY is not a valid filename because of the / character.
  3. You don't need a try/catch block if in the catch statement you are only doing throw err
  4. Calling Response.End at the end is not necessary.
  5. Always use using statement when dealing with disposable objects such as streams and readers/writers to ensure that the Dispose method is invoked in all cases.
Darin Dimitrov
In addition to point 3: `throw err;` is bad practice because it removes the call stack. Simply use `throw;` instead if you want to re-throw an exception.
0xA3
I replaced my Response.End with HttpContext.Current.ApplicationInstance.CompleteRequest();
Pandiya Chendur
And in addition to point 1: This actually works although it might seem wrong (Try renaming an .html file to .doc and it will be opened in Word).
0xA3
@Darin i replaced / with - its working now...
Pandiya Chendur
A: 

A filename cannot have "/".

Pedro
A: 

That's most likely because / isn't a valid character for filenames. Your name must fulfill certain criteria, be sure not to use any of

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

0xA3
A: 

If you have forward slashes in the filename, I would assume that this would break the URL to the file and hence the slashes are being replaced at some point?

Mark Redman
+2  A: 

You should to use a filename like

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