Asp.net中把DataTable或DataGrid导出为Excel

简介:

DataGrid导出到Excel的时候,某些数字内容显示不正确, " 3.62201E+14 " 的格式 

WebForm中,在DataGrid的ItemDataBound事件内

if (e.Item.ItemType   ==   ListItemType.Item   ||   e.Item.ItemType   ==   ListItemType.AlternatingItem)
{
e.Item.Cells[
0].Attributes.Add("style","vnd.ms-excel.numberformat:@");
}


在WinForm内Excel.Range  range  
=   (Excel.Range)worksheet.Cells[ 1 , 1 ];
// 设置单元格数字内容显示格式
range.NumberFormat   =   Excel.XlParameterDataType.xlParamTypeUnknown;
------

// 设置单元格内容自动换行
range.WrapText   =    true   ;
// 设置单元格内容水平对齐方式
range.HorizontalAlignment   =   Excel.XlHAlign.xlHAlignCenter;
// 设置单元格内容竖直堆砌方式
range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
range.WrapText  
=    true ;

当前编码的一个项目中有把查询结果(显示在DataGrid)导出为excel的需求,尝试了几种方法,作为技巧拿来和大家分享。 

内容: 
服务器端实现DataGrid导出为excel 
客户端实现DataGrid导出为excel 
服务器端实现DataTable导出为excel(终极解决方案) 


 

服务器端实现DataGrid导出为excel 

这是网上出现的最多的做法:

 1 /// <summary> 
 2        /// 把DataGrid内容导出伟excel并返回客户端 
 3        /// </summary> 
 4        /// <param name="dgData">待导出的DataGrid</param> 
 5        /// 创 建 人:calvin 
 6        /// 创建日期:2005年10月08日 
 7        /// 修 改 人: 
 8        /// 修改日期:
 
 9          public   static   void  DataGrid2Excel(System.Web.UI.WebControls.DataGrid dgData) 
10         
11            // 当前对话 
12            System.Web.HttpContext curContext = System.Web.HttpContext.Current; 
13            // IO用于导出并返回excel文件 
14            System.IO.StringWriter strWriter = null
15            System.Web.UI.HtmlTextWriter htmlWriter = null
16 
17            if (dgData != null
18            
19                // 设置编码和附件格式 
20                curContext.Response.ContentType = "application/vnd.ms-excel"
21                curContext.Response.ContentEncoding =System.Text.Encoding.UTF8; 
22                curContext.Response.Charset = ""
23                 
24                // 导出excel文件 
25                strWriter = new System.IO.StringWriter(); 
26                htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter); 
27 
28                // 返回客户端     
29                dgData.RenderControl(htmlWriter);     
30                curContext.Response.Write(strWriter.ToString()); 
31                curContext.Response.End(); 
32            }
 
33        }

在需要导出的地方调用上面的方法就可以。不过这样的实现有两个问题:第一,datagrid中不能包含模板列;第二,只能够导出当前显示在datagrid的数据,无法在分页的情况下导出全部的查询结果。 

如果大家分析一下Control.RenderControl的方法,就会发现RenderControl只是把控件的innerHTML导出来,既然如此,完全可以把导出操作放在客户端来处理。 



客户端导出excel 

 1  /*  
 2  * 将DataGrid导出为Excel文件 
 3 
 4  * @param strTitle    文件标题 
 5  * @param dgData        待导出的DataGrid 
 6  * @param iStartCol    起始列序号 
 7  * @param iEndCol    结束列序号 
 8 
 9  * 创建人:    calvin 
10  * 创建日期: 2005-10-08 
11  * 修改人:     
12  * 修改日期: 
13  * */  
14  function  DataGrid2Excel(strTitle, dgData, iStartCol, iEndCol) 
15 
16       //  定义Excel Applicaiton Object  
17       var  appExcel  =   null
18       //  当前激活的工作簿  
19       var  currentWork  =   null
20       var  currentSheet  =   null
21       
22       try  
23      { 
24           //  初始化application  
25          appExcel  =   new  ActiveXObject( " Excel.Application " ); 
26          appExcel.Visible  =   true
27      } 
28       catch (e) 
29      { 
30          window.alert( " Please Install Excel First " ); 
31           
32           return
33      } 
34       
35       //  获取当前激活的工作部  
36      currentWork  =  appExcel.Workbooks.Add(); 
37      currentSheet  =  currentWork.ActiveSheet; 
38   
39       //  填充excel内容  
40       //  设置标题  
41      currentSheet.Cells( 1 , 1 ).Value  =  strTitle; 
42      currentSheet.Cells( 1 , 1 ).Value  =  dgData.innerText; 
43      window.alert(dgData.innerHTML); 
44   
45       //  填充内容  
46       for  ( var  iRow  =   0 ; iRow  <  dgData.rows.length  -   1 ; iRow ++
47      { 
48           //  显示指定列的内容  
49           for  ( var  iCol  =  iStartCol; iCol  <=  iEndCol; iCol ++
50          { 
51              currentSheet.Cells(iRow  +   2 , iCol  +   1 ).Value  =   
52                  dgData.rows[iRow].cells[iCol].innerText; 
53          } 
54      } 
55  }

下面是调用的例子

1  /*
2  * 导出dgData中0-3列的数据到excel文件中 
3  * */  
4  function  ToExcel() 
5 
6      DataGrid2Excel( " 使用javascript导出excel的例子 " , document.getElementsById( " dgData " ),  0 3 ); 
7  }

这种方法的缺点是: 
(1)了能够在客户端调用Excel.Application,需要把IE的安全级别设为“低”。 
(2)与方法一相同,还是只能导出当前显示在datagrid里面的数据,无法导出分页的数据。 



终极解决方案:将DataTable导出为excel 

好,让我们快点结束这篇无聊的post。一般来说,页面上的datagrid是以查询得到的一个DataTable为数据源的。那么为了把全部数据导入excel中,我们只要把DataTable数据源输出为excel就可以了。 

 1 /// <summary> 
 2        /// 把DataTable内容导出伟excel并返回客户端 
 3        /// </summary> 
 4        /// <param name="dgData">待导出的DataTable</param> 
 5        /// 创 建 人:陈文凯 
 6        /// 创建日期:2005年10月08日 
 7        /// 修 改 人: 
 8        /// 修改日期:
 
 9          public   static   void  DataTable2Excel(System.Data.DataTable dtData) 
10         
11            System.Web.UI.WebControls.DataGrid dgExport = null
12            // 当前对话 
13            System.Web.HttpContext curContext = System.Web.HttpContext.Current; 
14            // IO用于导出并返回excel文件 
15            System.IO.StringWriter strWriter = null
16            System.Web.UI.HtmlTextWriter htmlWriter = null
17 
18            if (dtData != null
19            
20                // 设置编码和附件格式 
21                curContext.Response.ContentType = "application/vnd.ms-excel"
22                curContext.Response.ContentEncoding =System.Text.Encoding.UTF8; 
23                curContext.Response.Charset = ""
24                 
25                // 导出excel文件 
26                strWriter = new System.IO.StringWriter(); 
27                htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter); 
28 
29                // 为了解决dgData中可能进行了分页的情况,需要重新定义一个无分页的DataGrid 
30                dgExport = new System.Web.UI.WebControls.DataGrid(); 
31                dgExport.DataSource = dtData.DefaultView; 
32                dgExport.AllowPaging = false
33                dgExport.DataBind(); 
34 
35                // 返回客户端 
36                dgExport.RenderControl(htmlWriter);     
37                curContext.Response.Write(strWriter.ToString()); 
38                curContext.Response.End(); 
39            }
 
40        }

需要注意的是,导出excel之前要把datatable的列名更改为客户要求的文字,就ok了。因为是从DataTable导出的,所以这种方法解决了分页数据的问题,堪称终极解决方案



本文转自高海东博客园博客,原文链接:XXXXX,如需转载请自行联系原作者
相关文章
|
5月前
|
文字识别 BI
【图片型PDF】批量识别扫描件PDF指定区域局部位置内容,将识别内容导出Excel表格或批量改名文件,基于阿里云OCR对图片型PDF识别改名案例实现
在医疗和政务等领域,图片型PDF文件(如病历、报告、公文扫描件)的处理需求广泛。通过OCR技术识别这些文件中的文字信息,提取关键内容并保存为表格,极大提高了信息管理和利用效率。本文介绍一款工具——咕嘎批量OCR系统,帮助用户快速处理图片型PDF文件,支持区域识别、内容提取、导出表格及批量改名等功能。下载工具后,按步骤选择处理模式、进行区域采样、批量处理文件,几分钟内即可高效完成数百个文件的处理。
551 8
|
8月前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
157 1
|
8月前
|
数据格式 UED
记录一次NPOI库导出Excel遇到的小问题解决方案
【11月更文挑战第16天】本文记录了使用 NPOI 库导出 Excel 过程中遇到的三个主要问题及其解决方案:单元格数据格式错误、日期格式不正确以及合并单元格边框缺失。通过自定义单元格样式、设置数据格式和手动添加边框,有效解决了这些问题,提升了导出文件的质量和用户体验。
626 3
|
8月前
|
Java API Apache
|
8月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
618 4
|
缓存 开发框架 算法
.NET操作Excel高效低内存的开源框架 - MiniExcel
.NET操作Excel高效低内存的开源框架 - MiniExcel
278 0
.NET操作Excel高效低内存的开源框架 - MiniExcel
|
开发框架 算法 .NET
一个简单高效低内存的.NET操作Excel开源框架 - MiniExcel
一个简单高效低内存的.NET操作Excel开源框架 - MiniExcel
254 0
|
开发框架 .NET
NPOI在.net中的操作Excel
NPOI在.net中的操作Excel
148 2
|
.NET
Net操作Excel(终极方法NPOI)
前言 Asp.net/C#操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使用NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。
1125 0
|
数据库 数据格式 XML