`
pcajax
  • 浏览: 2173943 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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
0
(请您对文章做出评价)

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

<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description rdf:about="http://www.cnblogs.com/RChen/articles/100649.html" dc:identifier="http://www.cnblogs.com/RChen/articles/100649.html" dc:title="" trackback:ping="http://www.cnblogs.com/RChen/services/trackbacks/100649.aspx" /> </rdf:RDF> -->

评论

1183477

#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 属性

分享到:
评论

相关推荐

    easyui datagrid 数据导出到Excel

    文件`Jquery_easyui_datagrid_js导出excel.doc`可能是文档说明或者包含插件使用的示例代码。通常,jQuery插件能简化Datagrid数据导出的操作。一种常见的方式是使用`html2canvas`和`jsPDF`库,它们可以将HTML内容转换...

    easyui datagrid 导出到excel

    "EasyUI Datagrid 导出到Excel"这一主题涉及的是如何将EasyUI Datagrid中的数据显示在Excel表格中,方便用户进行数据处理和分析。以下是对这个知识点的详细说明: 1. EasyUI Datagrid简介: EasyUI Datagrid是基于...

    easyui datagrid 导出到Excel js实现 跨浏览器

    easyui datagrid 导出到Excel js实现 跨浏览器 资源真实可用

    VB6 DataGrid中的数据导出到Excel

    VB6 DataGrid中的数据导出到Excel 本篇文章将详细介绍如何使用VB6将DataGridView中的数据导出到Excel文件中。下面将对标题、描述、标签和部分内容进行解释,并生成相关的知识点。 标题:VB6 DataGrid中的数据导出...

    AdvancedDataGrid或datagrid导出到excel.rar

    AdvancedDataGrid或datagrid导出到excel.rar AdvancedDataGrid或datagrid导出到excel.rar AdvancedDataGrid或datagrid导出到excel.rar

    easyui-datagrid导出至Excel插件

    easyui-datagrid导出至Excel插件,中文没有乱码问题。

    vb DataGrid导出excel例子

    本例提供的"vb DataGrid导出excel例子"是一个很好的学习资源,它将展示如何在VB中实现这个功能,使得开发人员能够快速地将用户界面的数据转换为可编辑的Excel文件。 首先,我们需要了解VB中与DataGrid和Excel交互的...

    flex中dataGrid导出数据到excel中

    flex中dataGrid导出数据到excel中,不存在乱码问题

    DataGrid导出EXCEL的几个方法(WebControl)

    ### DataGrid导出EXCEL的几种方法:深入探讨与实践 在Web开发中,将数据导出为Excel格式是常见的需求之一,尤其是当涉及到大量数据分析和报表制作时。本文将详细解析如何使用ASP.NET中的DataGrid控件实现数据导出至...

    将datagrid数据导出到excel或者word

    将datagrid数据导出到excel或者word 本文主要讲解如何将DataGridView控件中的数据导出到Excel或者Word文档中。 下面是相关的知识点: 1. ASP.NET 中的数据导出:在 ASP.NET 中,可以使用 Response 对象来控制...

    asp.net(vb) datagrid导出为excel

    asp.net(vb) datagrid导出为excel asp.net(vb) datagrid导出为excel asp.net(vb) datagrid导出为excel asp.net(vb) datagrid导出为excel

    WPF_NPOI导出datagrid 到Excel方法.rar

    FileStream BookStream = new FileStream(saveFileDialog.FileName.ToString(), FileMode.Create, FileAccess.Write);//定义文件流 book.Write(BookStream);... MessageBox.Show("导出保存成功!");

    datagrid 导出到 Excel

    要将datagrid导出到Excel,我们需要使用Microsoft Office Interop库,这是一个允许.NET应用程序与Office应用程序进行交互的API。在VS2003中,首先确保已安装Microsoft Office,然后在项目中引用Microsoft.Office....

    wpf datagrid数据导出到execl

    private void daochu_Click(object sender, ... if (dataGrid.Columns[i].Visibility == System.Windows.Visibility.Visible)//只导出可见列 { dt.Columns.Add(dataGrid.Columns[i].Header.ToString());//构建表头

    flex通过java后台讲datagrid导出为excel

    将Flex中的Datagrid数据导出到Excel是常见的需求,特别是在需要用户下载和进一步处理大量数据时。 首先,让我们深入理解Flex的Datagrid组件。Datagrid是一种灵活的数据展示工具,它可以显示来自不同数据源的数据,...

    silverlight 将DataGrid数据导出EXCEL

    在本场景中,我们关注的是如何利用Silverlight技术将DataGrid中的数据导出到Excel文件中。DataGrid是Silverlight提供的一种控件,用于显示和操作表格数据。而Excel则是Microsoft Office套件中的电子表格应用,广泛...

    vb.Net datagrid数据导出到excel

    标题与描述中提到的“datagrid数据导出到excel”指的是在VB.NET开发环境下,如何将DataGridView控件中的数据导出为Excel文件的过程。以下是对该过程的详细解析: 一、连接数据库与获取数据 在代码片段的开始部分,...

    WPF中DataGrid导出Excel和Word示例源码

    在本文中,我们将深入探讨如何在WPF(Windows Presentation Foundation)环境中使用DataGrid控件来实现数据的显示、编辑、保存以及导出到Excel和Word的功能。这些功能对于开发高效且用户友好的桌面应用程序至关重要...

    将Flex DataGrid数据导出到Excel中

    本教程将详细介绍如何实现从Flex DataGrid导出数据到Excel的功能。 首先,让我们了解Flex DataGrid。它是一个强大的组件,用于显示二维数据集,通常包含可排序和可分页的列。DataGrid可以绑定到各种数据源,包括...

    Flex中组件datagrid导出Excel

    本主题将深入探讨如何在Flex中实现组件DataGrid的数据导出功能,使其能够生成Excel文件供用户下载和处理。 DataGrid是Flex中常用的一个组件,它用于展示结构化数据,通常用于表格形式的展示。在Flex中,我们可以...

Global site tag (gtag.js) - Google Analytics