最近的项目中要大量用到 DataGrid 中的数据导出到 Excel 的方法,且数据量比较大。针对这个我做了一个导出 Excel 的帮助类。
之前在网上我搜索到很多导出 Excel 的代码,但是都不尽如人意。一般有下列几种方法:

1. 用 Excel.Application 对象逐单元格的填充数据。
这个办法由于是操作 COM 组件来进行,而 .NET 调用 COM 是要经过一层 wrapper 的,必然导致效率不高。还有一个原因是, Excel 不是针对多线程而设计的, 在大的并发需求下,可能会出现问题。因此一般这个方法只推荐适用于 Intranet.

2.  用 DataGrid 的 RenderControl 方法直接输出到一个 HtmlTextWriter 对象。 这个办法比较简单,因为是输出纯 html, 不涉及服务端 Excel 对象的初始化带来的开销。所以性能应该是比较好的。但是我看了现有的一些例子都是只能输出一页的, 也就是说不适用于分页的 DataGrid.

3. 用 OWC, 同样,由于是 COM 组件,存在性能问题。

针对这个情况我决定采用 2 作为最终输出的方法,在内存中构造不分页的 DataGrid, 然后 RenderControl 的方法。(要传入数据源作为参数)。
因为我加了自定义列标题和字段列表的功能,所以目前的数据源只能是类似 DataTable 这样的,至于一些其他可以绑定到 DataGrid 的类型比如 IListSource, IEnumerable, 由于内部不带有字段名称,标题信息等内容,分析起来非常复杂。简单起见,我忽略了这些,而仅仅接收 DataTable 作为数据源。

代码在这里:

http://www.cnblogs.com/rchen/articles/100649.html

//===============================================================================
//
// 从 DataGrid    或数据源中导出数据到 Excel 并提示下载的帮助类。
//
// Author:    Roger 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 {
        
Fields

        
Properties

        
.ctor
        
        
public Methods

        
private Methods
    }

}

posted on 2005-02-02 00:16 木野狐 阅读(2697) 评论(29)  编辑 收藏 收藏至365Key 所属分类: C#, ASP.NET


FeedBack:
# re: DataGrid 导出到 Excel 的帮助类
2005-02-02 09:03 | jackyrong
呵呵,根本看不到你的代码呀  回复
  
# re: DataGrid 导出到 Excel 的帮助类
2005-02-02 09:36 | guest
hehe, expand the tree  回复
  
# re: DataGrid 导出到 Excel 的帮助类
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();