惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 司徒正美
美团技术团队
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
T
Tailwind CSS Blog
U
Unit 42
C
Check Point Blog
S
SegmentFault 最新的问题
Martin Fowler
Martin Fowler
Stack Overflow Blog
Stack Overflow Blog
云风的 BLOG
云风的 BLOG
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
罗磊的独立博客
小众软件
小众软件
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
DataBreaches.Net

博客园 - 雪山之巅

[原创][代码]类似IE设置代理服务器那样的数据快速批量操作业务的实现 [原创]Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0) [转载整理]一本java书的序言——开发历程思绪随笔 在.NET中发送邮件,使用回执功能中遇到问题的解决方法[在NOTES服务器上,C#,.NET2.0环境] powerdesigner中生成数据库脚本时出现长度限制问题的解决方法 - 雪山之巅 - 博客园 [转]数据库存储过程中利用extproc调用共享程序库/动态链接库,间接可以实现调用操作系统命令 VS2005无法调试,绑定句柄无效问题的解决方法 部署Excel相关的应用程序过程中遇到“检索COM类工厂中CLSID...”的两个错误的解决方法 [原创][开源]整合梅花雨日历控件,推出.NET版本 [原创]Oracle数据库性能优化的方案[有删节] 两个读取数据库VIew的定义的SQL语句的写法[Oracle /SQL SERVER] [SQL使用经验]选用 IN 还是 EXISTS,哪个性能更好 [笔记]4.软件规模和开发的关系 [笔记]3.软件代码中的BUG问题的一些记录 [笔记]2.软件质量的一些统计数据 [笔记]1.软件的质量特性characteristics of software quality 一个简单的UrlRewrite示例[演示用,写给同事看的,VS2003环境] Oracle中隐式游标和显式游标的教训[同事的经历] VS2003中自定义控件的智能提示解决方案备忘
[原创]大量数据导出为Excel文件的问题解决(C#,ASP.NET)
雪山之巅 · 2007-12-21 · via 博客园 - 雪山之巅

依据SZW朋友的提醒:本文所说的Excel文件指.xls文件,不包括Excel2007的默认保存文档格式.

大量数据导出到Excel文件,一般情况有以下三个麻烦:
1.导出的执行速度要比较快,否则有http请求超时的问题;
    当然如果您是使用winForm方式就不在此列。
2.Excel文件有最多65535行数据的限制;
3.数字会有格式变成指数方式的麻烦;
    比如身份证号码,以数字方式保存后,信息末几位有丢失的情况。

解决思路:
1.使用oledb,把excel文件当作数据库处理,效率相对其他五花八门的导出方案来说,算比较高的。虽然不是最高的,但得到的excel文件是真正的二进制Excel文件,如果用户好要把导出的数据整理后导回到系统,那么恭喜了,这种方法是你最好的选择。
2.每个sheet最多最多65535行数据,但一个文件可以有很多个sheet文件,如果您要导出的数据超过65535个,那么需要设法把多余的数据放到第二、三....个sheet中去。
3.一个sheet我们可以看作是一个数据库的表,那么我们是不是可以通过定义表的字段的数据属性来保证数据的正确格式呢?

关键代码:
备注:完整的代码是偶写的工程代码,版权所有的。但大家可以根据我的思路和关键代码的提示自己完成想要的功能,呵呵
代码片段一 sheet创建:

//生成创建表的脚本
        StringBuilder sb = new StringBuilder();
        sb.Append(
"CREATE TABLE ");
        sb.Append(
"[" + tableName + "] ( ");

        
for (int i = 0; i < headers.Length; i++)
        
{
            
string datatype;
            
switch (dt.Columns[columns[i]].DataType.Name.ToLower())
            
{
                
case "float": datatype = "float"break;
                
case "int32": datatype = "int"break;
                
case "double": datatype = "double"break;
                
case "decimal": datatype = "float"break;
                
default: datatype = "text"break;
            }

            
if (i < headers.Length - 1)
            
{
                sb.Append(
string.Format("[{0}] {1},", headers[i], datatype));
            }

            
else
            
{
                sb.Append(
string.Format("[{0}] {1})", headers[i], datatype));
            }

        }

        
return sb.ToString();

大家看到了把,我们可以使用create语句创建sheet。我们使用的表的名称,将变成sheet名称。
建议大家导出的名称可以这样依次起:比如产品信息数据,表名可以分别叫 产品信息(第1页)、产品信息(第2页)等等。

代码片段二 按照需要自动创建多个sheet:

for (int i = 0; i < dt.Rows.Count; i++)
            
{
                
//创建sheet
                if (i % 65535 == 0)
                
{
                    tableName 
= string.Format("{0}Page{1}", dt.TableName, (i / 65535+ 1);
                    objCmd.CommandText 
= GetCreateSheetSQL(dt, headers, columns, tableName);
                    objCmd.ExecuteNonQuery();
                }

                
插入语句

最后提醒大家:excel作为数据库的时候,是可以支持事务处理的哦,大家别忘了使用事务机制。

如果大家处理的数据量比较小,要求的格式非常复杂,比如多重表头,有统计图形等,那么请使用其他的excel导出方法。本解决方法适用范围前面已经说过了,请大家参考。
http://piedpiper.cnblogs.com
本文是偶原创,想转贴的朋友劳驾写明转贴二字。呵呵