Потоковая передача больших объемов данных с сервера sql в файл Excel через веб-сервис c # - PullRequest
0 голосов
/ 23 февраля 2011

Итак, я пытаюсь получить результаты из сохраненного процесса (200k строк +) в файл Excel из ASP.NET, но у меня возникли некоторые трудности.Я не думаю, что CSV это вариант, так как клиент хочет, чтобы числа были правильно отформатированы.Я перепробовал три сторонние библиотеки Excel, но все они перегружены таким большим количеством данных и используют гигабайты памяти.

Я написал некоторый код для создания файла Excel XML, и он работает очень быстро, но размер файла превышает 300 мегабайт.Если я открою и сохраню как собственный файл Excel, он получит 30 мегабайт.На данный момент мое лучшее решение - это заархивировать этот xml-файл на сервере, который до 7 мегабайт, но пользователь все равно получит огромный файл после распаковки.В идеале я хотел бы найти стороннюю библиотеку Excel, которая может написать собственный файл Excel с 200 000+ строками, не убивая сервер, есть идеи?

Ответы [ 3 ]

0 голосов
/ 23 февраля 2011

В конечном счете, excel - это плоская файловая система, а SQL не делает совместимость интересной. Я надеюсь, что код Криса Хааса будет работать для вас. Это кажется странным: «Я не думаю, что csv - это вариант, так как клиент хочет, чтобы числа были правильно отформатированы. 'если у них есть база данных SQL, они не обращаются к ней / не запрашивают ее вместо версии базы данных в формате Excel?

0 голосов
/ 03 марта 2011

Я сам сгенерировал xlsx, оказалось, что формат довольно прост

0 голосов
/ 23 февраля 2011

Вот очень быстрый POC, который я сделал, который записывает 3 столбца по 255 символов 200 000 раз (600 000 ячеек).Окончательный размер файла на моем компьютере составляет 4,85 МБ.

        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

...