2009-07-07 3 views
0

Я пытаюсь преобразовать содержимое сетки View с Ехчел и я делаю это с помощью этого кодаGrid View Для Excel

string attachment = "attachment; filename= " + FileName; 
Response.ClearContent(); 
Response.AddHeader("content-disposition", attachment); 
Response.ContentType = "application/excel"; 
StringWriter sw = new StringWriter(); 
HtmlTextWriter htw = new HtmlTextWriter(sw); 
gv.RenderControl(htw);   
Response.Write(sw.ToString()); 
Response.End(); 

Проблема я получаю какой-то HTML в excel style, theres java script в ссылках на страницы и т. д. Я хочу, чтобы результаты моего запроса превращались в файл с разделителями-запятыми. Является ли это бесплатным или мне нужно запустить запрос, я сам получаю данные и выпишите поток csv Спасибо

ответ

0

Я не уверен, если я полностью подпишусь и ваш вопрос, но код, который вы отправили , должен создать действительный файл excel. Что касается создания файла csv, если вы хотите создать файл csv из gridview, попробуйте это.

string attachment = "attachment; filename=test.csv"; 
Response.ClearContent(); 
Response.AddHeader("content-disposition", attachment); 

StringWriter sw = new StringWriter(); 
StringBuilder sb = sw.GetStringBuilder(); 

foreach (GridViewRow row in GridView1.Rows) 
{ 
    string[] values = new string[row.Cells.Count];    
    for (int i = 0; i < row.Cells.Count; i++) 
    {     
     values[i] = row.Cells[i].Text; 
    }    
    sb.AppendLine(String.Join(",", values)); 
} 

HtmlTextWriter htw = new HtmlTextWriter(sw);   
Response.Write(sw.ToString()); 
Response.End(); 
0

Я использую метод, который использует метод .RenderControl() самого GridView. При желании вы можете скрыть столбец или два.

public static void ExportGridToExcel(System.Web.UI.Page p_Page, System.Web.UI.WebControls.GridView p_GridView, int[] p_ColumnsToHide) 
    { 

    if (p_ColumnsToHide != null) 
    { 
     foreach (int i in p_ColumnsToHide) 
     { 
      p_GridView.Columns[i].Visible = false; 
     }//foreach 
    }//if 

    p_Page.Response.Clear(); 
    p_Page.Response.Buffer = true; 
    p_Page.Response.AddHeader("content-disposition", "attachment; filename=output.xls"); 
    p_Page.Response.ContentType = "application/vnd.ms-excel"; 
    p_Page.Response.Charset = string.Empty; 
    p_Page.EnableViewState = false; 

    System.IO.StringWriter sw = new System.IO.StringWriter(); 
    System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(sw); 

    p_GridView.RenderControl(oHtmlTextWriter); 
    p_Page.Response.Write(sw.ToString()); 
    p_Page.Response.End(); 

    } 

Если это не работает из коробки, то есть несколько других вариантов, один из которых вы упомянули ... выписывая поток CSV вручную (я предпочитаю табуляцию себя), а затем лежа к браузеру о том, какой файл вы отправляете, чтобы он открыл его в Exhell. Exhell 2007, к сожалению, дает пользователю предупреждение об этом подходе сейчас, поэтому в зависимости от приложения это может или не может работать для вас.

Другой подход (хотя и тяжелый) заключается в том, чтобы поместить другое изображение сетки на страницу и отправить его этому методу. Преимущество состоит в том, что вы можете легко настроить вывод Exhell отдельно от того, что пользователь видит на экране (то есть yank javascript, добавить столбцы и т. Д.). Недостаток? Разумеется, два gridviews.

Удачи.