C# DataTable 导出 Excel 进阶 多行表头、合并单元格、中文文件名乱码
例子是上一篇 DataTable 导出 Excel 的进阶,除了上一篇提到的处理乱码问题,本例还添加了处理多行表头、合并单元格的功能及处理中文文件名乱码问题,应该可以满足日常开发的需要了。
废话不多说了,直接上代码:
[csharp]
using System;
using System.Collections.Generic;
using System.Web;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;
using System.Web.UI.WebControls;
using System.Text.RegularExpressions;
/// <summary>
/// Common 的摘要说明
/// 作者:李伟波
/// 时间:2012-10-18
/// </summary>
public class Common
{
public Common()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// 描述:把DataTable内容导出excel并返回客户端
/// 作者:李伟波
/// 时间:2012-10-18
/// </summary>
/// <param name="dtData"></param>
/// <param name="header"></param>
/// <param name="fileName"></param>
/// <param name="mergeCellNums">要合并的列索引字典 格式:列索引-合并模式(合并模式 1 合并相同项、2 合并空项、3 合并相同项及空项)</param>
/// <param name="mergeKey">作为合并项的标记列索引</param>
public static void DataTable2Excel(System.Data.DataTable dtData, TableCell[] header, string fileName, Dictionary<int, int> mergeCellNums, int? mergeKey)
{
System.Web.UI.WebControls.GridView gvExport = null;
// 当前对话
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
// IO用于导出并返回excel文件
System.IO.StringWriter strWriter = null;
System.Web.UI.HtmlTextWriter htmlWriter = null;
if (dtData != null)
{
// 设置编码和附件格式
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
curContext.Response.Charset = "gb2312";
if (!string.IsNullOrEmpty(fileName))
{
//处理中文名乱码问题
fileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);
curContext.Response.AppendHeader("Content-Disposition", ("attachment;filename=" + (fileName.ToLower().EndsWith(".xls") ? fileName : fileName + ".xls")));
}
// 导出excel文件
strWriter = new System.IO.StringWriter();
htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter);
// 重新定义一个无分页的GridView
gvExport = new System.Web.UI.WebControls.GridView();
gvExport.DataSource = dtData.DefaultView;
gvExport.AllowPaging = false;
//优化导出数据显示,如身份证、12-1等显示异常问题
gvExport.RowDataBound += new System.Web.UI.WebControls.GridViewRowEventHandler(dgExport_RowDataBound);
gvExport.DataBind();
//处理表头
if (header != null && header.Length > 0)
{
gvExport.HeaderRow.Cells.Clear();
gvExport.HeaderRow.Cells.AddRange(header);
}
//合并单元格
if (mergeCellNums != null && mergeCellNums.Count > 0)
{
foreach (int cellNum in mergeCellNums.Keys)
{
MergeRows(gvExport, cellNum, mergeCellNums[cellNum], mergeKey);
}
}
// 返回客户端
gvExport.RenderControl(htmlWriter);
curContext.Response.Clear();
curContext.Response.Write("<meta http-equiv=\"content-type\" content=\"application/ms-excel; charset=gb2312\"/>" + strWriter.ToString());
curContext.Response.End();
&nb
补充:软件开发 , C# ,