将DataTable导出为Excel文件的方法

 需求:前台点击某个按钮,在后台从数据库中获取某DataTable数据到处成Excel文件。

1.Asp按钮控件

  两个按钮,分别调用两种导出Excel文件的后台方法。

<%--第一种方法--%>
    <form id="form1" runat="server">
        <div>
            <asp:Button runat="server" OnClick="Btn1_Click" ID="Btn1" Text="Asp控件按钮导出Excel1" Width="200px" />
            <asp:Button runat="server" OnClick="Btn12_Click" ID="Btn12" Text="Asp控件按钮导出Excel2" Width="200px" />
        </div>
    </form>

2.后台事件

protected void Btn1_Click(object sender, EventArgs e)
{
    ExportToExcel1(GetDT(), "BTN1_名单");
}
protected void Btn12_Click(object sender, EventArgs e)
{
    ExportToExcel2(GetDT(), "BTN12_名单");
}

  模拟数据库获取DataTable。

DataTable GetDT()
{
    DataTable dt = new DataTable();
    dt.Columns.Add("排名", typeof(int));
    DataColumn dc1 = new DataColumn("歌手", typeof(string));
    dt.Columns.Add(dc1);
    DataRow dr1 = dt.NewRow();
    dr1["排名"] = 1; dr1["歌手"] = "周杰伦";
    DataRow dr2 = dt.NewRow();
    dr2["排名"] = 2; dr2["歌手"] = "陈奕迅";
    dt.Rows.Add(dr1); dt.Rows.Add(dr2);
    return dt;
}

  下面贴出的两个导Excel的方法,其中一个是DataTable数据绑定到Web控件(DataGrid)中,将控件中的数据写入HtmlTextWriter对象中,在输出到Excel文件;另一种是直接将DataTable每行的DataRow中的Cell数据写入Excel。两种方法最后在Excel文件中内容的呈现格式会略有不同。

        /// <summary>
        /// DataTable中的数据导出到Excel并下载
        /// DataTable绑定到Web控件,读取控件里的数据写入Excel
        /// </summary>
        /// <param name="dt">要导出的DataTable</param>
        /// <param name="fileName">Excel的文件名</param>
        public void ExportToExcel1(DataTable dt, string fileName)
        {
            //将DataTable绑定到DataGird控件
            System.Web.UI.WebControls.DataGrid dg = new System.Web.UI.WebControls.DataGrid();
            dg.DataSource = dt.DefaultView;
            dg.AllowPaging = false;
            dg.HeaderStyle.BackColor = System.Drawing.Color.LightGray;
            dg.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
            dg.HeaderStyle.Font.Bold = true;
            dg.DataBind();
            Response.Clear();
            Response.Buffer = true;

            //防止出现乱码,加上这行可以防止在只有一行数据时出现乱码
            Response.Write("<meta http-equiv=Content-Type content=text/html;charset=UTF-8>");
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName + ".xls", System.Text.Encoding.UTF8));
            Response.ContentType = "application/ms-excel";

            Response.Charset = "UTF-8";
            //指定编码 防止中文乱码现象
            Response.ContentEncoding = System.Text.Encoding.UTF8;

            //关闭控件的视图状态
            this.EnableViewState = false;

            //初始化HtmlWriter
            System.IO.StringWriter writer = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(writer);
            //将DataGird内容输出到HtmlTextWriter对象中
            dg.RenderControl(htmlWriter);
            string outputStr = writer.ToString();
            //输出
            Response.Write(outputStr);
            Response.Flush();
            Response.End();
        }

ExportToExcel1

        // <summary>
        /// DataTable中的数据导出到Excel并下载
        /// 读取DataTable中每行DataRow里的数据写入Excel
        /// </summary>
        /// <param name="dt">要导出的DataTable</param>
        /// <param name="FileName">Excel的文件名</param>
        public void ExportToExcel2(DataTable dt, string fileName)
        {
            Response.Clear();
            Response.Charset = "UTF-8";
            Response.Buffer = true;
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            Response.AppendHeader("Content-Disposition", "attachment;filename=\"" +HttpUtility.UrlEncode(fileName+".xls", System.Text.Encoding.UTF8));
            Response.ContentType = "application/ms-excel";
            string colHeaders = string.Empty;
            string ls_item = string.Empty;

            DataRow[] myRow = dt.Select();
            int i = 0;
            int cl = dt.Columns.Count;
            for (i = 0; i < cl; i++)
            {
                if (i == (cl - 1))
                {
                    ls_item += dt.Columns[i].Caption + "\n";
                }
                else
                {
                    ls_item += dt.Columns[i].Caption + "\t";
                }
                Response.Output.Write(ls_item);
                ls_item = string.Empty;
            }
            foreach (DataRow row in myRow)
            {
                for (i = 0; i < cl; i++)
                {
                    if (i == (cl - 1))
                    {
                        ls_item += row[i].ToString() + "\n";
                    }
                    else
                    {
                        ls_item += row[i].ToString() + "\t";
                    }
                }
                Response.Output.Write(ls_item);
                ls_item = string.Empty;
            }
            Response.Output.Flush();
            Response.End();
        }

ExportToExcel2

  提示,使用第二种方法如果写入Excel的文本以“ID”(区分大小写)开始,打开文件时会出现如下的提示,但是点击“确定”仍然是可以正常打开的。

  你这时候需要在获取数据库的方法中将ID改成其他名称,如“编号”,或者“Id”即可。

3.效果展示

  ExportToExcel1导出的Excepl文件会遗传Html数据显示的style,标题行加粗,背景颜色灰,无全网格;

ExportToExcel2导出的文件内容格式则是纯文本的格式。

4.遗留问题

  下载的Excel文件使用Excel2003以上版本打开会提示文件已损坏或不安全,虽然点击“是”仍然可以正常打开,该问题待跟踪解决,望有博友大神相助。

5.扩展

  Html按钮的点击事件绑定后台方法

  #1、使用已有Asp按钮控件的点击方法

<input type="button" id="btn2" onclick="document.getElementById(‘Btn1‘).click()" value="Html按钮导出Excel" runat="server" class="auto-style1" />

  #2、使用<%=%>

<input type="button" id="btn3" onclick="<%=Export()%>" value="js调用"/>
后台方法

public object Export()//需要是有返回类型的方法
{
  ExportToExcel1(GetDT(), "BTN3_名单");
  return null;
}

  使用第<%=%>方法时,后台方法必须是有返回值的方法,而且该方法是加载页面时便会弹出下载提示框,下载或取消完成后都会关闭该页面,不推荐此方式。

时间: 2024-12-22 16:47:23

将DataTable导出为Excel文件的方法的相关文章

DataTable导出到Excel文件

调用方法: ExcelHelper.Export(dtTemp, "供应商App", DlgSave.FileName, "物料文档" , new string[10] { "MatterCode", "MatterName", "MatterType", "MainUnit", "TagModelName", "LotName", "F

把DataTable导出为Excel文件

今天项目里遇到了需要把DataTable导出为Excel的问题将解决方案记录在园子备忘 需要一些东西第三方的类库Aspose.Cells此处随意找个下载链接:http://www.cr173.com/soft/66096.html本人不保证该链接的合法性和有效性 说重点,上Demo public bool ExportAsExcel(string URI, DataSet ds) { Aspose.Cells.Workbook wk = new Aspose.Cells.Workbook();

c# DataTable导出为excel

/// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <param name="dt">要导出的DataTable</param> public static void ExportToExcel(System.Data.DataTable dt) { if (dt == null) return; Microsoft.Office.Interop.Excel.Ap

C# datatable 导出到Excel

datatable导出到Excel /// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <param name="dt">要导出的DataTable</param> public static void ErrorCrd_ExportToExcel(DataTable dt) { if (dt == null) return; Microsoft.Office.I

C#创建Excel文件并将数据导出到Excel文件

C#创建Excel文件,这里实际上是从资源中提取一个事先创建好的Excel文件,文件提取成功后,使用OleDb方法连接Excel,向Excel文件中写入数据. 创建解决方案 菜单>新建>项目>Windows窗体应用程序: 添加相关组件: 添加两个DataGridView,一个TextBox,两个按钮 ,如下图: 添加Excel资源: 先在文件夹中新建一个Excel文件,在Sheet1表的第一行设置列名: 双击"Resources.resx"文件打开资源文件视图: 添加

数据导出至Excel文件--好库编程网http://code1.okbase.net/codefile/SerializeHelper.cs_2012122018724_118.htm

using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; /// <summary> /// Excel操作类 /// </summary> /// Microsoft Excel 11.0 Obj

使用原生php将数据库数据导出到excel文件中

最近在工作中遇到一个需求,需要将数据库中的数据导出到excel文件中,并下载excel文件.因为以前没做过,所以就百度了一下, 网上说的大多是使用PHPExcel类来操作excel文件,这还要去下载这个类才能使用,而我只想使用原生的php,不想那么麻烦,好在 也有网友说到关于原生php生成excel文件的方法,其实很简单,下面把我结合网上资料自己实践的代码分享一下. 一般我们这种导数据的操作都是通过用户在网页页面上点击某个按钮触发相应js方法,然后请求php接口来实现的,所以主要有两种 方法来完

DataTable 导出到 Excel 类

底层类: #region DataTable 导出到 Excel /// <summary> /// DataTable 导出到 Excel /// </summary> /// <param name="dt">数据表</param> /// <param name="captions">要导出的列标题</param> /// <param name="fieldNames&q

C#基于NPOI生成具有精确列宽行高的Excel文件的方法

本文实例讲述了C#基于NPOI生成具有精确列宽行高的Excel文件的方法,是非常具有实用价值的技巧分享给大家供大家参考.具体方法如下:. 一.前言 NPOI是操作Excel的神器,导出导入快如闪电, 但是SetColumnWidth函数个人感觉不会用,怎么弄都无法控制好,因为他是以字符数量去设置宽度,实际上Excel列宽还有个像素的概念,更难搞懂了. //附带SetColumnWidth的用法和注释 IWorkbook hssfworkbook = new HSSFWorkbook(); ISh