webabcd - 专注于asp.net, Silverlight

ASP.NET
从现在开始 一切都不晚
posts - 205, comments - 5697, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[索引页]
[源码下载]


扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text


作者:webabcd


/*正式版的实现 开始*/

介绍
扩展GridView控件:
导出数据源的数据为Excel、Word或Text(应保证数据源的类型为DataTable或DataSet)

使用方法:
为SmartGridView添加的方法
Export(string fileName)
Export(string fileName, ExportFormat exportFormat)
Export(string fileName, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, int[] columnIndexList, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, int[] columnIndexList, string[] headers, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, string[] columnNameList, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, string[] columnNameList, string[] headers, ExportFormat exportFormat, Encoding encoding)



关键代码
using System;
using System.Collections.Generic;
using System.Text;

using System.Data;
using System.Web.UI.WebControls;

namespace YYControls
{
    
/// <summary>
    
/// SmartGridView类的属性部分
    
/// </summary>

    public partial class SmartGridView
    
{
        
/// <summary>
        
/// 导出SmartGridView的数据源的数据
        
/// </summary>
        
/// <param name="fileName">文件名</param>
        
/// <param name="exportFormat">导出文件的格式</param>
        
/// <param name="encoding">编码</param>

        public void Export(string fileName, ExportFormat exportFormat, Encoding encoding)
        
{
            DataTable dt 
= GetDataTable();
            Helper.Common.Export(dt, exportFormat, fileName, encoding);
        }


        
/// <summary>
        
/// 导出SmartGridView的数据源的数据
        
/// </summary>
        
/// <param name="fileName">文件名</param>
        
/// <param name="exportFormat">导出文件的格式</param>

        public void Export(string fileName, ExportFormat exportFormat)
        
{
            Export(fileName, exportFormat, Encoding.GetEncoding(
"GB2312"));
        }


        
/// <summary>
        
/// 导出SmartGridView的数据源的数据为Excel
        
/// </summary>
        
/// <param name="fileName">文件名</param>

        public void Export(string fileName)
        
{
            Export(fileName, ExportFormat.CSV);
        }


        
/// <summary>
        
/// 导出SmartGridView的数据源的数据
        
/// </summary>
        
/// <param name="fileName">输出文件名</param>
        
/// <param name="columnIndexList">导出的列索引数组</param>
        
/// <param name="exportFormat">导出文件的格式</param>
        
/// <param name="encoding">编码</param>

        public void Export(string fileName,int[] columnIndexList, ExportFormat exportFormat, Encoding encoding)
        
{
            DataTable dt 
= GetDataTable();

            Helper.Common.Export(dt, columnIndexList, exportFormat, fileName, encoding);
        }


        
/// <summary>
        
/// 导出SmartGridView的数据源的数据
        
/// </summary>
        
/// <param name="fileName">输出文件名</param>
        
/// <param name="columnNameList">导出的列的列名数组</param>
        
/// <param name="exportFormat">导出文件的格式</param>
        
/// <param name="encoding">编码</param>

        public void Export(string fileName, string[] columnNameList, ExportFormat exportFormat, Encoding encoding)
        
{
            DataTable dt 
= GetDataTable();

            Helper.Common.Export(dt, columnNameList, exportFormat, fileName, encoding);
        }


        
/// <summary>
        
/// 导出SmartGridView的数据源的数据
        
/// </summary>
        
/// <param name="fileName">输出文件名</param>
        
/// <param name="columnIndexList">导出的列索引数组</param>
        
/// <param name="headers">导出的列标题数组</param>
        
/// <param name="exportFormat">导出文件的格式</param>
        
/// <param name="encoding">编码</param>

        public void Export(string fileName, int[] columnIndexList, string[] headers, ExportFormat exportFormat, Encoding encoding)
        
{
            DataTable dt 
= GetDataTable();

            Helper.Common.Export(dt, columnIndexList, headers, exportFormat, fileName, encoding);
        }


        
/// <summary>
        
/// 导出SmartGridView的数据源的数据
        
/// </summary>
        
/// <param name="fileName">输出文件名</param>
        
/// <param name="columnNameList">导出的列的列名数组</param>
        
/// <param name="headers">导出的列标题数组</param>
        
/// <param name="exportFormat">导出文件的格式</param>
        
/// <param name="encoding">编码</param>

        public void Export(string fileName, string[] columnNameList, string[] headers, ExportFormat exportFormat, Encoding encoding)
        
{
            DataTable dt 
= GetDataTable();

            Helper.Common.Export(dt, columnNameList, headers, exportFormat, fileName, encoding);
        }


        
/// <summary>
        
/// 获取数据源(DataTable)
        
/// </summary>

        private DataTable GetDataTable()
        
{
            DataTable dt 
= null;

            
if (this._dataSourceObject is DataTable)
                dt 
= (DataTable)this._dataSourceObject;
            
else if (this._dataSourceObject is DataSet)
                dt 
= ((DataSet)this._dataSourceObject).Tables[0];
            
else
                
throw new InvalidCastException("若要导出SmartGridView,应保证其数据源为DataTable或DataSet类型");

            
if (dt == null)
                
throw new ArgumentNullException("数据源""数据源不能为NULL");

            
return dt;
        }

    }

}


/*正式版的实现 结束*/


/*测试版的实现 开始*/

介绍
把GridView导出为一个Excel文件算是一个经常要用到的功能,也比较简单,我们来扩展一个GridView以实现这样的功能。


控件开发
1、新建一个继承自GridView的类。
/// <summary>
/// 继承自GridView
/// </summary>

[ToolboxData(@"<{0}:SmartGridView runat='server'></{0}:SmartGridView>")]
public class SmartGridView : GridView
{
}

2、重写OnRowCommand,以实现把GridView导出为Excel的功能
        /// <summary>
        
/// OnRowCommand
        
/// </summary>
        
/// <param name="e"></param>

        protected override void OnRowCommand(GridViewCommandEventArgs e)
        
{
            
if (e.CommandName.ToLower() == "exporttoexcel")
            
{
                System.Web.HttpContext.Current.Response.ClearContent();
                
// e.CommandArgument用“;”隔开两部分,左边的部分为导出Excel的文件名称
                System.Web.HttpContext.Current.Response.AddHeader("content-disposition""attachment; filename=" + e.CommandArgument.ToString().Split(';')[0+ ".xls");
                System.Web.HttpContext.Current.Response.ContentType 
= "application/excel";

                System.IO.StringWriter sw 
= new System.IO.StringWriter();
                HtmlTextWriter htw 
= new HtmlTextWriter(sw);

                
// e.CommandArgument用“;”隔开两部分,右边的部分为需要隐藏的列的索引(列索引用“,”分开)
                if (e.CommandArgument.ToString().Split(';').Length > 1)
                
{
                    
foreach (string s in e.CommandArgument.ToString().Split(';')[1].Split(','))
                    
{
                        
int i;

                        
if (!Int32.TryParse(s, out i))
                        
{
                            
throw new ArgumentException("需要隐藏的列的索引不是整数"); 
                        }


                        
if (i > this.Columns.Count)
                        
{
                            
throw new ArgumentOutOfRangeException("需要隐藏的列的索引超出范围");
                        }


                        
this.Columns[i].Visible = false;
                    }

                }


                
// 隐藏“导出Excel”按钮
                ((Control)e.CommandSource).Visible = false;

                
// 如果HeaderRow里的控件是button的话,则把它替换成文本
                foreach (TableCell tc in this.HeaderRow.Cells)
                
{
                    
// TableCell里的每个Control
                    foreach (Control c in tc.Controls)
                    
{
                        
// 如果控件继承自接口IButtonControl
                        if (c.GetType().GetInterface("IButtonControl"!= null && c.GetType().GetInterface("IButtonControl").Equals(typeof(IButtonControl)))
                        
{
                            
// 如果该控件不是“导出Excel”按钮则把button转换成文本
                            if (!c.Equals(e.CommandSource))
                            
{
                                tc.Controls.Clear();
                                tc.Text 
= ((IButtonControl)c).Text;
                            }

                        }

                    }

                }


                
// 将服务器控件的内容输出到所提供的 System.Web.UI.HtmlTextWriter 对象中
                this.RenderControl(htw);

                System.Web.HttpContext.Current.Response.Write(sw.ToString());
                System.Web.HttpContext.Current.Response.End();
            }


            
base.OnRowCommand(e);
        }



控件使用
添加这个控件到工具箱里,然后拖拽到webform上,在GridView内加一个按钮,把CommandName属性设置为“ExportToExcel”,CommandArgument属性的值用“;”做分隔符分为两部分,左边的部分为导出Excel的文件名称,右边的部分为需要隐藏的列的索引(列索引用“,”分开)
ObjData.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.ComponentModel;

/// <summary>
/// OjbData 的摘要说明
/// </summary>

public class OjbData
{
    
public OjbData()
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }


    [DataObjectMethod(DataObjectMethodType.Select, 
true)]
    
public DataTable Select()
    
{
        DataTable dt 
= new DataTable();
        dt.Columns.Add(
"no"typeof(string));
        dt.Columns.Add(
"name"typeof(string));

        
for (int i = 0; i < 30; i++)
        
{
            DataRow dr 
= dt.NewRow();
            dr[
0= "no" + i.ToString().PadLeft(2'0');
            dr[
1= "name" + i.ToString().PadLeft(2'0');

            dt.Rows.Add(dr);
        }


        
return dt;
    }

}


Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    
<title>SmartGridView测试</title>
</head>
<body>
    
<form id="form1" runat="server">
        
<div>
            
<yyc:SmartGridView ID="SmartGridView1" runat="server" AutoGenerateColumns="False"
                DataSourceID
="ObjectDataSource1">
                
<Columns>
                    
<asp:TemplateField ItemStyle-Width="50px">
                        
<headertemplate>
                            
<asp:Button id="btnExportToExcel" runat="server" Text="Excel" CommandName="ExportToExcel" CommandArgument="ExcelFileName;5,6" />
                        
</headertemplate>
                        
<itemtemplate>
                            
<%# Container.DataItemIndex + 1 %>
                        
</itemtemplate>
                    
</asp:TemplateField>
                    
<asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" ItemStyle-Width="100px" />
                    
<asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" ItemStyle-Width="100px" />
                    
<asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" ItemStyle-Width="100px" />
                    
<asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" ItemStyle-Width="100px" />
                    
<asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" ItemStyle-Width="100px" />
                    
<asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" ItemStyle-Width="100px" />
                
</Columns>
            
</yyc:SmartGridView>
            
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Select"
                TypeName
="OjbData"></asp:ObjectDataSource>
        
</div>
    
</form>
</body>
</html>

注:为了防止出错要在.cs代码中加上下面这句
public override void VerifyRenderingInServerForm(Control control)
    
{

    }

另外,如果你的GridView中含有命令按钮的话要在.aspx页面的头部中加上下面这个属性
EnableEventValidation="false"

/*测试版的实现 结束*/


OK
[源码下载]

Feedback

评论共2页: 上一页 1 2 

#101楼   回复  引用    

2007-01-29 21:52 by ivw[未注册用户]
我刚做了个用datatable导出Excel的功能,但还是以对话框的形式找开,问是保存还是打开的,这种方法可能不能在showModalDialog窗口模式导出。

#102楼   回复  引用    

2007-01-29 21:53 by ivw[未注册用户]
如果传到新的页面里导出,能把datatable转过去吗?还是在新页面重新select一次啊?

#103楼   回复  引用    

2007-01-29 22:36 by 老刘[未注册用户]
我用C#.NET写了个系统,目前能简单地把datagrid中的数据导出为Excel格式。但是,我想按企业要求的格式导出,例如页眉有企业名称,页脚有联系人,该怎么办啊?通宵在线等,急!!!请邮qiaohui@gdqy.edu.cn。叩谢!

#104楼[楼主]   回复  引用  查看    

2007-01-29 22:59 by webabcd      
@ivw
我试了,可以在showModalDialog窗口模式中导出

如果传到新的页面里导出,那就在新页面重新select一次,或者用session之类的传值

#105楼[楼主]   回复  引用  查看    

2007-01-29 23:08 by webabcd      
@老刘
简单的生成excel的方法就是把一个table转成excel,因为大家其实都是表格,只要你能用在网页中用table展现的就能Response出相应的excel

如果需要一些高级应用可以在项目中引入Excel的对象库Excel9.olb,也可以把它转成dll引入,然后对excel进行操作即可

详细的请参看
http://www.microsoft.com/downloads/details.aspx?familyid=401878B1-E03A-4FDC-8079-4344D574313B&displaylang=en
提供的示例程序

#106楼   回复  引用    

2007-01-30 10:49 by ivw[未注册用户]
你用的是什么办法啊?可以告诉吗?

#107楼[楼主]   回复  引用  查看    

2007-01-30 11:53 by webabcd      
@ivw
我用的就是源码里写的那种方法啊

#108楼   回复  引用    

2007-01-30 14:17 by ivw[未注册用户]
为什么 我试用Response 不能导出呢?

#109楼   回复  引用    

2007-01-30 14:33 by ivw[未注册用户]
我想在Render里的层下面加多一个分页栏,但不知为什么定义的控件事件不能调用,是什么原因啊?

private ImageButton imb = new ImageButton();


Label la = new Label();

la.CssClass = "t_label";
writer.Write("<span>");
la.Text = "总页数:"+pageCount+"";
la.RenderControl(writer);
     imb.RenderControl(writer);
imb.Click += new ImageClickEventHandler(imb_Click);
writer.write("</span>");

大概是这样,后面定义了imb_click的事件,但不知为什么在运行时不能调用这事件。

#110楼[楼主]   回复  引用  查看    

2007-01-30 15:01 by webabcd      
@ivw
我也不晓得你为啥导不出啊

你是要重写GridView的分页吗?那应该重写OnRowCreated

下个礼拜我会把分页重写一遍发上来的,你可以参考一下

#111楼   回复  引用    

2007-01-30 15:20 by ivw[未注册用户]
重写已经做好了,没问题,我是想在层的下面加多一个,这样就不怕滚动时看不到分页栏了。

#112楼[楼主]   回复  引用  查看    

2007-01-30 15:24 by webabcd      
@ivw
那就把分页写到GridView的外面,不就好了

#113楼   回复  引用    

2007-01-30 15:31 by ivw[未注册用户]
是啊,我想在Render里的层下面加多一个分页栏,但是不知为什么里面的按钮调用不了事件

#114楼[楼主]   回复  引用  查看    

2007-01-30 15:43 by webabcd      
@ivw
用不了是因为Render就管呈现啊

要加事件的话要在OnRowCreated里加啊

#115楼   回复  引用    

2007-01-30 15:54 by ivw[未注册用户]
那我想把新的分页栏放到层的下面啊,不是在Page里啊。在OnRowCreated里添加一样可以吗?

#116楼[楼主]   回复  引用  查看    

2007-01-30 16:11 by webabcd      
@ivw
如果想增加事件处理的话,肯定要写在OnRowCreated里的

还是不太明白你想实现什么效果?

#117楼   回复  引用    

2007-01-30 16:36 by ivw[未注册用户]
你不是在gridview外面加了一个层吗?如果在校准的分页栏(Page)里自定义分页,那么你就要把滚动条拉到最下面才能看到分页栏,我是想在层的外面新加一条分页栏,就不用滚动到最下面才能看到分页啦。这不是更方便吗?

#118楼[楼主]   回复  引用  查看    

2007-01-30 17:20 by webabcd      
@ivw
ok 明白
那就需要把分页写到GridView的外面
因为为了实现冻结列和冻结行,我把整个GridView都包含到一个<div>下了

#119楼   回复  引用    

2007-01-30 17:25 by ivw[未注册用户]
是啊,如果不加滚动,冻结就变得没意义了,所以我开始问你的就是这个问题,新定义一个分页栏放到div下面,再加上首页,上一页,等功能,但我自己做的就是能加上这些,就是加上的按钮不能执行定义的事件。Q有上线吗?我发给你看看

#120楼[楼主]   回复  引用  查看    

2007-01-30 17:50 by webabcd      
@ivw
现在我这里q和msn都上不去啊,不知道啥问题

如果没理解错,你想实现的就是GridView的自定义分页的功能
google or baidu一下

gridview自定义分页

有好多信息

#121楼   回复  引用    

2007-01-30 17:59 by ivw[未注册用户]
查过,没找到想要的,你有做过在div外面加一条分页栏吗?

#122楼[楼主]   回复  引用  查看    

2007-01-30 18:06 by webabcd      
@ivw
看看这位兄弟写的
http://www.cnblogs.com/landina/articles/441843.html">http://www.cnblogs.com/landina/articles/441843.html

#123楼   回复  引用    

2007-01-30 18:12 by ivw[未注册用户]
这个看过啊,如果在后台写自定义分页就很简单,但如果把这功能集成到你这个gridview控件里就出现我刚问你的问题了。

#124楼[楼主]   回复  引用  查看    

2007-01-30 22:08 by webabcd      
@ivw
如果想写成控件的话,不要放到GridView里

而是要单独再开发一个分页控件

#125楼   回复  引用    

2007-01-30 22:21 by ivw[未注册用户]
不能把它放到div外面,集成在一起吗

#126楼[楼主]   回复  引用  查看    

2007-01-30 23:00 by webabcd      
@ivw
放在div外就意味着要放在GridView外,所以应该是两个控件,等我把这个GridView扩展写完后,打算再写一个分页控件,到时候你可以参考一下

#127楼   回复  引用    

2007-01-31 00:08 by ivw[未注册用户]
但我看到过一些封好的grid控件,分页都是在滚动条外面的。而且他们都是集成在一个控件,还有就是不用另外拉个数据源出来,我想已经集成了。不知用什么办法实现的呢?你有试过吗?

#128楼[楼主]   回复  引用  查看    

2007-01-31 12:05 by webabcd      
@ivw
没见过阿,不过应该是重新开发的grid控件吧,而不是从DataGrid或GridView扩展出来的吧

#129楼   回复  引用    

2007-01-31 15:14 by ivw[未注册用户]
这个不清楚了,但有些不用数据源直接拉控件进来能用的自定义grid不知道是不是把数据源控件也加进去呢?

#130楼[楼主]   回复  引用  查看    

2007-01-31 17:30 by webabcd      
@ivw
不用数据源控件,至少也要有数据源阿,就是DataSet或DataTable之类的这些实现了IListSource、IEnumerable或ICollection接口的类的实例,然后绑定到grid控件

#131楼   回复  引用    

2007-01-31 17:50 by ivw[未注册用户]
你有这方面的例子可以给我作个参考吗?谢谢了

#132楼   回复  引用  查看    

2007-01-31 19:39 by 志扬      
功能越来越强大,支持,无法不支持!

#133楼[楼主]   回复  引用  查看    

2007-01-31 21:57 by webabcd      
@ivw
我没有啊,我所想到的办法就只有再做一个分页控件,而且我觉得把分页功能单独做成一个控件比较好,通用性高,能Bind的控件就可以使用分页控件,另外如果分页控件是基于存储过程的话,效率也会很高的。

#134楼[楼主]   回复  引用  查看    

2007-01-31 21:58 by webabcd      
@志扬
:)
估计再扩展两个功能,就结了

#135楼   回复  引用    

2007-02-01 09:21 by ivw[未注册用户]
我昨天做了个分页的控件,不过不是用存储过程的。你下会做一个用存储过程的好吗?好让大家做个参考。

#136楼[楼主]   回复  引用  查看    

2007-02-01 09:28 by webabcd      
@ivw
肯定会的

#137楼   回复  引用    

2007-02-01 14:56 by ivw[未注册用户]
请问你知道怎样把ObjectDataSource之类的控件或gridview的DataSource转成一个datatable吗

#138楼   回复  引用    

2007-02-01 16:15 by ivw[未注册用户]
我发现用ObjectDataSource做数据源时同一个sql语句执行了12次,为什么呢?

#139楼[楼主]   回复  引用  查看    

2007-02-01 17:21 by webabcd      
@ivw
把数据源转成DataTable?那要看是什么数据源了,数据源要是DataSet,DataTable就好说了,要是其他的就遍历一下数据源然后赋值给你新建的DataTable里


“我发现用ObjectDataSource做数据源时同一个sql语句执行了12次”
我没这问题呀,是不是你多次绑定了?

#140楼   回复  引用    

2007-02-01 17:30 by ivw[未注册用户]
我现在用的方法是,把ObjectDataSourceg再Select()一次来保存成datatable,觉得这方法不太好。


会出现多次绑定的吗?我在代码里没进行过绑定啊?我在page_load里没写过代码啊,在监视器发现他执行了12次,中断看也是一样。

#141楼[楼主]   回复  引用  查看    

2007-02-01 17:43 by webabcd      
@ivw
我这里做的是ObjectDataSource的select指向一个返回datatable的方法,所以直接调这个方法就可以了

不晓得你的是什么问题啊,我这里只是一次

#142楼   回复  引用    

2007-02-01 17:50 by ivw[未注册用户]
你有中断看过吗?
我在数据源里加了个参数。
<SelectParameters>
<asp:Parameter DefaultValue="select * from test" Name="sqltxt" />
</SelectParameters>

但我在中断里看他执行select() 12次,真不知什么原因

#143楼[楼主]   回复  引用  查看    

2007-02-01 22:23 by webabcd      
@ivw
你用SqlDataSource吗?我只用ObjectDataSource,不过我觉得应该不会执行12次的

#144楼   回复  引用    

2007-02-01 22:35 by ivw[未注册用户]
我也是用ObjectDataSource啊。

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Select"
TypeName="OjbData" OnSelected="ObjectDataSource1_Selected">
<SelectParameters>
<asp:Parameter DefaultValue="select * from test" Name="sqltxt" />
</SelectParameters>
</asp:ObjectDataSource>

#145楼[楼主]   回复  引用  查看    

2007-02-01 22:41 by webabcd      
@ivw
我不明白为什么会有这句DefaultValue="select * from test"
难道你中间层的select方法里用sql语句做参数?

#146楼   回复  引用    

2007-02-01 22:43 by ivw[未注册用户]
这个是默认的sql语句啊,sqltxt是名,我在select(string sql)加了个变量,用来改变控件绑定的sql数据啊?这有问题?

#147楼[楼主]   回复  引用  查看    

2007-02-01 22:46 by webabcd      
@ivw
兄弟看看这个系列文章吧
http://www.asp.net/learn/dataaccess/default.aspx?tabid=63">http://www.asp.net/learn/dataaccess/default.aspx?tabid=63

园子里好像有人汉化,不过我忘了地址了

#148楼   回复  引用    

2007-02-01 22:53 by ivw[未注册用户]
晕了。全是英文。。。

#149楼[楼主]   回复  引用  查看    

2007-02-01 22:56 by webabcd      
@ivw
:)
我记得园子里是有人翻译的,你可以搜一下

#150楼   回复  引用    

2007-02-01 22:57 by ivw[未注册用户]
在那个园子搜索啊,关键字是什么呢?

#151楼[楼主]   回复  引用  查看    

2007-02-01 22:59 by webabcd      
@ivw
我找到了
http://www.cnblogs.com/lovecherry/archive/2006/07/02/440840.html">http://www.cnblogs.com/lovecherry/archive/2006/07/02/440840.html

#152楼   回复  引用    

2007-02-01 23:11 by ivw[未注册用户]
谢谢了啊,我是不是用错了这个控件?

#153楼[楼主]   回复  引用  查看    

2007-02-02 09:47 by webabcd      
@ivw
感觉像是,仔细看看那篇系列教程吧,写得很好

#154楼   回复  引用    

2007-02-08 10:48 by 4color[未注册用户]
我在另一个页面用gridview显示数据,把头部设置成excel格式
可以导出,但数据少这个excel文件可以打开,但数据一多,就显示“读取文件失败”,这是为什么呢,老郁闷了!!

Response.Clear();
Response.Buffer = true;
Response.Charset = "utf-8";
Response.AppendHeader("Content-Disposition", "attachment;filename=AddValueExport.xls");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
Response.ContentType = "application/ms-excel";

#155楼[楼主]   回复  引用  查看    

2007-02-08 11:21 by webabcd      
@4color
excel最大可以有65536条

#156楼   回复  引用  查看    

2007-07-17 18:21 by 吾爱乐乐      
你好,我按照你的方法设置,但是总是报错
说“必须放在具有 runat=server 的窗体标记内”
行 831:
行 832: // 将服务器控件的内容输出到所提供的 System.Web.UI.HtmlTextWriter 对象中
行 833: this.RenderControl(htw);
行 834:
行 835: System.Web.HttpContext.Current.Response.Write(sw.ToString());
请问是什么原因呢?
谢谢

#157楼[楼主]   回复  引用  查看    

2007-07-17 19:07 by webabcd      
@吾爱乐乐
是这样的

为了防止出错要在.cs代码中加上下面这句
public override void VerifyRenderingInServerForm(Control control)
{

}

另外,如果你的GridView中含有命令按钮的话要在.aspx页面的头部中加上下面这个属性
EnableEventValidation="false"

#158楼   回复  引用    

2007-09-23 19:45 by nbshiny[未注册用户]
为什么我的数据源应用的是objectdatasource,但是在导出excel表的时候,提示说“若要导出SmartGridView,应保证其数据源为DataTable或DataSet类型”不知道,为什么会有这个错误,我现在公布我的代码如下:aspx代码如下
<form id="form1" runat="server">
<div style="margin: 5px 0px">
<asp:Button ID="btnExcel" runat="server" Text="导出为Excel" CommandName="ExportExcel"
OnCommand="btn_Command" />
<asp:Button ID="btnWord" runat="server" Text="导出为Word" CommandName="ExportWord" OnCommand="btn_Command" />
<asp:Button ID="btnText" runat="server" Text="导出为Text" CommandName="ExportText" OnCommand="btn_Command" />&nbsp;
</div>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="dt" TypeName="objds">
</asp:ObjectDataSource>
&nbsp;
<yyc:SmartGridView ID="sgv1" runat="server" AllowSorting="True" DataSourceID="ObjectDataSource1">
</yyc:SmartGridView>

</form>

aspx.cs代码如下:
protected void Page_Load(object sender, EventArgs e)
{

}
protected void btn_Command(object sender, CommandEventArgs e)
{
switch (e.CommandName)
{
case "ExportExcel":
sgv1.Export("excel");
break;
case "ExportWord":
sgv1.Export("word", YYControls.ExportFormat.DOC);
break;
case "ExportText":
sgv1.Export("text", YYControls.ExportFormat.TXT);
break;
}
}
public override void VerifyRenderingInServerForm(Control control)
{

}
版主,帮我看看吧。

#159楼[楼主]   回复  引用  查看    

2007-09-24 08:04 by webabcd      
@nbshiny
要先绑定,再导出
或者看看我提供的几个方法
YYControls.Helper.Common类下的
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)

传进DataTable就可以导出

#160楼   回复  引用    

2007-11-01 19:17 by czw[未注册用户]
怎样用.net导出word文档,并且,格式不变,导出之后的word文档上的label控件都隐藏起来!

#161楼[楼主]   回复  引用  查看    

2007-11-02 08:33 by webabcd      
@czw
那就要借助VSTO了

#162楼   回复  引用    

2007-12-05 22:25 by chong[未注册用户]
我也遇到象 nbshiny 的导出错误/
你说看
YYControls.Helper.Common类下的
Export()的方法,就是说要我们修改以下按纽的传递参数吗?
protected void btn_Command(object sender, CommandEventArgs e)
{
switch (e.CommandName)
{
case "ExportExcel":
sgv1.Export("excel");
break;
case "ExportWord":
sgv1.Export("word", YYControls.ExportFormat.DOC);
break;
case "ExportText":
sgv1.Export("text", YYControls.ExportFormat.TXT);
break;
}
}

#163楼   回复  引用    

2007-12-05 22:28 by chong[未注册用户]
为什么一定要用objectdatasource控件吗?
我这样子在后面绑定数据,好象那些导出文档不行.
this.SmartGridView1.DataSource = ds.Tables[0];
this.SmartGridView1.DataBind();

#164楼[楼主]   回复  引用  查看    

2007-12-06 08:08 by webabcd      
@chong
要先绑定,才能导出,因为是全数据集导出,如果不绑定就不知道数据源
如果不想绑定的话就用我提供的相关方法,把数据源传进去
不是要修改按钮的传递参数,而是要修改导出的方法
将导出的方法替换成我在YYControls.Helper.Common类中提供的用于导出的方法

基于分页、排序之类的功能是需要数据源控件支持的
导出这块可以不用数据源控件

建议你做导出的时候用YYControls.Helper.Common类中的关于导出的方法

#165楼   回复  引用    

2007-12-06 11:13 by 8[未注册用户]
--引用--------------------------------------------------
webabcd: @chong
要先绑定,才能导出,因为是全数据集导出,如果不绑定就不知道数据源
如果不想绑定的话就用我提供的相关方法,把数据源传进去
不是要修改按钮的传递参数,而是要修改导出的方法
将导出的方法替换成我在YYControls.Helper.Common类中提供的用于导出的方法

基于分页、排序之类的功能是需要数据源控件支持的
导出这块可以不用数据源控件

建议你做导出的时候用YYControls.Helper.Common类中的关于导出的方法
--------------------------------------------------------

#166楼[楼主]   回复  引用  查看    

2007-12-06 13:32 by webabcd      
@8
???啥意思???

#167楼   回复  引用  查看    

2008-02-24 23:19 by jeems      
楼主,你好,我刚学.net不久,还不太看的懂,现在需要一个dataset导出到excel方法,你能单独提供自这么一个方法吗?谢谢
正式版中导出excel很完美,很想学习这个方法,就是不懂得如何从这个例子里提炼出拉来,楼主帮帮忙啦

#168楼[楼主]   回复  引用  查看    

2008-02-25 08:06 by webabcd      
@jeems
YYControls.Helper.Common类下的
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)

#169楼   回复  引用    

2008-02-27 08:39 by yxb[未注册用户]
楼主你好,我想把gridview的数据导出文本文件,字段之间用逗号分开,就是不懂得如何从这个例子里提炼出拉来,楼主帮帮忙啦
谢谢

#170楼[楼主]   回复  引用  查看    

2008-02-27 12:41 by webabcd      
@yxb
在YYControls.Helper.Common类里已经封装好了,拿出来就可以用

#171楼   回复  引用  查看    

2008-05-29 16:54 by libai      
楼主 关于数据源的问题,如果GridView的数据源不用数据源控件,而是在后台代码里用代码绑定,那如何在是控件里能获得数据源 再导出Excel呢?

#172楼   回复  引用  查看    

2008-05-29 16:57 by libai      
楼主 关于数据源的问题,如果GridView的数据源不用数据源控件,而是在后台代码里用代码l来绑定,那如何在是控件里能获得数据源 再导出Excel呢?

#173楼[楼主]   回复  引用  查看    

2008-05-29 18:31 by webabcd      
@libai
可以使用
YYControls.Helper.Common类下的
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)
这几个方法

#174楼   回复  引用  查看    

2008-05-30 10:23 by libai      
谢谢楼主,不过这几个方法首先要获得数据源,我现在在获得数据源有点问题,因为不是用数据源控件来给GridView绑定,而是在后台方法里给GridView指定DataSource,再DataBind(),不用这段代码ObjectDataSource ods = this.Parent.FindControl(this.DataSourceID) as ObjectDataSource;
那么现在的问题就是获得不到数据源,刚开始学控件开发,可能这些细节不了解,有时间给点建议,谢谢!

#175楼[楼主]   回复  引用  查看    

2008-05-30 12:57 by webabcd      
@libai
肯定是要知道数据源的,不然怎么导呢
既然能绑定GridView,那你肯定就是知道数据源的

#176楼   回复  引用  查看    

2008-06-27 16:00 by 火无极      
写了这么多,鼓励下

#177楼[楼主]   回复  引用  查看    

2008-06-27 19:05 by webabcd      
@火无极
:)
多谢

#178楼   回复  引用    

2008-07-20 12:23 by ℡农夫三拳㊣[未注册用户]
楼主,请问下啊:
为什么我绑定后在<Columns>。。</Columns>中指定了显示字段后,后面会把这个绑定的表中的数据再重复显示一次呢?
能不能把后面重复显示的去掉呢?

#179楼[楼主]   回复  引用  查看    

2008-07-21 07:31 by webabcd      
@℡农夫三拳㊣
设置
AutoGenerateColumns="false"

#180楼   回复  引用    

2008-08-11 16:33 by 6224409[未注册用户]
楼主:我遇到有这么一个问题:
我将GridView控件放到ajax中的updatepanel中,发现导出excel不可用,可能是由于response.write在ajax中不兼容,所以,我将导出按钮放在updatepanel外,但是点击导出时,GridView控件的_dataSourceObject为null,但是我在Page_load事件中将他的datasource进行赋值后就可以了,是不是控件的datasource每次刷新页面就没有了?
另外,在ajax中不能导出excel有什么好的解决办法?谢谢!!

#181楼[楼主]   回复  引用  查看    

2008-08-12 08:10 by webabcd      
@6224409
是的,要先绑定,才能导出
或者直接用方法
YYControls.Helper.Common类下的
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)

ajax的问题
可以把导出按钮放在UpdatePanel外

#182楼   回复  引用    

2008-08-12 10:40 by 6224409[未注册用户]
我的问题是为什么非得把绑定放在Page_load事件里才行,难道每次刷新,控件的datasource都为NULL了?

#183楼[楼主]   回复  引用  查看    

2008-08-12 18:39 by webabcd      
@6224409
不一定要在Page_Load啊
只要先绑定再导出即可,否则找不到数据源

#184楼   回复  引用  查看    

2008-11-27 16:47 by 徐.百川      
楼主幸苦了,写的很非常的好,好很实用
你的实例运行都好用,但是我写的和你一样
唯一一个功能导出 一运行就错误
“ 若要导出SmartGridView,应保证其数据源为DataTable或DataSet类型”
可是我的ObjectDataSource 指向的也是DataTable类型
不是到是为什么?

#185楼   回复  引用  查看    

2008-11-27 17:12 by 徐.百川      
上面我说错了
private DataTable GetDataTable()
{
DataTable dt = null;

if (this._dataSourceObject is DataTable)

我这是的this._dataSourceObject一直是null
可是我的ObjectDataSource 指向的也是DataTable类型
这是为什么呢
希望楼主帮助 谢谢

#186楼[楼主]   回复  引用  查看    

2008-11-27 18:48 by webabcd      
@徐.百川
从你提供的信息中看不出来啊
你可以一步一步跟一下程序,看看问题到底出在哪

另外,如果是用导出excel的话
可以用如下的方法即可
YYControls.Helper.Common类下的
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)

#187楼   回复  引用    

2008-11-28 11:53 by holyrong[未注册用户]
请教个问题,你的导出方法中,为什么要替换掉那些特殊字符??

input = input.Replace(" ", "_x0020_")
.Replace("%", "_x0025_")
.Replace("#", "_x0023_")
.Replace("&", "_x0026_")
.Replace("/", "_x002F_");

谢谢。

#188楼[楼主]   回复  引用  查看    

2008-11-28 12:09 by webabcd      
@holyrong
这个导出是通过xslt转换xml得出的
所以要替换掉xml特殊字符

#189楼   回复  引用    

2008-12-01 14:18 by holyrong[未注册用户]
再问个导出的问题:
如果导出的数据中有些是数字前面有0的怎么处理。
导出的csv文件用记事本打开是有0的,但用excel打开后就没有了,设置excel当列为 文本 也看不到 0.

#190楼[楼主]   回复  引用  查看    

2008-12-01 18:33 by webabcd      
@holyrong
以我所知csv文件的规则就是,每格都不能以"0"开头
所以没办法了。。。

#191楼[楼主]   回复  引用  查看    

2008-12-18 09:06 by webabcd      
@holyrong
昨天做梦,突然想到了
可以不导出csv,而是导出xls,然后设置样式
"<style> .text { mso-number-format:\@; } </script>"
即可

#192楼   回复  引用    

2009-01-20 11:15 by kevinzhan[未注册用户]
导出的EXCEL没有网格线的?怎样才能显示网格线呢?

#193楼[楼主]   回复  引用  查看    

2009-01-20 13:21 by webabcd      
@kevinzhan
csv是没有的
需要导出xls,导入命名空间xmlns:x="urn:schemas-microsoft-com:office:excel",有太多的功能了
google一下有很多结果的

#194楼   回复  引用    

2009-02-04 10:59 by 菜鸟向往肉鸡[未注册用户]
请问楼主,为什么我在webform里使用导出excl,if (dt == null) 总是提示
转换错误,dt没有值啊,但是我已经成功返回并显示数据了啊

#195楼[楼主]   回复  引用  查看    

2009-02-04 11:58 by webabcd      
@菜鸟向往肉鸡
是要导出dt的内容吗,他要是null,肯定不会导出来的,除非你的数据源不是dt

#196楼   回复  引用    

2009-02-05 10:25 by 菜鸟向往肉鸡[未注册用户]
查了下,webform里控件绑定的数据源返回完数据并显示之后,就被释放掉了。。

#197楼[楼主]   回复  引用  查看    

2009-02-05 12:01 by webabcd      
@菜鸟向往肉鸡
。。。是的
评论共2页: 上一页 1 2 



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 632863




相关文章:

相关链接: