123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- using System.Data;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.IO;
- using System.Text;
- namespace Ant.Service.Utilities
- {
- /// <summary>
- /// Summary description for GridViewExport
- /// </summary>
- public class GridViewExport
- {
- public GridViewExport()
- {
- //
- // TODO: Add constructor logic here
- //
- }
- public static void Export(string fileName, GridView gv)
- {
- HttpContext.Current.Response.Clear();
- HttpContext.Current.Response.AddHeader(
- "content-disposition", string.Format("attachment; filename={0}", fileName));
- HttpContext.Current.Response.ContentType = "application/ms-excel";
- //HttpContext.Current.Response.Charset = "utf-8";
- using (StringWriter sw = new StringWriter())
- {
- using (HtmlTextWriter htw = new HtmlTextWriter(sw))
- {
- // Create a form to contain the grid
- Table table = new Table();
- table.GridLines = GridLines.Both; //单元格之间添加实线
- // add the header row to the table
- if (gv.HeaderRow != null)
- {
- PrepareControlForExport(gv.HeaderRow);
- table.Rows.Add(gv.HeaderRow);
- }
- // add each of the data rows to the table
- foreach (GridViewRow row in gv.Rows)
- {
- PrepareControlForExport(row);
- table.Rows.Add(row);
- }
- // add the footer row to the table
- if (gv.FooterRow != null)
- {
- PrepareControlForExport(gv.FooterRow);
- table.Rows.Add(gv.FooterRow);
- }
- // render the table into the htmlwriter
- table.RenderControl(htw);
- // render the htmlwriter into the response
- HttpContext.Current.Response.Write(sw.ToString());
- HttpContext.Current.Response.End();
- }
- }
- }
- /// <summary>
- /// Replace any of the contained controls with literals
- /// </summary>
- /// <param name="control"></param>
- private static void PrepareControlForExport(System.Web.UI.Control control)
- {
- for (int i = 0; i < control.Controls.Count; i++)
- {
- System.Web.UI.Control current = control.Controls[i];
- if (current is LinkButton)
- {
- control.Controls.Remove(current);
- control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
- }
- else if (current is ImageButton)
- {
- control.Controls.Remove(current);
- control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
- }
- else if (current is HyperLink)
- {
- control.Controls.Remove(current);
- control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
- }
- else if (current is DropDownList)
- {
- control.Controls.Remove(current);
- control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
- }
- else if (current is CheckBox)
- {
- control.Controls.Remove(current);
- control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
- }
- if (current.HasControls())
- {
- PrepareControlForExport(current);
- }
- }
- }
- /// <summary>
- /// 导出Grid的数据(全部)到Excel
- /// 字段全部为BoundField类型时可用
- /// 要是字段为TemplateField模板型时就取不到数据
- /// </summary>
- /// <param name="grid">grid的ID</param>
- /// <param name="dt">数据源</param>
- /// <param name="excelFileName">要导出Excel的文件名</param>
- public static void OutputExcel(GridView grid, DataTable dt, string excelFileName)
- {
- Page page = (Page)HttpContext.Current.Handler;
- page.Response.Clear();
- string fileName = System.Web.HttpUtility.UrlEncode(System.Text.Encoding.UTF8.GetBytes(excelFileName));
- page.Response.AddHeader("Content-Disposition", "attachment:filename=" + fileName + ".xls");
- page.Response.ContentType = "application/vnd.ms-excel";
- page.Response.Charset = "utf-8";
- StringBuilder s = new StringBuilder();
- s.Append("<HTML><HEAD><TITLE>" + fileName + "</TITLE><META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></head><body>");
- int count = grid.Columns.Count;
- s.Append("<table border=1>");
- s.AppendLine("<tr>");
- for (int i = 0; i < count; i++)
- {
- if (grid.Columns[i].GetType() == typeof(BoundField))
- s.Append("<td>" + grid.Columns[i].HeaderText + "</td>");
- //s.Append("<td>" + grid.Columns[i].HeaderText + "</td>");
- }
- s.Append("</tr>");
- foreach (DataRow dr in dt.Rows)
- {
- s.AppendLine("<tr>");
- for (int n = 0; n < count; n++)
- {
- if (grid.Columns[n].Visible && grid.Columns[n].GetType() == typeof(BoundField))
- s.Append("<td>" + dr[((BoundField)grid.Columns[n]).DataField].ToString() + "</td>");
- }
- s.AppendLine("</tr>");
- }
- s.Append("</table>");
- s.Append("</body></html>");
- page.Response.BinaryWrite(System.Text.Encoding.GetEncoding("utf-8").GetBytes(s.ToString()));
- page.Response.End();
- }
- }
- }
|