Asp.net中把DataTable或DataGrid导出为Excel-阿里云开发者社区

开发者社区> 老朱教授> 正文

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

简介:
+关注继续查看

None.gifDataGrid导出到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 

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

 1ExpandedBlockStart.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        /// 修改日期:
 
 9None.gif        public static void DataGrid2Excel(System.Web.UI.WebControls.DataGrid dgData) 
10ExpandedBlockStart.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"), 03); 
7 }

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



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

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

 1ExpandedBlockStart.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        /// 修改日期:
 
 9None.gif        public static void DataTable2Excel(System.Data.DataTable dtData) 
10ExpandedBlockStart.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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【springboot+easypoi】大数据量excel导出
上次写了一行代码解决导出导入,没看的小伙伴建议先看下《【springboot+easypoi】一行代码搞定excel导入导出》,但是实际业务中遇到一个问题,如果数据里比较大的时候,例如10w+数据一次导出,就会出现卡死情况,继续看官方文档,有大数据量...
2772 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4475 0
【springboot+easypoi】一行代码搞定excel导入导出
我们不造轮子,只是轮子的搬运工。(其实最好是造轮子,造比别人好的轮子) 开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事儿,此处推荐一个别人造好的轮子【easypoi】,下面介绍下“轮子”的使用。
3326 0
WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]
原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇] 元数据的导出就是实现从ServiceEndpoint对象向MetadataSet对象转换的过程,在WCF元数据框架体系中,元数据的导出工作由MetadataExporter实现。
785 0
VB.NET版机房收费系统---导出Excel表格
       datagridview,翻译成中文的意思是数据表格显示,使用DataGridView控件,可以显示和编辑来自不同类型的数据源的表格,将数据绑定到DataGridView控件非常简单和直观,大多数情况下,只需要设置DataSource属性即可,在绑定到包含多个列表或表的数据库源时,只需将DataMember属性设置为绑定的列表或表的字符串即可。
1222 0
C# DataGridView 导出 Excel(根据Excel版本显示选择不同后缀格式xls或xlsx)
/// /// DataGridView导出至Excel,解决问题:打开Excel文件格式与扩展名指定格式不一致 /// /// 数据源表格 /// 导出时是否显示excel界面 /// ...
1541 0
DataGridView导出到Excel的三个方法
原文:[转]DataGridView导出到Excel的三个方法 原文出处:http://www.yongfa365.com/Item/DataGridViewToExcel.html #region DataGridView数据显示到Excel /// /// 打开Excel并将DataGr...
914 0
+关注
3271
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载