通过c#web服务将大量数据从sql server传输到Excel文件

问题描述:

所以我试图从存储过程(200k rows +)中将结果从ASP.NET中导入到Excel文件中,但有一些困难。我不认为csv是一个选项,因为客户希望数字格式正确。我已经尝试了三个第三方Excel库,但都有这么多的数据,并且使用了千兆字节的内存。通过c#web服务将大量数据从sql server传输到Excel文件

我写了一些代码来生成一个Excel XML文件,它运行速度非常快,但文件超过300megs。如果我打开并保存为本地Excel文件,它会将其降至30megs。目前,我的最佳解决方案是在服务器上压缩这个xml文件,将其压缩到7megs,但用户仍然会解压缩一个巨大的文件。理想情况下,我想找到一个第三方Excel库,可以在不杀死服务器的情况下编写具有200,000多行的本机Excel文件,有什么想法?

+0

您正在写什么版本的Excel? 'xls'或'xlsx'? – 2011-02-23 13:49:49

+0

您是否尝试过使用Excel原生COM API? [链接](http://support.microsoft.com/kb/302084) – 2011-02-23 13:50:13

+0

只要它在Excel 2007中以xls或xlsx打开,文件格式并不重要。还没有尝试COM API,因为我认为需要在服务器上安装Excel? (不是一个选项) – nzyme 2011-02-23 13:58:55

我最终自己生成了一个xlsx,事实证明这个格式非常简单

这是一个非常快速的POC,我写了3列255个字符200,000次(600,000个单元格)。最终文件在我的机器上以4.85MB进入。

 string ExportFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.xlsx"); 
     string DSN = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES\";", ExportFile); 

     using (System.Data.OleDb.OleDbConnection Con = new System.Data.OleDb.OleDbConnection(DSN)) 
     { 
      Con.Open(); 
      using (System.Data.OleDb.OleDbCommand Com = new System.Data.OleDb.OleDbCommand()) 
      { 
       Com.Connection = Con; 
       Com.CommandText = "CREATE TABLE [TestSheet] (A1 varChar(255), B1 varChar(255), C1 varChar(255))"; 
       Com.ExecuteNonQuery(); 
       string A1 = new string('A', 255); 
       string B1 = new string('B', 255); 
       string C1 = new string('C', 255); 
       Com.CommandText = string.Format("INSERT INTO [TestSheet] (A1, B1, C1) VALUES ('{0}', '{1}', '{2}')", A1, B1, C1); 
       for (var i = 1; i <= 200000; i++) 
       { 
        Com.ExecuteNonQuery(); 
       } 
      } 
      Con.Close(); 
     } 

在服务器上我不能肯定所有什么需要,但你可能必须安装此:

http://www.microsoft.com/downloads/en/details.aspx?familyid=7554f536-8c28-4598-9b72-ef94e038c891&displaylang=en

+0

感谢这看起来像它有潜力。当我在机器上运行你的代码时,我只能生成多达8,000行左右的行,再给我一个空白的xls。如果我减少可以产生更多的弦的长度,那么有什么想法会发生什么? – nzyme 2011-02-23 15:06:54

+0

你能给我发送它生成的文件吗?我的电子邮件地址在我的档案中。 – 2011-02-23 15:56:59

最终Excel是一个平面文件系统和SQL是赚不到兼容性有趣。我希望克里斯哈斯的代码能为你工作。这看起来很奇怪,'我不认为csv是一种选择,因为客户希望数字格式正确。 '如果他们有一个SQL数据库,他们不引用/查询,而不是拥有数据库的excel版本?

+0

公平的问题和一个我问我自己,但他们支付这个,而不是我:) – nzyme 2011-02-23 15:09:15

+0

通常我见证了我曾经工作过的公司,当他们想要操纵数据本身,但我会考虑这是一种特殊的操作,而不是一项共同的任务。唉,商业世界并不总是理解'编码'世界=) – Coops 2011-02-23 15:19:33