本文所说的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创建:
大量数据导出为Excel文件(转贴)_数据库//生成创建表的脚本
大量数据导出为Excel文件(转贴)_数据库
        StringBuilder sb = new StringBuilder();
大量数据导出为Excel文件(转贴)_数据库        sb.Append(
"CREATE TABLE ");
大量数据导出为Excel文件(转贴)_数据库        sb.Append(
"[" + tableName + "] ( ");
大量数据导出为Excel文件(转贴)_数据库
大量数据导出为Excel文件(转贴)_数据库        
for (int i = 0; i < headers.Length; i++)
大量数据导出为Excel文件(转贴)_i++_07大量数据导出为Excel文件(转贴)_代码片段_08        
大量数据导出为Excel文件(转贴)_数据库_09{
大量数据导出为Excel文件(转贴)_i++_10            
string datatype;
大量数据导出为Excel文件(转贴)_i++_10            
switch (dt.Columns[columns[i]].DataType.Name.ToLower())
大量数据导出为Excel文件(转贴)_数据_12大量数据导出为Excel文件(转贴)_i++_13            
大量数据导出为Excel文件(转贴)_数据库_09{
大量数据导出为Excel文件(转贴)_i++_10                
case "float": datatype = "float"break;
大量数据导出为Excel文件(转贴)_i++_10                
case "int32": datatype = "int"break;
大量数据导出为Excel文件(转贴)_i++_10                
case "double": datatype = "double"break;
大量数据导出为Excel文件(转贴)_i++_10                
case "decimal": datatype = "float"break;
大量数据导出为Excel文件(转贴)_i++_10                
default: datatype = "text"break;
大量数据导出为Excel文件(转贴)_代码片段_20            }

大量数据导出为Excel文件(转贴)_i++_10            
if (i < headers.Length - 1)
大量数据导出为Excel文件(转贴)_数据_12大量数据导出为Excel文件(转贴)_i++_13            
大量数据导出为Excel文件(转贴)_数据库_09{
大量数据导出为Excel文件(转贴)_i++_10                sb.Append(
string.Format("[{0}] {1},", headers[i], datatype));
大量数据导出为Excel文件(转贴)_代码片段_20            }

大量数据导出为Excel文件(转贴)_i++_10            
else
大量数据导出为Excel文件(转贴)_数据_12大量数据导出为Excel文件(转贴)_i++_13            
大量数据导出为Excel文件(转贴)_数据库_09{
大量数据导出为Excel文件(转贴)_i++_10                sb.Append(
string.Format("[{0}] {1})", headers[i], datatype));
大量数据导出为Excel文件(转贴)_代码片段_20            }

大量数据导出为Excel文件(转贴)_解决方法_33        }

大量数据导出为Excel文件(转贴)_数据库        
return sb.ToString();

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

代码片段二 按照需要自动创建多个sheet:
大量数据导出为Excel文件(转贴)_数据库for (int i = 0; i < dt.Rows.Count; i++)
大量数据导出为Excel文件(转贴)_i++_07大量数据导出为Excel文件(转贴)_代码片段_08            
大量数据导出为Excel文件(转贴)_数据库_09{
大量数据导出为Excel文件(转贴)_i++_10                
//创建sheet
大量数据导出为Excel文件(转贴)_i++_10
                if (i % 65535 == 0)
大量数据导出为Excel文件(转贴)_数据_12大量数据导出为Excel文件(转贴)_i++_13                
大量数据导出为Excel文件(转贴)_数据库_09{
大量数据导出为Excel文件(转贴)_i++_10                    tableName 
= string.Format("{0}Page{1}", dt.TableName, (i / 65535+ 1);
大量数据导出为Excel文件(转贴)_i++_10                    objCmd.CommandText 
= GetCreateSheetSQL(dt, headers, columns, tableName);
大量数据导出为Excel文件(转贴)_i++_10                    objCmd.ExecuteNonQuery();
大量数据导出为Excel文件(转贴)_代码片段_20                }

大量数据导出为Excel文件(转贴)_i++_13大量数据导出为Excel文件(转贴)_数据_12                
插入语句#region 插入语句
大量数据导出为Excel文件(转贴)_i++_10                sb.Append(
"INSERT INTO ");
大量数据导出为Excel文件(转贴)_i++_10                sb.Append(
"[" + tableName + "] ( ");
大量数据导出为Excel文件(转贴)_解决方法_33大量数据导出为Excel文件(转贴)_数据库_09大量数据导出为Excel文件(转贴)_数据库_09大量数据导出为Excel文件(转贴)_数据库_09大量数据导出为Excel文件(转贴)_数据库_09.

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

如果大家处理的数据量比较小,要求的格式非常复杂,比如多重表头,有统计图形等,那么请使用其他的excel导出方法。本解决方法适用范围前面已经说过了,请大家参考。