2009-12-29 12 views
1

當我傳遞文件名時,我將一個數據表導出爲單詞,但似乎並未在「打開/保存」對話框中獲取文件名。導出爲帶有文件名的文字似乎不起作用

下面是我在做什麼

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

當我通過文件名"report(" + System.DateTime.Now.ToString("dd/MM/yyyy"); + ")"它沒有考慮的價值爲DD/MM/YYYY相反,它顯示的文件名作爲dd_MM_YYYY

+0

所以,問題是去文件保存對話框說的不是「DD/MM/YYYY」或問題「dd_MM_yyyy」它說別的(如我的空間。 ASPX)? 如果你想發送一個實際的Word文件,你應該使用一些庫來寫入Word文件並寫入響應輸出流(它發送字節) – helios 2009-12-29 10:16:37

回答

4

關於您的代碼的幾點意見:

  1. 您正在將內容類型標題設置爲word文檔bu您實際上是通過呈現GridView發送HTML內容
  2. 由於/字符,因此dd/MM/YYYY不是有效的文件名。
  3. 你不需要try/catch塊,如果在catch聲明,你只是做throw err
  4. 在最後調用Response.End是沒有必要的。
  5. 在處理諸如流和讀寫器之類的可丟棄對象時,始終使用using聲明以確保在所有情況下都調用Dispose方法。
+1

除了第3點:'throw err;'是不好的做法,因爲它將刪除調用堆棧。如果你想重新拋出一個異常,只需簡單地使用'throw;'。 – 2009-12-29 10:14:45

+0

我用HttpContext.Current.ApplicationInstance.CompleteRequest()替換了我的Response.End; – 2009-12-29 10:18:24

+0

除了第1點:這實際上工作,雖然它可能看起來不對(嘗試將.html文件重命名爲.doc,它將在Word中打開)。 – 2009-12-29 10:18:27

0

文件名不能有「/」。

0

這很可能是因爲/不是文件名的有效字符。您的姓名必須符合一定的標準,一定不要使用任何的

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

0

如果您正斜槓的文件名,我會假設,這將打破的URL文件,因此斜線正在被替換?

2

你應該使用一個文件名類似

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