ASP.net(C#)导出Excel----普通表头,多层表头。


在工作中,使用ASP.net(C#)从页面上导出Excel文件。要求是复杂表头

所以就试了几种方法,列出来供大家参考:

第一种方法呢,主要针对简单的Excel的导出,只有一行列名和数据。

在页面上,有一个导出的按钮。下面只写出按钮事件的代码:

  1. try  
  2. {  
  3.     System.Data.DataTable table = bindData("Trdate desc");  
  4.     //将DataTable中添加一行,合并所有列  
  5.     String[] arr = new String[10] { "卡印刷号""流水号""商户名称""商户号""POS编号""日期时间""发生额""操作员""类型""备注" };  
  6.     for (int i = 0; i < table.Columns.Count; i++)  
  7.     {  
  8.         table.Columns[i].ColumnName = arr[i].ToString();  
  9.     }  
  10.     DataView dv1 = table.DefaultView;  
  11.     dv1.Sort = "Trdate desc";//将DataTable排序,按POS编号(分店)排序,日期时间按倒序排列  
  12.     table = dv1.ToTable();  
  13.   
  14.     ExcelHelper.DataTable1Excel(table);  
  15. }  
  16. catch  
  17. {  
  18.     Response.Write("<script >function window.onload() {alert('导出失败!');}</script>");  
  19. }  
ExcelHelper类中:
  1. public static void DataTable1Excel(System.Data.DataTable dtData)  
  2.       {  
  3.           try   
  4.           {  
  5.            GridView gvExport = null;  
  6.            HttpContext curContext = HttpContext.Current;  
  7.            StringWriter strWriter = null;  
  8.           HtmlTextWriter htmlWriter = null;  
  9.           if (dtData != null)  
  10.           {  
  11.   
  12.               curContext.Response.ContentType = "application/vnd.ms-excel";  
  13.               curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");  
  14.               curContext.Response.Charset = "utf-8";  
  15.               strWriter = new StringWriter();  
  16.               htmlWriter = new HtmlTextWriter(strWriter);  
  17.               gvExport = new GridView();  
  18.               gvExport.DataSource = dtData.DefaultView;  
  19.               gvExport.AllowPaging = false;  
  20.               gvExport.DataBind();  
  21.               gvExport.RenderControl(htmlWriter);  
  22.               curContext.Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=gb2312\"/>" + strWriter.ToString());  
  23.               curContext.Response.End();  
  24.           }  
  25.           }  
  26.           catch (Exception e)  
  27.           {   
  28.               throw e;  
  29.           }  
  30.       }  

方法2:需要引入MyXls的引用。org.in2bits.MyXls
  1. try  
  2.            {  
  3.                org.in2bits.MyXls.XlsDocument tz = new org.in2bits.MyXls.XlsDocument();  
  4.                tz.FileName = DateTime.Now.ToString().Replace("-""").Replace(":""").Replace(" """) + ".xls";//excel文件名称  
  5.                org.in2bits.MyXls.Worksheet sheet = tz.Workbook.Worksheets.AddNamed("36524充值明细");//Excel工作表名称  
  6.                org.in2bits.MyXls.Cells cells = sheet.Cells;  
  7.                int colnum = GridView_Data.Columns.Count; //获取gridview列数  
  8.   
  9.                for (int i = 0; i < colnum; i++)  
  10.                {  
  11.                    cells.AddValueCell(1, (i + 1), GridView_Data.Columns[i].HeaderText);//导出gridView列名  
  12.   
  13.                }  
  14.                DataTable table = bindData("Trdate desc");  
  15.                for (int i = 0; i < table.Rows.Count; i++)  
  16.                {  
  17.                    for (int j = 0; j < colnum; j++)  
  18.                    {  
  19.                        cells.AddValueCell((i + 2), (j + 1), table.Rows[i][j].ToString());  
  20.   
  21.                    }  
  22.                }  
  23.                tz.Send();//把写好的excel文件输出到客户端  
  24.   
  25.            }  
  26.            catch { }  

方法3:-------------------复杂表头
  1. DataTable table = bindData("Trdate desc");  
  2.             String[] arr = new String[10] { "卡印刷号""流水号""商户名称""商户号""POS编号""日期时间""发生额""操作员""类型""备注" };  
  3.             for (int i = 0; i < table.Columns.Count; i++)  
  4.             {  
  5.                 table.Columns[i].ColumnName = arr[i].ToString();  
  6.             }  
  7.             DataView dv1 = table.DefaultView;  
  8.             dv1.Sort = "Trdate desc";//将DataTable排序,按POS编号(分店)排序,日期时间按倒序排列  
  9.             table = dv1.ToTable();  
  10.   
  11.             string summary = LabelSumLS.Text;  
  12.             exportBu36524czmx("充值明细", summary, table);  
  1. #region 导出Excel--方法三  
  2.       protected void exportBu36524czmx(string titleName,string summary,DataTable table)  
  3.       {  
  4.           try  
  5.           {  
  6.               string temp_path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);//生成的文件存放路径  
  7.               ExcelOperate excelOperate = new ExcelOperate();  
  8.               //建立一个Excel.Application的新进程  
  9.               Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();  
  10.               if (app == null)  
  11.               {  
  12.                   return;  
  13.               }  
  14.               app.Visible = false;  
  15.               app.UserControl = true;  
  16.               Microsoft.Office.Interop.Excel.Workbooks workbooks = app.Workbooks;  
  17.               Microsoft.Office.Interop.Excel._Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);//这里的Add方法里的参数就相当于继承了一个空模板(暂这样理解吧)  
  18.               Microsoft.Office.Interop.Excel.Sheets sheets = workbook.Worksheets;  
  19.               Microsoft.Office.Interop.Excel._Worksheet worksheet = (Microsoft.Office.Interop.Excel._Worksheet)sheets.get_Item(1);  
  20.               if (worksheet == null)  
  21.               {  
  22.                   return;  
  23.               }  
  24.   
  25.               worksheet.Rows.NumberFormatLocal = "@"//设置所有单元格为文本格式   
  26.   
  27.               //第一行的标题  
  28.               worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, table.Columns.Count]).Merge(Missing.Value); //横向合并  
  29.               worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 1]).Value2 = titleName;  
  30.               //设置格式  
  31.               excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1]);//居中  
  32.               excelOperate.SetFontSize(worksheet, worksheet.Cells[1, 1], worksheet.Cells[1, 1], 12);//字体大小  
  33.               worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, table.Columns.Count]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//黑色连续边框  
  34.               //第二行的综述  
  35.               worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[2, table.Columns.Count]).Merge(Missing.Value); //横向合并  
  36.               worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[2, 1]).Value2 = summary;  
  37.               //设置格式  
  38.                excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[2, 1], worksheet.Cells[2, 1]);//居中  
  39.                excelOperate.SetFontSize(worksheet, worksheet.Cells[2, 1], worksheet.Cells[2, 1], 9);//字体大小  
  40.                worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[1, table.Columns.Count]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//黑色连续边框  
  41.   
  42.               for (int i = 0; i < table.Columns.Count; i++)  
  43.               {  
  44.                   worksheet.Cells[3, i + 1] = table.Columns[i].ColumnName.ToString();  
  45.                   excelOperate.SetFontSize(worksheet, worksheet.Cells[3, i + 1], worksheet.Cells[3, i + 1], 9);//字体大小  
  46.                   excelOperate.SetBold(worksheet, worksheet.Cells[3, i + 1], worksheet.Cells[3, i + 1]); //黑体  
  47.               }  
  48.   
  49.               worksheet.get_Range(worksheet.Cells[3, 1], worksheet.Cells[3, table.Columns.Count]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);  
  50.               for (int i = 0; i < table.Rows.Count; i++)  
  51.               {  
  52.                   for (int j = 0; j < table.Columns.Count; j++)  
  53.                   {  
  54.                       string data = table.Rows[i][j].ToString();  
  55.                       worksheet.Cells[4 + i, j + 1] = data;  
  56.                       excelOperate.SetFontSize(worksheet, worksheet.Cells[4 + i, j + 1], worksheet.Cells[4 + i, j + 1], 9);//字体大小  
  57.                       //if (j == 6)   
  58.                       //{   
  59.                       //    worksheet.Cells[4 + i, j + 1].  
  60.                       //}  
  61.                   }  
  62.   
  63.                   worksheet.get_Range(worksheet.Cells[4 + i, 1], worksheet.Cells[4 + i, 10]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//设置边框颜色,不然打印预览,会非常不雅观  
  64.   
  65.               }  
  66.               worksheet.Name = titleName;  
  67.   
  68.               worksheet.Columns.EntireColumn.AutoFit();//列宽自适应  
  69.   
  70.               String tick = DateTime.Now.ToString().Replace("-""").Replace(":""").Replace(" """) + ".xls";//excel文件名称  
  71.               String save_path = temp_path + "\\" + tick + ".xls";  
  72.               workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);  
  73.               excelOperate.Dispose(worksheet, workbook, app);//关闭Excel进程  
  74.               Response.Write("<script >function window.onload() {alert('导出Excel文件到桌面成功!');}</script>");  
  75.           }  
  76.           catch  
  77.           {  
  78.               Response.Write("<script >function window.onload() {alert('导出失败!');}</script>");  
  79.           }  
  80.             
  81.       }  
  82.       #endregion   

结果:



方法4------------------------复杂表头,和方法三的结果一样。---------------------------我最后采用的第4种方法。

  1. string excelTile = Label1.Text;  
  2.           string summary = LabelSumLS.Text;  
  3.           TableCell[] header = new TableCell[12];  
  4.           for (int i = 0; i < header.Length; i++)  
  5.           {  
  6.               header[i] = new TableHeaderCell();  
  7.           }  
  8.           //第一行表头  
  9.           header[0].ColumnSpan = 10;  
  10.           header[0].Text = excelTile + "</th></tr><tr>";  
  11.           //第二行表头  
  12.           header[1].ColumnSpan = 10;  
  13.           header[1].Text = summary + "</th></tr><tr>";  
  14.   
  15.           String[] arr = new String[10] { "卡印刷号""流水号""商户名称""商户号""POS编号""日期时间""发生额""操作员""类型""备注" };  
  16.           for (int i = 0; i < arr.Length; i++)  
  17.           {  
  18.               header[i + 2].Text = arr[i];  
  19.               if (i + 2 == 11)  
  20.               {  
  21.                   header[i + 2].Text = arr[i] + "</th>";  
  22.               }  
  23.           }  
  24.   
  25.           DataTable dt = bindData("Trdate desc");//根据检索条件查询出DataTable  
  26.   
  27.           Dictionary<intint> mergeCellNums = new Dictionary<intint>();  
  28.           for (int i = 0; i < dt.Columns.Count; i++)  
  29.           {  
  30.               mergeCellNums.Add(i, 2);  
  31.           }  
  32.           Common.DataTable2Excel(dt, header, excelTile + DateTime.Now.ToString("yyyyMMdd"), mergeCellNums, 0);  

Common类的代码如下:
  1. using System;    
  2. using System.Collections.Generic;    
  3. using System.Web;    
  4. using System.Configuration;    
  5. using System.Data;    
  6. using System.Data.Common;    
  7. using System.Data.OleDb;    
  8. using System.Web.UI.WebControls;    
  9. using System.Text.RegularExpressions;  
  10.   
  11. namespace ContractSystem.WebUI.DataAnalyse  
  12. {  
  13.     /// <summary>    
  14.     /// Common 的摘要说明    
  15.     /// 作者:李伟波    
  16.     /// 时间:2012-10-18    
  17.     /// </summary>    
  18.     public class Common  
  19.     {  
  20.         public Common()  
  21.         {  
  22.             //    
  23.             //TODO: 在此处添加构造函数逻辑    
  24.             //    
  25.         }  
  26.   
  27.         /// <summary>    
  28.         /// 描述:把DataTable内容导出excel并返回客户端     
  29.         /// </summary>    
  30.         /// <param name="dtData"></param>    
  31.         /// <param name="header"></param>    
  32.         /// <param name="fileName"></param>    
  33.         /// <param name="mergeCellNums">要合并的列索引字典 格式:列索引-合并模式(合并模式 1 合并相同项、2 合并空项、3 合并相同项及空项)</param>    
  34.         /// <param name="mergeKey">作为合并项的标记列索引</param>    
  35.         public static void DataTable2Excel(System.Data.DataTable dtData, TableCell[] header, string fileName, Dictionary<intint> mergeCellNums, int mergeKey)  
  36.         {  
  37.             System.Web.UI.WebControls.GridView gvExport = null;  
  38.             // 当前对话     
  39.             System.Web.HttpContext curContext = System.Web.HttpContext.Current;  
  40.             // IO用于导出并返回excel文件     
  41.             System.IO.StringWriter strWriter = null;  
  42.             System.Web.UI.HtmlTextWriter htmlWriter = null;  
  43.   
  44.             if (dtData != null)  
  45.             {  
  46.                 // 设置编码和附件格式     
  47.                 curContext.Response.ContentType = "application/vnd.ms-excel";  
  48.                 curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");  
  49.                 curContext.Response.Charset = "gb2312";  
  50.                 if (!string.IsNullOrEmpty(fileName))  
  51.                 {  
  52.                     //处理中文名乱码问题    
  53.                     fileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);  
  54.                     curContext.Response.AppendHeader("Content-Disposition", ("attachment;filename=" + (fileName.ToLower().EndsWith(".xls") ? fileName : fileName + ".xls")));  
  55.                 }  
  56.                 // 导出excel文件     
  57.                 strWriter = new System.IO.StringWriter();  
  58.                 htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter);  
  59.   
  60.                 // 重新定义一个无分页的GridView     
  61.                 gvExport = new System.Web.UI.WebControls.GridView();  
  62.                 gvExport.DataSource = dtData.DefaultView;  
  63.                 gvExport.AllowPaging = false;  
  64.                 //优化导出数据显示,如身份证、12-1等显示异常问题    
  65.                 gvExport.RowDataBound += new System.Web.UI.WebControls.GridViewRowEventHandler(dgExport_RowDataBound);  
  66.   
  67.                 gvExport.DataBind();  
  68.                 //处理表头    
  69.                 if (header != null && header.Length > 0)  
  70.                 {  
  71.                     gvExport.HeaderRow.Cells.Clear();  
  72.                     gvExport.HeaderRow.Cells.AddRange(header);  
  73.                 }  
  74.                 //合并单元格    
  75.                 if (mergeCellNums != null && mergeCellNums.Count > 0)  
  76.                 {  
  77.                     foreach (int cellNum in mergeCellNums.Keys)  
  78.                     {  
  79.                         MergeRows(gvExport, cellNum, mergeCellNums[cellNum], mergeKey);  
  80.                     }  
  81.                 }  
  82.   
  83.                 // 返回客户端     
  84.                 gvExport.RenderControl(htmlWriter);  
  85.                 curContext.Response.Clear();  
  86.                 curContext.Response.Write("<meta http-equiv=\"content-type\" content=\"application/ms-excel; charset=gb2312\"/>" + strWriter.ToString());  
  87.                 curContext.Response.End();  
  88.             }  
  89.         }  
  90.         /// <summary>    
  91.         /// 描述:行绑定事件    
  92.         /// </summary>    
  93.         /// <param name="sender"></param>    
  94.         /// <param name="e"></param>    
  95.         protected static void dgExport_RowDataBound(object sender, GridViewRowEventArgs e)  
  96.         {  
  97.             if (e.Row.RowType == DataControlRowType.DataRow)  
  98.             {  
  99.                 foreach (TableCell cell in e.Row.Cells)  
  100.                 {  
  101.                     //优化导出数据显示,如大数据的字符串:卡号等显示异常问题    
  102.                     if (Regex.IsMatch(cell.Text.Trim(), @"^\d{12,}$"))  
  103.                     {  
  104.                         cell.Attributes.Add("style""vnd.ms-excel.numberformat:@");  
  105.                     }  
  106.                 }  
  107.             }  
  108.         }  
  109.   
  110.         /// <summary>       
  111.         /// 描述:合并GridView列中相同的行    
  112.         /// </summary>       
  113.         /// <param   name="gvExport">GridView对象</param>       
  114.         /// <param   name="cellNum">需要合并的列</param>       
  115.         /// <param name="mergeMode">合并模式 1 合并相同项、2 合并空项、3 合并相同项及空项</param>    
  116.         /// <param name="mergeKey">作为合并项的标记列索引</param>    
  117.         public static void MergeRows(GridView gvExport, int cellNum, int mergeMode, int? mergeKey)  
  118.         {  
  119.             int i = 0, rowSpanNum = 1;  
  120.             //System.Drawing.Color alterColor = System.Drawing.Color.LightGray;  
  121.             while (i < gvExport.Rows.Count - 1)  
  122.             {  
  123.                 GridViewRow gvr = gvExport.Rows[i];  
  124.                 for (++i; i < gvExport.Rows.Count; i++)  
  125.                 {  
  126.                     GridViewRow gvrNext = gvExport.Rows[i];  
  127.                     if ((!mergeKey.HasValue || (mergeKey.HasValue && (gvr.Cells[mergeKey.Value].Text.Equals(gvrNext.Cells[mergeKey.Value].Text) || " ".Equals(gvrNext.Cells[mergeKey.Value].Text)))) && ((mergeMode == 1 && gvr.Cells[cellNum].Text == gvrNext.Cells[cellNum].Text) || (mergeMode == 2 && " ".Equals(gvrNext.Cells[cellNum].Text.Trim())) || (mergeMode == 3 && (gvr.Cells[cellNum].Text == gvrNext.Cells[cellNum].Text || " ".Equals(gvrNext.Cells[cellNum].Text.Trim())))))  
  128.                     {  
  129.                         gvrNext.Cells[cellNum].Visible = false;  
  130.                         rowSpanNum++;  
  131.                         gvrNext.BackColor = gvr.BackColor;  
  132.                     }  
  133.                     else  
  134.                     {  
  135.                         gvr.Cells[cellNum].RowSpan = rowSpanNum;  
  136.                         rowSpanNum = 1;  
  137.                         //间隔行加底色,便于阅读    
  138.                         //if (mergeKey.HasValue && cellNum == mergeKey.Value)  
  139.                         //{  
  140.                         //    if (alterColor == System.Drawing.Color.White)  
  141.                         //    {  
  142.                         //        gvr.BackColor = System.Drawing.Color.LightGray;  
  143.                         //        alterColor = System.Drawing.Color.LightGray;  
  144.                         //    }  
  145.                         //    else  
  146.                         //    {  
  147.                         //        alterColor = System.Drawing.Color.White;  
  148.                         //    }  
  149.                         //}  
  150.                         break;  
  151.                     }  
  152.                     if (i == gvExport.Rows.Count - 1)  
  153.                     {  
  154.                         gvr.Cells[cellNum].RowSpan = rowSpanNum;  
  155.                         //if (mergeKey.HasValue && cellNum == mergeKey.Value)  
  156.                         //{  
  157.                         //    if (alterColor == System.Drawing.Color.White)  
  158.                         //        gvr.BackColor = System.Drawing.Color.LightGray;  
  159.                         //}  
  160.                     }  
  161.                 }  
  162.             }  
  163.         }  
  164.     }  
  165.   
  166. }  

第4中方法参考链接如下:{我的程序中,将行间隔的颜色去掉了,在Common中注释掉的语句是每间隔一行,将该行的背景置灰} http://blog.csdn.net/ranbolwb/article/details/8083983
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值