Работа с големи excel файлове - Програмни продукти
Какво е голям файл? И така, наистина голям? Когато бях там, си помислих, че е файл с 50-60 хиляди реда записи. И аз щях да остана в такова неведение досега, но трябваше да изпълня един проект, в който трябваше да работя с файлове от 600-800 хиляди реда.
Колко прекрасни открития имаме ... Колкото и да е странно, Google ме доведе до msdn, където се запознах с два метода за отваряне на много големи файлове: DOM и SAX. Не помня преди колко време, но един от тях падна поради OutOfMemory, който вече беше отвратителен по това време, а вторият беше напълно неизползваем по отношение на достъпа до данни. Защо - прочетете по-долу.
От какво, от какво
Нашите превъзходства са направени. За всеки, който реши да се зарови малко по-дълбоко във формата, няма да стане тайна, че за разлика от двоичния xls, xlsx е по същество zip архив с данни. Достатъчно е да промените разширението с дръжки и да разопаковате архива в папка - и ще получим цялата вътрешна структура на документа, която не е нищо повече от набор от xml файлове и свързана информация. Както се оказва, в основния xml няма текстови данни. Вместо това имаме набор от индекси, които сочат към спомагателен файл, който представлява двойки ключ/стойност. Възможен е един от начините по-горе за отваряне на този файл, но трябва да се поровите в придружаващите файлове и да извлечете текстови стойности от тях. Тъмнина.
И тъмнината се отдръпна
След много изпитания и стенания се роди следното:
Любимите ни употреби, които някои хора забравят да включат, са: използване на System;
* Този изходен код беше маркиран с инструмента за открояване на изходния код.
Всъщност самият код: public delegate void MessageHave(string message);
публичен делегат void _DataLoaded(Списък на данни);
публичен делегат невалиден_NewProcent(int col);
публичен статичен _DataLoaded DataLoaded;
публичен статичен _NewProcent NewProcent;
публично статично MessageHave MessageHave_Event;
public static void ReadData(обектни данни)
//Въвеждаме обекта с предадената двойка "име на файл" - "избран лист в Excel"
var keyValuePair = (KeyValuePair) данни;
използвайки (var cnn = new OleDbConnection(@"Prov >
keyValuePair.Key + @";Разширени свойства=""Excel 12.0;HDR=No;IMEX=1""")
MessageHave_Event("Отваряне на връзка с доставчик");