none
GridView 导出到Excel 遇到了问题 RRS feed

  • 问题

  •     问题1:以下是我导出到Excel表的代码,然而我把ContractNumber格式改为HyperLinkField后,就只能导出其他,而不能导出ContractNumber的内容了(见图1),该如何修改呢?

        问题2:Excel表中有一些   

    能否在导出的时候就消除呢?  

    =======================前台===================

        //导入Excel表,通过扫描GridView的网格,而非直接读取SQL数据库
        protected void btnExport_Click(object sender, EventArgs e)
        {
            if (GridView_Search.Rows.Count == 0)
                return;
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
            excel.Application.Workbooks.Add(true);
            excel.Visible = true;
            for (int i = 0; i < GridView_Search.Columns.Count; i++)
            {
                excel.Cells[1, i + 1] = GridView_Search.Columns[i].HeaderText;
            }
            for (int i = 0; i < GridView_Search.Rows.Count; i++)
            {
                for (int j = 0; j < GridView_Search.Columns.Count; j++)
                {
                    excel.Cells[i + 2, j + 1] = GridView_Search.Rows[i].Cells[j].Text;
                }
            }
        }

    =======================后台=========================

    <asp:HyperLinkField HeaderText="合同编号" 
                                NavigateUrl="~/ContractTable/BrowserToContractManage.aspx"  
                                DataNavigateUrlFields="CID" 
                                DataNavigateUrlFormatString="~/ContractTable/BrowserToContractManage.aspx?CID={0}" 
                                DataTextField="Contractnumber" Target="_blank" 
                                SortExpression="ContractNumber" >
                            <ControlStyle Font-Size="Small" Width="110px" />
                            <FooterStyle Font-Size="Small" Width="110px" Wrap="True" />
                            <HeaderStyle Font-Size="Small" Width="110px" Wrap="True" />
                            <ItemStyle Font-Size="Small" Width="110px" Wrap="True" />
                            </asp:HyperLinkField>
    ==========================图1========================

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。



    2014年12月3日 4:01

答案

  • 您好,
    要判斷 Count > 0 ,再check 是否為 HyperLink哦! 如下,
    for (int i = 0; i < GridView_Search.Columns.Count; i++)
    {
       string hText =  GridView_Search.Columns[i].HeaderText;
    }
    for (int i = 0; i < GridView_Search.Rows.Count; i++)
    {
    	for (int j = 0; j < GridView_Search.Columns.Count; j++)
    	{
    		string cellValue = string.Empty;
    		if (GridView_Search.Rows[i].Cells[j].Controls.Count > 0)
    		{
    			if (GridView_Search.Rows[i].Cells[j].Controls[0] is HyperLink)
    			{
    				cellValue = ((HyperLink)GridView_Search.Rows[i].Cells[j].Controls[0]).Text;
    			}
    			else
    			{
    				//maybe have other template field ....
    			}
    		}
    		else
    		{
    			cellValue = GridView_Search.Rows[i].Cells[j].Text.Replace("&nbsp;", " ");
    		}
    		excel.Cells[i + 2, j + 1]  = cellValue;
    	}
    }


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年12月8日 2:58

全部回复

  • 您好,
    1.如果是 HyperLinkField 的話,取值要用
    ((HyperLink)GridView_Search.Rows[i].Cells[合同编号columnindex].Controls[0]).Text

    2.您可以值接置換掉&nbsp;,或是用Template 放Label去取得 Label的Text值,
    可參考:取DataGrid的Cell的Text值,DB中沒有值,但實際它的值是 &nbsp;


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年12月3日 5:53
  •     还未来得及测试,不好意思,但看您"1"中的代码,是否还要加上判断语句呢,先判断它格式是否为HyperLink?因为我只有那一列是HyperLink。

        具体我不知道该怎么写,如何循环呢?

    问题2,也要加入判断吧?


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。


    2014年12月4日 1:19
  • 你好,

    如果你的页面中包含HyperLink,在你导出Excel时,需要获取控件的值。

    你可以参考下面的链接:

    http://forums.asp.net/t/1255489.aspx?Export+a+GridView+to+Excel+C+

    http://www.c-sharpcorner.com/UploadFile/DipalChoksi/exportxl_asp2_dc11032006003657AM/exportxl_asp2_dc.aspx

    2014年12月4日 2:23
  •     问题1:我加了一个格式判断,但还是老样子。

        问题2:我用了个笨办法,可以把 消除了。

        还需要继续求教问题1 啊,谢谢各位

    =========================代码=========================

    for (int i = 0; i < GridView_Search.Columns.Count; i++)
            {
                excel.Cells[1, i + 1] = GridView_Search.Columns[i].HeaderText;
            }
            for (int i = 0; i < GridView_Search.Rows.Count; i++)
            {
                for (int j = 0; j < GridView_Search.Columns.Count; j++)
                {
                    if (GridView_Search.Rows[i].Cells[j].GetType() == typeof(HyperLink))
                    {
                        excel.Cells[i + 2, j + 1] = ((HyperLink)GridView_Search.Rows[i].Cells[j].Controls[0]).Text;
                    }
                    else
                    {
                        if (GridView_Search.Rows[i].Cells[j].Text == "&nbsp;")
                        {excel.Cells[i + 2, j + 1] ="";}
                        else
                        {excel.Cells[i + 2, j + 1] = GridView_Search.Rows[i].Cells[j].Text;}
                    }
                }
            }

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。



    2014年12月5日 2:22
  • 您好,
    要判斷 Count > 0 ,再check 是否為 HyperLink哦! 如下,
    for (int i = 0; i < GridView_Search.Columns.Count; i++)
    {
       string hText =  GridView_Search.Columns[i].HeaderText;
    }
    for (int i = 0; i < GridView_Search.Rows.Count; i++)
    {
    	for (int j = 0; j < GridView_Search.Columns.Count; j++)
    	{
    		string cellValue = string.Empty;
    		if (GridView_Search.Rows[i].Cells[j].Controls.Count > 0)
    		{
    			if (GridView_Search.Rows[i].Cells[j].Controls[0] is HyperLink)
    			{
    				cellValue = ((HyperLink)GridView_Search.Rows[i].Cells[j].Controls[0]).Text;
    			}
    			else
    			{
    				//maybe have other template field ....
    			}
    		}
    		else
    		{
    			cellValue = GridView_Search.Rows[i].Cells[j].Text.Replace("&nbsp;", " ");
    		}
    		excel.Cells[i + 2, j + 1]  = cellValue;
    	}
    }


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年12月8日 2:58
  •     谢谢!原来Controls 也要加入一个判断。

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。

    2014年12月8日 8:47