NET导出Excel文件

最近做ASP.NET Excel导出功能,顺便整理了一下可用的一些导出Excel方法

一般导出方式

1,客户提出要将统计的结果导出到excel文件,首先利用如下方式:

   增加    <%@page contentType="application/vnd.ms-excel;charset=GBK" %>

头部说明,然后放一个table在该页面中即可了。

2,客户看过后提出了改进意见,要求保存文件的时候自动给文件一个名称,这样可以直接保存。

改进如下:

增加    response.setHeader("Content-Disposition",   "attachment; filename="+fileName);

但是却又遇到了乱码的问题:

     response.setHeader("Content-Disposition",
    "attachment; filename="+new String(fileName.getBytes("GBK"),"iso-8859-1"));

将文件名称的编码由GBK转换为ISO-8859-1就正常了。

GridView导出Excel

    尝试了一下Gridview导出为Excel,原本以为很简单,可是真正应用起来还是不太好弄的,呵呵,所想非所得。总结了一下应该注意下面几点:
1.由于gridview的内容可能是分页显示的,因此,这里在每次导出excel时,先将gridview的allowpaging属性设置为false,然后databind()一下,确保搂到所有数据;
2.不用单独设置导出的路径,导出时会弹出对话框让你确认保存位置;
3.要写一个空的VerifyRenderingInServerForm方法(必须写),以确认在运行时为指定的ASP.NET 服务器控件呈现HtmlForm 控件;
4.导出后别忘记再重新设置其allowpaging属性;
    当我把这些都设置好以后,点击[导出],出现了 只能在执行 Render() 的过程中调用 RegisterForEventValidation(RegisterForEventValidation can only be called during Render(); ) 的错误,又检查代码,没发现问题啊,搞了一会弄不出来,然后搜索了一下,发现了解决办法:
修改你的aspx文件中的:
<%@ Page Language="C#" EnableEventValidation = "false" AutoEventWireup="true" CodeFile="SysUser.aspx.cs" Inherits="Autho_SysUser2" %>
增加红色的部分就ok了。
下面是代码和截图:
    #region 导出为Excel
    public override void VerifyRenderingInServerForm(Control control)
    {
        // Confirms that an HtmlForm control is rendered for
    }

    private void ToExcel(Control ctl, string FileName)
    {
        HttpContext.Current.Response.Charset = "UTF-8";
        HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
        HttpContext.Current.Response.ContentType = "application/ms-excel";
        HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + "" + FileName);
        ctl.Page.EnableViewState = false;
        System.IO.StringWriter tw = new System.IO.StringWriter();
        HtmlTextWriter hw = new HtmlTextWriter(tw);
        ctl.RenderControl(hw);
        HttpContext.Current.Response.Write(tw.ToString());
        HttpContext.Current.Response.End();
    }

    private void toExcelClk()
    {
        gvSysUser.AllowPaging = false;
        gvSysUser.AllowSorting = false;
        gvSysUser.DataBind();
        ToExcel(gvSysUser, "OFS_Data.xls");
        gvSysUser.AllowPaging = true;
        gvSysUser.AllowSorting = true;
        gvSysUser.DataBind();
    }

    #endregion

最新ASP.NET导出EXCEL类

说明:可以导出ASP.NET页面和DATAGRID(WebControl)数据,可以导出表单头

using System;
using System.Data;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Diagnostics;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections;

namespace bookstore
{
///
/// Excel 的摘要说明。
///
public class Excel
{
public Excel()
{
   //
   // TODO: 在此处添加构造函数逻辑
   //
}

public void SaveToExcel(Page myPage, DataTable dt,DataGrid DG,string myExcelHeader,HtmlTable Tab,string myFileName)
{
   HttpResponse resp;   
   resp=myPage.Response;
   resp.ContentEncoding=Encoding.GetEncoding("GB18030");
   resp.AppendHeader("Content-Disposition","attachment;filename="+myFileName+".xls");
   resp.ContentType="application/ms-excel";

   string colHeaders = "\t\t\t\t"+ myExcelHeader +"\n\n\n";

   colHeaders+=tableHeader(Tab)+"\n";

   StringBuilder sb=new StringBuilder();
  
   int mycol=DG.Columns.Count;
   ArrayList myAL=new ArrayList();

   for(int i=0;i   {
    colHeaders +=DG.Columns[i].HeaderText+"\t";
    myAL.Add(((System.Web.UI.WebControls.BoundColumn)(DG.Columns[i])).DataField);
   }
   colHeaders += "\n";
   sb.Append(colHeaders);

   int myrow=dt.Rows.Count;

   for(int k=0;k   {
    foreach(string field in myAL)
    {  
     sb.Append(dt.Rows[k][field]);
     sb.Append("\t");
    }
    sb.Append("\n");
   }      
  
   colHeaders=sb.ToString();

   colHeaders=colHeaders+"\n";
   resp.Write(colHeaders);

   resp.End();
   resp.Clear();
   resp.Close();
}


/*得到表单头子*/
/*表单头子有TABLE组成,偶次项排列,TABLE在HTML中加 RUNAT=SERVER*/
public string tableHeader(HtmlTable Tab)
{
   int iCols=Tab.Rows[0].Cells.Count;
   int iRows=Tab.Rows.Count;
   string str="";
  
   for(int row=0;row   {
    for(int col=0;col    {
     if(col%2==1)//取偶次项的控件数据(目前只有TextBox和DropDownList,没有包含LABEL)
     {
      try
      {
       if(Tab.Rows[row].Cells[col].Controls[0].ToString()=="System.Web.UI.LiteralControl")
       {
        if(Tab.Rows[row].Cells[col].Controls[1].ToString()=="System.Web.UI.WebControls.TextBox")
        {
         str+=((System.Web.UI.WebControls.TextBox)(Tab.Rows[row].Cells[col].Controls[1])).Text+"\t";
        }
        if(Tab.Rows[row].Cells[col].Controls[1].ToString()=="System.Web.UI.WebControls.DropDownList")
        {
         str+=((System.Web.UI.WebControls.ListControl)(((System.Web.UI.WebControls.DropDownList)((Tab.Rows[row].Cells[col].Controls[1]))))).SelectedValue+"\t";    
        }
       }
       else
       {
        if(Tab.Rows[row].Cells[col].Controls[0].ToString()=="System.Web.UI.WebControls.TextBox")
        {
         str+=((System.Web.UI.WebControls.TextBox)(Tab.Rows[row].Cells[col].Controls[0])).Text+"\t";
        }
        if(Tab.Rows[row].Cells[col].Controls[0].ToString()=="System.Web.UI.WebControls.DropDownList")
        {
         str+=((System.Web.UI.WebControls.ListControl)(((System.Web.UI.WebControls.DropDownList)((Tab.Rows[row].Cells[col].Controls[0]))))).SelectedValue+"\t";    
        }
       }
      }
      catch
      {
       str+=Tab.Rows[row].Cells[col].InnerHtml+"\t";
      }
      if((col+1)%iCols==0)
      {
       str+="\n";
      }
     }
     else
     {
      str+="\t"+Tab.Rows[row].Cells[col].InnerHtml+"\t";
     }
    }
   }
   return(str);
}

}
}

ASP.NET导出Excel、World文档

      对于大量的数据,有时候导出到Excel中将更加方便进行数据统计分析,而对于排版打印则导出到World文档中更加方便。在ASP.NET可以通过少量代码实现这两种导出。

        新建一页面,该页面布局Html源码如下:

<form id="form1" runat="server"><div>
        <asp:Button ID="cmdOpen" runat="server" Text="在线打开" CommandName="open" OnCommand="Button_Click" />&nbsp;<asp:Button ID="cmdSave"
            runat="server" Text="本地保存" CommandName="save" OnCommand="Button_Click" />
        <asp:DropDownList ID="listType" runat="server">
            <asp:ListItem Value="excel">Excel</asp:ListItem>
            <asp:ListItem Value="word">Word</asp:ListItem>
        </asp:DropDownList><br />
        <br />
        数据源:<br />
        <br />
        <asp:GridView ID="myGW" runat="server">
        </asp:GridView>
    </div></form>

       这里没有什么特别的,只需要注意在线打开与本地保存两个按钮通过CommandName进行检验并触发相应的动作,DropDownList控件存放了可以导出的格式,可以自己添加如txt、html等格式。准备工作就绪以后,可以进行代码的书写,以完成我们需要的功能:

    protected void Page_Load(object sender, EventArgs e)
    {
        FillGridView();
    }
    private void OutPut(string fileType, string strType)
    {
        Response.Clear();
        Response.Buffer = true;
        Response.Charset = "GB2312";
        Response.AppendHeader("Content-Disposition", fileType);
        Response.ContentType = strType;
        this.EnableViewState = false;
        System.IO.StringWriter swOut = new System.IO.StringWriter();
        HtmlTextWriter hTw = new HtmlTextWriter(swOut);
        myGW.RenderControl(hTw);
        Response.Write(swOut.ToString());
        Response.End();
    }

    protected void Button_Click(object sender, CommandEventArgs e)
    {
        switch (e.CommandName)
        {
            case "save":
                switch (listType.SelectedValue)
                {
                    case "excel":
                        OutPut("attachment;filename=out.xls", "application/ms-excel");
                        break;
                    case "word":
                        OutPut("attachment;filename=out.doc", "application/ms-word");
                        break;
                }
                break;
            case "open":
                switch (listType.SelectedValue)
                {
                    case "excel":
                        OutPut("online;filename=out.xls", "application/ms-excel");
                        break;
                    case "word":
                        OutPut("online;filename=out.doc", "application/ms-word");
                        break;
                }
                break;
        }
    }
    public override void VerifyRenderingInServerForm(Control control)
    {
    }
    private void FillGridView()
    {
        string strConn = "server=localhost\\sqlexpress;database=Northwind;user id=sa;password=sa123";
        SqlConnection conn = new SqlConnection(strConn);
        SqlCommand comm = new SqlCommand();
        comm.Connection = conn;
        string strSql = "select * from Categories";
        comm.CommandText = strSql;
        conn.Open();
        this.myGW.DataSource = comm.ExecuteReader();
        this.myGW.DataBind();
        conn.Close();
    }

      在以上的程序中,最主要的就是函数OutPut(string fileType, string strType),它完成导出或在线打开的动作,这里接受两个参数其中fileType指定是保存或在线打开,并且指名了文件的名字如:attachment;filename=out.xls(作为附件保存,文件名为out.xls)、online;filename=out.xls(在线打开);strType指定了带出文档的格式如application/ms-excel。

      注意如果想要导出GridView中的数据并且要我们的程序顺利执行,则必须重写VerifyRenderingInServerForm(Control control),否则会报错的。

      如果我们想要将整个页面导出到Excel中,则不需要重写VerifyRenderingInServerForm,只需要将OutPut函数中的myGW.RenderControl(hTw)改为this.RenderControl(hTw)就可以了。

      完成以上工作,在浏览器中测试,我们想要的导出功能就可以很好的工作了。

利用Office中导出的Excel.dll(DCOM方式)

这个类可以很好的控制Excel。读出内容想怎么导就怎么导
/// <summary>
/// Excel处理类
/// </summary>
public class ExcelHander
{
public ExcelHander()
{
//
// TODO: Add constructor logic here
//
}
private string AList="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

public string GetAix(int x,int y)
{
char [] AChars=AList.ToCharArray();
if(x>=26){return "";}
string s="";
s=s+AChars[x-1].ToString();
s=s+y.ToString();
return s;
}
public void setValue(int x,int y,string align,string text)
{
Excel.Range range=sheet.get_Range(this.GetAix(x,y),miss);
range.set_Value(miss,text);
if(align.ToUpper()=="CENTER")
{
range.HorizontalAlignment=Excel.XlHAlign.xlHAlignCenter;
}
if(align.ToUpper()=="LEFT")
{
range.HorizontalAlignment=Excel.XlHAlign.xlHAlignLeft;
}
if(align.ToUpper()=="RIGHT")
{
range.HorizontalAlignment=Excel.XlHAlign.xlHAlignRight;
}
}
public void setValue(int x,int y,string text)
{
Excel.Range range=sheet.get_Range(this.GetAix(x,y),miss);
range.set_Value(miss,text);
}
public void setValue(int x,int y,string text,System.Drawing.Font font,System.Drawing.Color color)
{
this.setValue(x,y,text);
Excel.Range range=sheet.get_Range(this.GetAix(x,y),miss);
range.Font.Size=font.Size;
range.Font.Bold=font.Bold;
range.Font.Color=color;
range.Font.Name=font.Name;
range.Font.Italic=font.Italic;
range.Font.Underline=font.Underline;
}

public void insertRow(int y)
{
Excel.Range range=sheet.get_Range(GetAix(1,y),GetAix(25,y));
range.Copy(miss);
range.Insert(Excel.XlDirection.xlDown,miss);
range.get_Range(GetAix(1,y),GetAix(25,y));
range.Select();
sheet.Paste(miss,miss);

}
public void past()
{
string s="a,b,c,d,e,f,g";
sheet.Paste(sheet.get_Range(this.GetAix(10,10),miss),s);
}
public void setBorder(int x1,int y1,int x2,int y2,int Width)
{
Excel.Range range=sheet.get_Range(this.GetAix(x1,y1),this.GetAix(x2,y2));
range.Borders.Weight=Width;
}
public void mergeCell(int x1,int y1,int x2,int y2)
{
Excel.Range range=sheet.get_Range(this.GetAix(x1,y1),this.GetAix(x2,y2));
range.Merge(true);
}

public Excel.Range getRange(int x1,int y1,int x2,int y2)
{
Excel.Range range=sheet.get_Range(this.GetAix(x1,y1),this.GetAix(x2,y2));
return range;
}

private Missing miss=Missing.Value; //忽略的参数OLENULL
public static Missing MissValue=Missing.Value;
private Excel.Application m_objExcel;//Excel应用程序实例
private Excel.Workbooks m_objBooks;//工作表集合
private Excel.Workbook m_objBook;//当前操作的工作表
private Excel.Worksheet sheet;//当前操作的表格

public Excel.Worksheet CurrentSheet
{
get
{
return sheet;
}
set
{
this.sheet=value;
}
}

public Excel.Workbooks CurrentWorkBooks
{
get
{
return this.m_objBooks;
}
set
{
this.m_objBooks=value;
}
}

public Excel.Workbook CurrentWorkBook
{
get
{
return this.m_objBook;
}
set
{
this.m_objBook=value;
}
}
public void OpenExcelFile(string filename)
{
m_objExcel = new Excel.Application();
UserControl(false);

m_objExcel.Workbooks.Open(
filename,
miss,
miss,
miss,
miss,
miss,
miss,
miss,
miss,
miss,
miss,
miss,
miss,
miss,
miss);

m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;

m_objBook = m_objExcel.ActiveWorkbook;
sheet = (Excel.Worksheet)m_objBook.ActiveSheet;
}
public void UserControl(bool usercontrol)
{
if(m_objExcel==null){return ;}
m_objExcel.UserControl=usercontrol;
m_objExcel.DisplayAlerts=usercontrol;
m_objExcel.Visible = usercontrol;
}
public void CreateExceFile()
{
m_objExcel = new Excel.Application();
UserControl(false);
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel.Workbook)(m_objBooks.Add(miss));
sheet = (Excel.Worksheet)m_objBook.ActiveSheet;
}
public void SaveAs(string FileName)
{
m_objBook.SaveAs(FileName, miss, miss, miss, miss,
miss, Excel.XlSaveAsAccessMode.xlNoChange,
Excel.XlSaveConflictResolution.xlLocalSessionChanges,
miss,miss, miss, miss);
//m_objBook.Close(false, miss, miss);
}
public void ReleaseExcel()
{
m_objExcel.Quit();
Marshal.ReleaseComObject(m_objExcel);
Marshal.ReleaseComObject(m_objBooks);
Marshal.ReleaseComObject(m_objBook);
Marshal.ReleaseComObject(sheet);
GC.Collect();
}
}

posted @ 2011-06-16 09:56  Happy Hu  Views(642)  Comments(0Edit  收藏  举报