2009-12-29 1 views
1

Я экспортирую datatable в word, когда передаю имя файла, похоже, что оно не получает имя файла в диалоговом окне «Открыть/Сохранить».Экспорт в слово с именем файла, похоже, не работает

Вот что я делаю

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

+0

Так проблема де сохранения файла диалоговое окно говорит «dd_MM_yyyy» вместо «дд/мм/гггг» или проблема это говорит что-нибудь еще (например, MyPage. ASPX ...)? Если вы хотите отправить фактический файл Word, вы должны использовать некоторую библиотеку для записи файлов Word и записать в выходной поток ответа (это отправить байты) – helios

ответ

4

Несколько замечаний о вашем коде:

  1. Вы устанавливаете заголовок типа контента в документ слова bu t вы фактически отправляете содержимое HTML путем рендеринга GridView
  2. dd/MM/YYYY не является допустимым именем файла из-за символа /.
  3. Вам не нужен try/catch блок, если в catch заявлении вы только делаете throw err
  4. Вызов Response.End в конце концов, это не нужно.
  5. Всегда используйте инструкцию using при работе с одноразовыми объектами, такими как потоки и считыватели/писатели, чтобы гарантировать, что метод Dispose вызывается во всех случаях.
+1

В дополнение к пункту 3: 'throw err;' - это плохая практика, потому что он удаляет стек вызовов. Просто используйте 'throw;' вместо этого, если вы хотите перебросить исключение. –

+0

Я заменил свой ответ. И с HttpContext.Current.ApplicationInstance.CompleteRequest(); –

+0

И в дополнение к пункту 1: Это действительно работает, хотя может показаться неправильным (попробуйте переименовать .html-файл в .doc, и он будет открыт в Word). –

0

Это наиболее вероятно, потому что / не является допустимым символом для имен файлов. Ваше имя должно соответствовать определенным критериям, убедитесь, что не использовать любой из

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

0

Если вы слэши в имени файла, я предположил бы, что это нарушило бы URL к файлу и, следовательно, косые черты заменяются в какой-то момент?

2

Вы должны использовать имя файла как

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

 Смежные вопросы

  • Нет связанных вопросов^_^