雪山之巅的阳光

冰雪天地的清冷,超凡脱俗的时空,一缕色彩,点缀在清蓝的背景中....那就是——雪山之巅的阳光

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
依据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
本文是偶原创,想转贴的朋友劳驾写明转贴二字。呵呵
posted on 2007-12-21 15:52  雪山之巅  阅读(11390)  评论(12编辑  收藏  举报