DataGrid 导出到 Excel 的帮助类

DataGrid 导出到 Excel 的帮助类

 

//=============================================================================== 
// 
// 从 DataGrid    或数据源中导出数据到 Excel 并提示下载的帮助类。 
// 
// Author:    Neil Chen (木野狐) 
// Date:    2005-1-27 
// Version: 1.22 
// History: 
//            v1.00    使用静态方法的形式实现该类,提供多种重载方式。 
//            v1.01    添加了对 DevExpress.Web.ASPxGrid.ASPxGrid 的直接导出支持。 
//            v1.20    改写为实体类。 减少了重复代码。 
//            v1.21    2005-2-1     
//                    修改了一个构造函数的重载形式中异常检测的代码。延迟到 Export() 方法。 
//            v1.22    2005-2-3     
//                    1. 修正了 Export() 方法中缺少 _titles != null 判断的 bug. 
//                    2. 修正了长的数字被 Excel 自动转换为科学计数法的毛病。 
//                        (修改的办法来自 http://dotnet.aspx.cc
// 
//=============================================================================== 
namespace RChen.Demos { 
    
using System; 
    
using System.IO; 
    
using System.Data; 
    
using System.Web; 
    
using System.Web.UI; 
    
using System.Web.UI.WebControls; 
    
using System.Text; 
    
using System.Globalization; 
    
using System.Collections; 
    
using DevExpress.Web.ASPxGrid; 
 
    
public class ExcelHelper { 
        
#region Fields 
 
        
string _fileName; 
        DataTable _dataSource;         
        
string[] _titles = null
        
string[] _fields = null
        
int _maxRecords = 1000
 
        
#endregion 
 
        
#region Properties 
 
        
/// <summary> 
        
/// 限制输出到 Excel 的最大记录数。超出则抛出异常 
        
/// </summary> 
        public int MaxRecords { 
            
set { _maxRecords = value; } 
            
get { return _maxRecords; } 
        } 
 
        
/// <summary> 
        
/// 输出到浏览器的 Excel 文件名 
        
/// </summary> 
        public string FileName { 
            
set { _fileName = value; } 
            
get { return _fileName; } 
        } 
 
        
#endregion 
 
        
#region .ctor 
 
        
/// <summary> 
        
/// 构造函数 
        
/// </summary> 
        
/// <param name="titles">要输出到 Excel 的列标题的数组</param> 
        
/// <param name="fields">要输出到 Excel 的字段名称数组</param> 
        
/// <param name="dataSource">数据源</param> 
        public ExcelHelper(string[] titles, string[] fields, DataTable dataSource): this(titles, dataSource)        { 
            
if (fields == null || fields.Length == 0
                
throw new ArgumentNullException("fields"); 
 
            
if (titles.Length != fields.Length) 
                
throw new ArgumentException("titles.Length != fields.Length""fields"); 
             
            _fields 
= fields;             
        } 
 
        
/// <summary> 
        
/// 构造函数 
        
/// </summary> 
        
/// <param name="titles">要输出到 Excel 的列标题的数组</param> 
        
/// <param name="dataSource">数据源</param> 
        public ExcelHelper(string[] titles, DataTable dataSource): this(dataSource) { 
            
if (titles == null || titles.Length == 0
                
throw new ArgumentNullException("titles"); 
            
//if (titles.Length != dataSource.Columns.Count) 
            
//    throw new ArgumentException("titles.Length != dataSource.Columns.Count", "dataSource"); 
 
            _titles 
= titles;             
        } 
 
        
/// <summary> 
        
/// 构造函数 
        
/// </summary> 
        
/// <param name="dataSource">数据源</param> 
        public ExcelHelper(DataTable dataSource) { 
            
if (dataSource == null
                
throw new ArgumentNullException("dataSource"); 
            
// maybe more checks needed here (IEnumerable, IList, IListSource, ) ??? 
            
// 很难判断,先简单的使用 DataTable 
 
            _dataSource 
= dataSource; 
        } 
         
        
public ExcelHelper() {} 
 
        
#endregion 
         
        
#region public Methods 
         
        
/// <summary> 
        
/// 导出到 Excel 并提示下载 
        
/// </summary> 
        
/// <param name="dg">DataGrid</param> 
        public void Export(DataGrid dg) { 
            
if (dg == null
                
throw new ArgumentNullException("dg"); 
            
if (dg.AllowPaging || dg.PageCount > 1
                
throw new ArgumentException("paged DataGrid can't be exported.""dg"); 
 
            
// 添加标题样式 
            dg.HeaderStyle.Font.Bold = true
            dg.HeaderStyle.BackColor 
= System.Drawing.Color.LightGray; 
 
            RenderExcel(dg); 
        } 
 
        
/// <summary> 
        
/// 导出到 Excel 并提示下载 
        
/// </summary> 
        
/// <param name="xgrid">ASPxGrid</param> 
        public void Export(DevExpress.Web.ASPxGrid.ASPxGrid xgrid) {  
            
if (xgrid == null
                
throw new ArgumentNullException("xgrid"); 
            
if (xgrid.PageCount > 1
                
throw new ArgumentException("paged xgird not can't be exported.""xgrid"); 
 
            
// 添加标题样式 
            xgrid.HeaderStyle.Font.Bold = true
            xgrid.HeaderStyle.BackColor 
= System.Drawing.Color.LightGray; 
 
            RenderExcel(xgrid); 
        } 
 
        
/// <summary> 
        
/// 导出到 Excel 并提示下载 
        
/// </summary> 
        public void Export() { 
            
if (_dataSource == null
                
throw new Exception("数据源尚未初始化"); 
 
            
if (_fields == null && _titles != null && _titles.Length != _dataSource.Columns.Count)  
                
throw new Exception("_titles.Length != _dataSource.Columns.Count"); 
             
            
if (_dataSource.Rows.Count > _maxRecords) 
                
throw new Exception("导出数据条数超过限制。请设置 MaxRecords 属性以定义导出的最多记录数。"); 
 
            DataGrid dg 
= new DataGrid(); 
            dg.DataSource 
= _dataSource; 
 
            
if (_titles == null) { 
                dg.AutoGenerateColumns 
= true
            }  
            
else { 
                dg.AutoGenerateColumns 
= false
                
int cnt = _titles.Length; 
 
                System.Web.UI.WebControls.BoundColumn col; 
 
                
if (_fields == null) { 
                    
for (int i=0; i<cnt; i++) { 
                        col 
= new System.Web.UI.WebControls.BoundColumn(); 
                        col.HeaderText 
= _titles[i]; 
                        col.DataField 
= _dataSource.Columns[i].ColumnName; 
                        dg.Columns.Add(col); 
                    } 
                } 
                
else { 
                    
for (int i=0; i<cnt; i++) { 
                        col 
= new System.Web.UI.WebControls.BoundColumn(); 
                        col.HeaderText 
= _titles[i]; 
                        col.DataField 
= _fields[i]; 
                        dg.Columns.Add(col); 
                    } 
                } 
            } 
 
            
// 添加标题样式 
            dg.HeaderStyle.Font.Bold = true
            dg.HeaderStyle.BackColor 
= System.Drawing.Color.LightGray; 
            dg.ItemDataBound 
+= new DataGridItemEventHandler(DataGridItemDataBound); 
 
            dg.DataBind(); 
            RenderExcel(dg); 
        } 
 
        
#endregion 
 
        
#region private Methods 
         
        
private void RenderExcel(Control c) { 
            
// 确保有一个合法的输出文件名 
            if (_fileName == null || _fileName == string.Empty || !(_fileName.ToLower().EndsWith(".xls"))) 
                _fileName 
= GetRandomFileName(); 
 
            HttpResponse response 
= HttpContext.Current.Response; 
             
            response.Charset 
= "GB2312"
            response.ContentEncoding 
= Encoding.GetEncoding("GB2312"); 
            response.ContentType 
= "application/ms-excel/msword"
            response.AppendHeader(
"Content-Disposition""attachment;filename=" +  
                HttpUtility.UrlEncode(_fileName)); 
 
            CultureInfo cult 
= new CultureInfo("zh-CN"true); 
            StringWriter sw 
= new StringWriter(cult);             
            HtmlTextWriter writer 
= new HtmlTextWriter(sw); 
 
            writer.WriteLine(
"<meta http-equiv=\"Content-Type\" content=\"text/html;charset=GB2312\">"); 
 
            DataGrid dg 
= c as DataGrid; 
             
            
if (dg != null) { 
                dg.RenderControl(writer); 
            } 
            
else { 
                ASPxGrid xgrid 
= c as ASPxGrid; 
 
                
if (xgrid != null
                    xgrid.RenderControl(writer); 
                
else 
                    
throw new ArgumentException("only supports DataGrid or ASPxGrid.""c");     
            } 
            c.Dispose(); 
 
            response.Write(sw.ToString()); 
            response.End(); 
        } 
 
 
        
/// <summary> 
        
/// 得到一个随意的文件名 
        
/// </summary> 
        
/// <returns></returns> 
        private string GetRandomFileName() { 
            Random rnd 
= new Random((int) (DateTime.Now.Ticks)); 
            
string s = rnd.Next(Int32.MaxValue).ToString(); 
            
return DateTime.Now.ToShortDateString() + "_" + s + ".xls"
        } 
 
        
private void DataGridItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) { 
            
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { 
                e.Item.Attributes.Add(
"style""vnd.ms-excel.numberformat:@"); 
                
//e.Item.Cells[3].Attributes.Add("style", "vnd.ms-excel.numberformat:¥#,###.00"); 
            } 
        } 
 
        
#endregion 
    } 
0
0
(请您对文章做出评价)

posted on 2005-02-02 00:16 木野狐(Neil Chen) 阅读(10278) 评论(60)  编辑 收藏 网摘 所属分类: .NET

评论

#1楼 2005-02-02 09:03 jackyrong      

呵呵,根本看不到你的代码呀   回复  引用  查看    

#2楼 211.158.23.* 2005-02-02 09:36 guest

hehe, expand the tree   回复  引用    

#3楼[楼主] 2005-02-02 10:25 木野狐      

jackyrong,
代码就是页面里这些了。不过忘记了写调用的例子,现在补上:
以下例子实际调用时需要在外面用 try 块捕获并处理异常。可能抛出的异常有 ParameterException, ParameterNullException, Exception 等。
 
// 1. 导出一个不分页的 DataGrid 到 Excel.
ExcelHelper helper = new ExcelHelper();
// 设置文件名(可省。省略则自动生成一个随机的文件名)
helper.FileName = "xxx.xls";
helper.Export(dg);

// 2. 导出分页的 DataGrid,需要同时指定他的数据源(DataTable)
DataTable dt = ;
ExcelHelper helper 
= new ExcelHelper(dt);
// 最大导出条数(可省)
helper.MaxRecords = 2000;
helper.Export();

// 3. 如果要指定列标题,这样调用:
DataTable dt = ;
ExcelHelper helper 
= new ExcelHelper(
    
new string[] {"列标题1""列标题2" }
    dt);
helper.Export();

// 4. 如果还要指定字段名称, 这样调用(因为输出的字段名称不一定要和 DataTable 里字段名称的次序相同。
DataTable dt = ;
ExcelHelper helper 
= new ExcelHelper(
    
new string[] {"列标题1""列标题2" }
    
new string[] {"字段名1""字段名2" },
    dt);
helper.Export();
  回复  引用  查看    

 

#4楼 203.207.189.* 2005-02-02 13:25 ezwyj

本方法的技术实质是另存HTML为EXCEL文件.如果需要套用一个EXCEL的标准格式,那又该如何实现呢?   回复  引用    

#5楼 61.171.96.* 2005-02-02 13:37 deirlym

这个类有点小问题。

DataTable dt = ...;
ExcelHelper helper = new ExcelHelper(dt);
helper.MaxRecords = 2000;
helper.Export();
如果用这种方法
类中的
if (_fields == null && _titles.Length != _dataSource.Columns.Count)
throw new Exception("_titles.Length != _dataSource.Columns.Count");
由于_titles 设有初始化而就使用 Length 属性将会出现异常:
Object reference not set to an instance of an object.

应改为:
if (_fields == null && _titles!=null && _titles.Length != _dataSource.Columns.Count)
throw new Exception("_titles.Length != _dataSource.Columns.Count");

即可。
  回复  引用    

#6楼[楼主] 2005-02-02 18:02 木野狐      

to ezwyj,

要套用模板的话恐怕还是得使用 Excel 对象了。不过也可以考虑把样式附加到内部创建的那个 DataGrid 上去。

to deirlym:

非常感谢。的确存在这个问题。 这个判断原先是写在构造函数里的,后来我移到这个方法里时出现了一个疏漏。按你写的代码就对了。
  回复  引用  查看    

#7楼[楼主] 2005-02-03 23:00 木野狐      

代码又做了更新。 解决了 DataGrid 中导出 Excel 时如果数字过大自动变为科学计数法的问题。   回复  引用  查看    

#8楼 218.86.215.* 2005-03-04 11:20 天地归一

using DevExpress.Web.ASPxGrid;
找不到DevExpress命名空间????
  回复  引用    

#9楼[楼主] 2005-03-04 17:17 木野狐      

to 天地归一,

这个是因为我在项目中用到这个第三方的 grid 控件,所以添加了对他的支持。你可以直接从这个类中把关于他的内容去掉即可。
  回复  引用  查看    

#10楼 211.103.36.* 2005-05-09 15:12 hardy

保存成功后,点击当前页的其它模块失效,这是什么原因?
怎么解决?
谁知道吗?请告诉之:
E-mail:hardy1011@163.com
  回复  引用    

#11楼 218.206.194.* 2005-05-16 10:46 darhe[未注册用户]

这是DELPHI2005吧,
我用的还是DELPHI 6,看不懂呀
  回复  引用    

#12楼 61.144.60.* 2005-05-18 08:44 LEOHUO

数据中有图片,还能导出吗   回复  引用    

#13楼 61.149.82.* 2005-05-19 16:21 Jalor

真的很感谢木野狐,通过使用你的这种方法使我可以进行分页导出。非常非常感谢。   回复  引用    

#14楼 220.168.13.* 2005-05-29 19:30 cherno[未注册用户]

非常感谢!:_)   回复  引用    

#15楼 172.16.30.* 2005-06-21 14:28 Botao

能不能用这种方法把DataTable 导入到一个有固定模板的Excel表中
比如说导入到有固定表头标题的Excel表中。但一定是DataTable中的
数据
  回复  引用    

#16楼[楼主] 2005-07-07 22:20 木野狐      

很多朋友都提到对 Excel 模版的支持问题,我觉得这也是一个很有意思的话题。下一个阶段我争取进行这方面的学习和补充,以完善这个助手类!   回复  引用  查看    

#17楼 218.75.95.* 2005-08-08 17:32 spring[未注册用户]

比如,在线考试系统,把试卷题目的信息导出到EXCEL呢?   回复  引用    

#18楼[楼主] 2005-08-09 10:38 木野狐      

@spring

我没有做过考试系统,请告诉我详细点的场景好吗?
  回复  引用  查看    

#19楼 60.26.185.* 2005-08-25 16:28 sunpop[未注册用户]

十分感谢木野狐,这个导出类程序帮了我很大忙,谢谢!现在有一个问题请教,就是当把此程序用于 windows XP 媒体中心版,IE 版本为 6.0.2900.2180.xpsp_sp2_rtm.040803-2158 作为客户端时以及XP sp2 版本下的 IE 当作客户端时会发生以下现象:在弹出的下载窗口点“打开”时一闪而过,点“取消”也如此,但是点“保存”可以保存,而且无论点哪个按钮,当前的IE窗口都会自动关闭!不知道是何原因?其他ie稍老一些的版本可以用没有问题!请木野狐帮忙查看一下!谢谢!!!   回复  引用    

#20楼[楼主] 2005-08-29 00:59 木野狐      

@sunpop, 你好:

我想这个应该是 XP sp2 中对 IE 的默认设置有一些内容不能直接打开吧,你仔细查看一下 IE 里的相关安全设置看看。另外如果你有安装 3721 那最好把他卸掉。

因为我机器上没有 XP sp2 环境,所以暂时没法测试。非常抱歉。
  回复  引用  查看    

#21楼 218.4.73.* 2005-09-09 17:11 学习者[未注册用户]

我现在在学习ASP.NET,很好的学习知识!谢谢楼主   回复  引用    

#22楼 221.15.172.* 2005-09-12 19:22 mzyqy[未注册用户]

if (dg.AllowPaging || dg.PageCount > 1)
throw new ArgumentException("paged DataGrid can't be exported.", "dg");
这两个语句我觉得不好,因为实际中,DATAGRID分页的情况为大多数,如果分页了,而且页数大于1就抛出异常,那么这个这个类的功能就很弱了,我目前的做法是如果DATAGRID是分页的,则先取消分页,然后绑定一次(绑定函数如:BINDDATAGRID(),在PAGEBASE类中,所有WEBFORM PAGE都派生于PAGEBASE类,在需要导出DATAGRID的页面实现BINDDATAGRID的重载),然后导出,导出以后再进行分页,再绑定,通过这种方式导出,页面上有控件的时候必须先清除控件

呵呵,我只是大概看了一下,如果有别的地方对这个情况已经进行过处理,那当我废话啦!!
  回复  引用    

#23楼[楼主] 2005-09-23 02:11 木野狐      

@mzyqy:

的确做过处理的,你仔细看看:)

分页的 DataGrid 只有通过赋数据源属性到我这个帮助类里面才会起作用。
  回复  引用  查看    

#24楼 59.42.183.* 2005-10-26 19:49 傲宇[未注册用户]

类型“CheckBox”的控件“ASPxGrid1__ctl3__ctl3__ctl0_Checkbox1”必须放在具有 runat=server 的窗体标记内。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Web.HttpException: 类型“CheckBox”的控件“ASPxGrid1__ctl3__ctl3__ctl0_Checkbox1”必须放在具有 runat=server 的窗体标记内。

源错误:


行 248:
行 249: if (xgrid != null)
行 250: xgrid.RenderControl(writer);
行 251: else
行 252: throw new ArgumentException("only supports DataGrid or ASPxGrid.", "c");

我在对aspxgrid作导出的时候会出现这个问题,是在bind之后做的,请问木野狐,正确的做法应该是怎么样啊?

  回复  引用    

#25楼[楼主] 2006-01-13 14:09 木野狐      

傲宇,

因为给出的信息不太够,我没法判断你的程序是哪里出了错误,sorry.
你可以把程序 email 给我交流一下看。
chenrong2003[at]gmail[dot]com
  回复  引用  查看    

#26楼 2006-01-13 15:50 大愚      

有VS2005的么,不能运行看效果   回复  引用  查看    

#27楼 2006-01-13 15:53 大愚      

还有 DevExpress.Web.ASPxGrid; 是什么命名空间?VS 2005中找不到。急啊,我正需要一个这样的功能:把datagridview导出到excel   回复  引用  查看    

#28楼[楼主] 2006-01-13 18:42 木野狐      

DevExpress.Web.ASPxGrid

是 ASPxGrid 这个控件的名称空间,你把关于它的东西去掉就可以了。
2005 下面要等我过些天有时间了改一下。
  回复  引用  查看    

#29楼 2006-02-25 13:36 孤剑      

感谢木野孤提供的代码。
希望多多交流

BLOG:
http://blog.csdn.net/alonesword/
  回复  引用  查看    

#30楼 210.83.202.* 2006-03-15 11:39 wangx[未注册用户]

木兄:
我导出ASPxGrid中的数据,用Excel打开后是代码,请问是怎么回事,

  回复  引用    

#31楼 221.221.21.* 2006-05-22 16:36 ahz[未注册用户]

我现在需要一个从asp.net的页面中把文件(excel,txt,dbf等)倒入到数据库中的功能!请各位高手指点!万分感谢!   回复  引用    

#32楼 221.221.21.* 2006-05-22 16:36 ahz[未注册用户]

我现在需要一个从asp.net的页面中把文件(excel,txt,dbf等)倒入到数据库中的功能!请各位高手指点!万分感谢!   回复  引用    

#33楼[楼主] 2006-08-10 11:31 木野狐      

@ahz

你好,excel 等需要首先上传到服务器,然后你可以读取后写 ADO.NET 代码来导入。
  回复  引用  查看    

#34楼[楼主] 2006-08-10 11:32 木野狐      

@wangx

可能跟你页面所用的编码有关系,用 utf-8 还是 gb2312, 需要设置一致才行。
  回复  引用  查看    

#35楼[楼主] 2006-08-10 11:33 木野狐      

@孤剑

谢谢鼓励
  回复  引用  查看    

#36楼[楼主] 2006-08-10 13:31 木野狐      

"XXXX 必须放在具有 runat=server 的窗体标记内" 问题的解决办法是在调用页面内添加代码:

public override void VerifyRenderingInServerForm(Control control)
{

}

适用于 GridView.
  回复  引用  查看    

#37楼 222.66.55.* 2006-08-10 21:26 aspweb[未注册用户]

哪位大哥知道,下载破解VS 2005的DevExpress.Web.ASPxGrid控件   回复  引用    

#38楼 222.222.67.* 2006-09-29 10:46 soul[未注册用户]

话不多说了.谢过.   回复  引用    

#39楼 221.224.21.* 2007-01-10 13:43 火草[未注册用户]

问下啊,在导出DataGrid的时候,如果DataGrid里有模版列如:
<asp:TemplateColumn HeaderText="选择">
<ItemTemplate>
<asp:CheckBox id="checkbox_Choose" runat="server" checked='false'></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>

就会报"checkbox必须放在具有 runat=server 的窗体标记内"错误,你上面介绍了GridView的解决方法,DataGrid有什么好的解决方法吗?
  回复  引用    

#40楼 58.208.188.* 2007-01-10 20:15 火草[未注册用户]

已经知道了   回复  引用    

#41楼[楼主] 2007-01-11 01:26 木野狐      

@火草
我想和 GridView 的解决办法是一样的吧?没有时间试验。
  回复  引用  查看    

#42楼 2007-02-07 11:53 Edwin Liu      

不错   回复  引用  查看    

#43楼 2007-02-22 21:32 yunhuasheng      

挺好的。   回复  引用  查看    

#44楼 202.118.70.* 2007-03-17 21:48 gs[未注册用户]

对于动态datagrid不管用阿。   回复  引用    

#45楼 222.137.187.* 2007-06-21 10:31 尹真[未注册用户]

为什么点击到出的保存对话框时候,当前页面会关闭呢?   回复  引用    

#46楼 218.63.205.* 2007-06-21 20:18 黄涛[未注册用户]

我是个出学者,请问你能不能做一个完整的页给我。我看了你的类不知道怎么调用啊!!!!   回复  引用    

#47楼 58.35.91.* 2007-06-21 21:40 chuan[未注册用户]

@尹真

我也遇到这样的问题,有高手能解答吗?
  回复  引用    

#48楼[楼主] 2007-06-22 11:39 木野狐      

@尹真
不能理解你所说的情况,我怎么没有遇到过?
  回复  引用  查看    

#49楼 60.21.155.* 2007-07-19 11:03 kane[未注册用户]

木老师,您的博客在哪?
我想跟您学习学习。可以告诉一下吗?我的邮箱是kane-second@163.com
  回复  引用    

#50楼 220.163.12.* 2007-12-03 17:29 lgq[未注册用户]

我用WEB在做这个的时候,有时导出EXECL时会导出整个网页,也就是在EXECL中出现了WEB的的控件,比如按钮之类的,导出TXT时出现了这个网页的HTML ,我改了Charset的值 还是出错 ,但有时又不出错。请问大家知道是哪里出了问题吗?
  回复  引用    

#51楼[楼主] 2007-12-05 13:12 木野狐(Neil Chen)      

@lgq
需要你提供详细的出错情况才知道。
  回复  引用  查看    

#52楼 2007-12-07 14:08 LGQ      

@木野狐(Neil Chen)
public static void DataGrid_Derives(DropDownList DDL,DataGrid dg, string filename)
{
System.Web.HttpResponse resp=System.Web.HttpContext.Current.Response;
System.Web.HttpServerUtility Serv=System.Web.HttpContext.Current.Server;
try
{
string theColumnSeparatorString = "";
string theFileType = "";
string theContentType = "";
switch(DDL.SelectedValue)
{
case "CSV":
theColumnSeparatorString = ",";
theFileType = "csv";
theContentType = "application/ms-excel";
break;
case "PDF":
theColumnSeparatorString = "\t";
theFileType = "pdf";
theContentType = "application/pdf";
resp.Write("<script language=javascript>alert('本功能正在实现中.....!');</script>");
break;
case "TXT":
theColumnSeparatorString = "\t";
theFileType = "txt";
theContentType = "application/ms-txt";
break;
default://EXCEL
theColumnSeparatorString = "\t";
theFileType = "xls";
theContentType = "application/ms-excel";
break;
}
resp.Clear();
resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
resp.AddHeader("Content-Disposition", "attachment; filename=" + Serv.UrlEncode(filename+"."+ theFileType));
resp.Buffer= true;
resp.ContentType = "application/vnd.ms-excel";
resp.Charset = "";
dg.EnableViewState = false;
System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
ClearControls(dg);
dg.RenderControl(oHtmlTextWriter);
resp.Write(oStringWriter.ToString());
resp.End();
}
catch
{
}
finally
{

}
}


private static void ClearControls(Control control)
{
for (int i=control.Controls.Count -1; i>=0; i--)
{
ClearControls(control.Controls[i]);
}

if (!(control is TableCell))
{
if (control.GetType().GetProperty("SelectedItem") != null)
{
LiteralControl literal = new LiteralControl();
control.Parent.Controls.Add(literal);
try
{
literal.Text = (string)control.GetType().GetProperty("SelectedItem").GetValue(control,null);
}
catch

{

}

control.Parent.Controls.Remove(control);
}
else
if (control.GetType().GetProperty("Text") != null)
{
LiteralControl literal = new LiteralControl();
control.Parent.Controls.Add(literal);
literal.Text = (string)control.GetType().GetProperty("Text").GetValue(control,null);
control.Parent.Controls.Remove(control);
}
}
return;
}


EXECL功能可以实现 但是在 用TXT导出的时候却成了HTML .DropDownList用来选择导出格式的。
  回复  引用  查看    

#53楼 2007-12-07 14:11 LGQ      

有点错误 ,把resp.ContentType = "application/vnd.ms-excel"; 换成
resp.ContentType =theContentType 其实这句话好像无关紧要
  回复  引用  查看    

#54楼 2007-12-07 14:19 LGQ      

编译运行都没有出错 只是选择导出TXT是导出了网页部分的HTML,其中有GataGrid的HMRL代码。请问这是什么原因?我运行的是.NET 2003 WEB应用程序   回复  引用  查看    

#55楼 218.94.84.* 2008-01-11 13:36 tp[未注册用户]

DataTable dt = ;
ExcelHelper helper = new ExcelHelper(dt);
// 最大导出条数(可省)
helper.MaxRecords = 2000;
helper.Export();
如何指定数据源呢?
我的datagrid中的数据源传不过去,请问可以给个例子吗?
  回复  引用    

#56楼[楼主] 2008-01-11 17:20 木野狐(Neil Chen)      

@tp

如果你的 DataGrid 的数据源是 DataTable, 可以:

DataTable table = grid.DataSource as DataTable;
  回复  引用  查看    

#57楼 58.211.105.* 2008-03-14 13:17 girl1225[未注册用户]

运行提示错误为"类型“DataGridLinkButton”的控件“dgdApprove__ctl2__ctl0”必须放在具有 runat=server 的窗体标记内。 "该怎么解决呢?谢谢!
  回复  引用    

#58楼[楼主] 2008-03-14 17:47 木野狐(Neil Chen)      

@girl1225

能提供一下你的测试代码吗,尽量简化了贴上来。
  回复  引用  查看    

#59楼 222.212.74.* 2008-05-05 15:33 向建奇[未注册用户]

大侠很了不起!!!谢谢啦   回复  引用    

posted @ 2009-08-31 21:08  水木  阅读(1201)  评论(0编辑  收藏  举报