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

简介:

None.gif DataGrid导出到Excel的时候,某些数字内容显示不正确, " 3.62201E+14 " 的格式 
None.gif
None.gifWebForm中,在DataGrid的ItemDataBound事件内
None.gif
None.gif
if (e.Item.ItemType   ==   ListItemType.Item   ||   e.Item.ItemType   ==   ListItemType.AlternatingItem)
ExpandedBlockStart.gif
{
InBlock.gife.Item.Cells[
0].Attributes.Add("style","vnd.ms-excel.numberformat:@");
ExpandedBlockEnd.gif}

None.gif
None.gif在WinForm内Excel.Range  range  
=   (Excel.Range)worksheet.Cells[ 1 , 1 ];
None.gif
// 设置单元格数字内容显示格式
None.gif
range.NumberFormat   =   Excel.XlParameterDataType.xlParamTypeUnknown;
None.gif
------
None.gif
None.gif
// 设置单元格内容自动换行
None.gif
range.WrapText   =    true   ;
None.gif
// 设置单元格内容水平对齐方式
None.gif
range.HorizontalAlignment   =   Excel.XlHAlign.xlHAlignCenter;
None.gif
// 设置单元格内容竖直堆砌方式
None.gif
range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
None.gifrange.WrapText  
=    true ;
None.gif
None.gif
当前编码的一个项目中有把查询结果(显示在DataGrid)导出为excel的需求,尝试了几种方法,作为技巧拿来和大家分享。 

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


 

服务器端实现DataGrid导出为excel 

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

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

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

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



本文转自高海东博客园博客,原文链接:XXXXX,如需转载请自行联系原作者
相关文章
|
1月前
|
NoSQL 关系型数据库 MySQL
多人同时导出 Excel 干崩服务器?怎样实现一个简单排队导出功能!
业务诉求:考虑到数据库数据日渐增多,导出会有全量数据的导出,多人同时导出可以会对服务性能造成影响,导出涉及到mysql查询的io操作,还涉及文件输入、输出流的io操作,所以对服务器的性能会影响的比较大;结合以上原因,对导出操作进行排队; 刚开始拿到这个需求,第一时间想到就是需要维护一个FIFO先进先出的队列,给定队列一个固定size,在队列里面的人进行排队进行数据导出,导出完成后立马出队列,下一个排队的人进行操作;还考虑到异步,可能还需要建个文件导出表,主要记录文件的导出情况,文件的存放地址,用户根据文件列表情况下载导出文件。
多人同时导出 Excel 干崩服务器?怎样实现一个简单排队导出功能!
|
3月前
|
Java Apache Spring
springboot如何导出Excel某个表的表字段以及字段类型
springboot如何导出Excel某个表的表字段以及字段类型
32 0
|
3月前
|
关系型数据库 MySQL 数据库连接
python查询数据库的某个表,将结果导出Excel
python查询数据库的某个表,将结果导出Excel
46 0
|
2月前
|
XML Java 数据格式
使用Freemarker模版导出xls文件使用excel打开提示文件损坏
使用Freemarker模版导出xls文件使用excel打开提示文件损坏
49 0
|
1月前
|
SQL Java easyexcel
【Java】百万数据excel导出功能如何实现
【Java】百万数据excel导出功能如何实现
116 0
|
2月前
|
Java
使用POI导出Excel
使用POI导出Excel
|
2月前
|
前端开发 Java Maven
springboot优雅的实现excel的导出(自适应列宽实现,中文也行),复制可用
springboot优雅的实现excel的导出(自适应列宽实现,中文也行),复制可用
56 0
|
2月前
|
测试技术 数据处理 Python
测试报告导出PDF和excel的方法
测试报告导出PDF和excel的方法
|
3月前
|
Python
python如何导出Excel某个表的表字段以及字段类型
python如何导出Excel某个表的表字段以及字段类型
24 0