2016-09-28 18 views
0

У меня есть огромный набор данных, который мне нужно импортировать из Excel в Access (~ 800k строк). Тем не менее, я могу игнорировать строки с определенным значением столбца, которые составляют 90% фактического набора данных. Так что на самом деле мне действительно нужно как 10% импортированных строк.Импорт огромного набора данных в Access из Excel через VBA

В прошлом я импортировать Excel файлов строки построчно следующим образом (псевдо-код):

For i = 1 To EOF 
    sql = "Insert Into [Table] (Column1, Column2) VALUES ('" & _ 
    xlSheet.Cells(i, 1).Value & " ', '" & _ 
    xlSheet.Cells(i, 2).Value & "');"  
Next i 
DoCmd.RunSQL sql 

С ~ 800k линий это занимает waaay до тех пор, пока для каждой линии а запрос будет создан и запущен.

Учитывая тот факт, что я также могу игнорировать 90% строк, какой самый быстрый подход для импорта набора данных из Excel в Access?

Я думал о создании временного файла excel с активированным фильтром. И тогда я просто импортирую фильтрованное превосходство.

Но есть ли более быстрый или быстрый подход? Кроме того, какой самый быстрый способ импортировать excel через vba-доступ?

Заранее спасибо.

+0

VB.NET не vba. Это так правильно на теге. – Plutonix

+0

1.) Можете ли вы удалить 90% строк для уменьшения данных, с которыми имеете дело? 2.) Это одноразовая операция, или вы будете многократно это делать? Это изменит, насколько важно ваше решение. Обычно RDBMS позволяет импортировать из Excel, CSV, XML и т. Д. В таблицу (таблицы) базы данных. Это ручной шаг, но если это вам понадобится один раз, это может быть самым быстрым и простым ... –

+0

Вы можете запросить лист Excel с помощью ADO и сделать это с помощью ADO и SQL. –

ответ

1

Рассмотрите возможность запуска специального запроса Access для импорта. Добавьте ниже SQL в окно запроса Access или SQL-запрос в DAO/ADO-соединение. Включите любые WHERE положения, которые требуют именованных заголовки столбцов, прямо сейчас, установленного в HDR:No:

INSERT INTO [Table] (Column1, Column2) 
SELECT * 
FROM [Excel 12.0 Xml;HDR=No;Database=C:\Path\To\Workbook.xlsx].[SHEET1$]; 

В качестве альтернативы, запустить Make-таблицу запрос в случае, если вам нужен стол постановки Темпа (для удаления 90% линий) до окончательного таблица, но учтите, этот запрос заменяет таблицу, если существует:

SELECT * INTO [NewTable] 
FROM [Excel 12.0 Xml;HDR=No;Database=C:\Path\To\Workbook.xlsx].[SHEET1$]; 
+0

, используя dao по линейному подходу, резко увеличил скорость, спасибо большое! – CoffeeCups

+0

Удивительный! Действительно SQL обрабатывает задание одновременно, а не итеративно. Рад, что смог помочь. – Parfait

0

небольшое изменение в коде будет делать фильтрацию для вас:

Dim strTest As String 
For i = 1 To EOF 
    strTest=xlSheet.Cells(i, 1).Value 
    if Nz(strTest)<>"" Then 
     sql = "Insert Into [Table] (Column1, Column2) VALUES ('" & _ 
     strTest & " ', '" & _ 
     xlSheet.Cells(i, 2).Value & "');" 
      DoCmd.RunSQL sql 
     End If 
Next i 

I Ассу я, имеющий RunSQL вне цикла, был просто ошибкой в ​​вашем псевдокоде. Эти тесты для ячейки в первом столбце должны быть пустыми, но вы можете заменить любое условие, соответствующее вашей ситуации.

+0

спасибо за вход, к сожалению, этот подход все еще был намного медленнее, чем с дао – CoffeeCups

Смежные вопросы