ADO доступ до таблиці Excel

Після невеликого ознайомлення з документацією з ADO читанням MSDN виникла ідея

звернутися до таблиці excel як до звичайної таблиці якоїсь БД через запит.

Єдине умова такого завдання таблиця має бути одна на аркуші.

Наводжу код, що використовується у функції, в моїй обробці користувачам вибирав

список колонок для завантаження, тому у запиті використовувалися системні імена,

суть має бути зрозумілою.

Опишу коротко поточний алгоритм:

1.Створюю COM об'єкт .

2.Отримую список аркушів файла. (використовуватиметься в подальшому запиті).

3. Формую рядок необхідних полів (за обраним користувачем колонкам)

5.Виконую запит до файлу.

6.Збираю таблицю для подальшої обробки.

// Створення об'єкта для встановлення зв'язку з джерелом даних Connection = Новий COM Об'єкт ("ADODB.Connection");

// сформуємо рядок підключення // Якщо необхідно надалі оперувати цифровими значеннями колонок, то ставимо ознаку HDR = NO // Якщо необхідно робити завантаження з урахуванням псевдонімів в 1-му рядку, то ставимо HDR = YES

РядокПідключення = "Prov > + Ім'яФайлаЗавантаження ; РядокПідключення = РядокПідключення + "; Extended Properties = " + """Excel 8.0" + ";HDR=NO;IMEX=1"";" ;

// Підключення до джерела даних Спроба

Connection. Open (Рядок Підключення);

Повідомити ( ОписПомилки ()); Повернення;

// Створення об'єкта виконання команди Command = Новий COM Об'єкт ("ADODB.Command");

// Створення об'єкта підключення до файлу axCatalog = Новий COM Об'єкт ("ADOX.Catalog"); axCatalog. ActiveConnection = Connection;

// отримаємо аркуші документа , // для обробки колонок аркушаможна звернутися до колекції Аркуш .Columns, яку теж можна обійти за допомогою циклу Для кожного счЛіста = 1; Для кожного Аркуш З axCatalog. Tables Цикл

Якщо счЛіста = ЕлементиФорми. НомерЛіста. Значення Тоді

// Отримаємо ім'я т абліці, потім будемо використовувати в запиті // Ім'я Таблиці = Середовище ( Рядок ( Лист .Name),2, СтрДліна ( Рядок ( & gt; Аркуш .Name))-1); Ім'яТаблиці = Лист. Name;

счЛіста = счЛіста + 1;

// відсортуємо таблицю колонок, які необхідно завантажити // щоб надалі при обробці RecordSet могли не турбуватися про послідовність обробки

ТаблицяКолонок . Сортувати ("НумерКолонки Возр");

// Зберемо частину запиту, а саме імена використовуваних колонок // за умовчанням ім'я колонки виглядає таким чином F1, F2 і т.д. д

Для кожного РядокТаблиці З ТаблицяКолонок Цикл

Текст ЗапитуКолонки = ТекстЗапитуКолонки +?

// Додамо колонку в таблицю завантаження Таблиця Завантаження. Колонки. Додати (РядокТаблиці. Ім'яКолонки); // соотв. колонки йдуть гаразд зростання , т . до ми відсортували таблицю раніше

// Зберемо рядок використовуваних колонок для запису в регістр Журнал Обновлень Серійних Номерів, в кінці завантаження Рядок Колонки = Рядок Колонки + ? ( Рядок Колонки = " " , Рядок Таблиці .

// Створення об'єкта набору записів RecordSet = Новий COM Об'єкт ("ADODB.RecordSet");

// Вказівка ​​активного з'єднання Command. ActiveConnection = Connection;

// Отримаємо кількість рядків у документі Command. CommandText = "SELECT COUNT(*)FROM [" +Ім'яТаблиці + "]";

// Визначення типу команди Command. CommandType = 1;

// Виконання та отримання набору даних RecordSet = Command .Execute (); // перший запис ця кількість КількістьСторок = RecordSet . Fields (0). Value; // Визначення тексту команди Command. CommandText = "SELECT" + Текст ЗапитуКолонки + "FROM [" + Ім'яТаблиці + "]" ;

// Визначення типу команди Command. CommandType = 1;

// Виконання та отримання набору даних Спроба RecordSet = Command .Execute(); Виняток Повідомити ( ОписПомилки ()); КінецьСпроби;

RecordSet. MoveNext(); //Т. до першого рядка це заголовки таблиць, не будемо її враховувати

Поки RecordSet. EOF() = 0 Цикл

Рядок Табличної Частини = Таблиця Завантаження. Додати ();

сч = 0; Для кожного Колонка З ТаблицяЗавантаження . Колонки Цикл

РядокТаблічноїЧасти [ Колонка . Ім'я] = СокрЛП (Рядок (RecordSet. Fields (рах.). Value)); сч = сч + 1;

RecordSet. Close (); Connection. Close ();

Отже на виході ми отримали Таблицю Завантаження, яку можна обробити за своїм бажанням.

відзначити, що всі значення виходять рядкового типу, тому необхідно потім їх правильно обробити.

Але овчинка коштує вичинки, приріст швидкості справді суттєвий. Що найцікавіше у процесі роботи

з файлом excel як із COM об'єктом можна отримувати всі необхідні властивості та звертатися до потрібних аркушів.

Запит можна побудувати важче з фільтрами та об'єднаннями, так що поле для дій величезне.

Скажу чесно даний механізм раджу використовувати при роботі виключно з великими файлами,

зменшення часу обробки з 12 хвилин до 20 секунд.