Массовая вставка из Excel в SQLite без файла TXT или CSV
У меня проблема, и я надеюсь получить от вас какой-нибудь вклад.
В принципе, мне нужно написать код в VBA, который позволяет мне взять таблицу данных из excel в sqlite.
Мне удалось это сделать, используя этот код:
- где экспортируется файл после нажатия кнопки экспорта?
- Преобразование SQLite DB в CSV, а затем в Excel без использования класса `dbhelper`
- CSV UTF-8 вставка файла в таблицу имела ошибку несоответствия типа
- SQLite предыдущее значение выбора в where where
- Думая о переходе SQLIte over Access для небольшого офисного приложения Excel
Sub Scrivi() Dim objConnection As Object, objRecordset As Object Dim strDatabase As String Set objConnection = CreateObject("ADODB.Connection") strDatabase = "DRIVER={SQLite3 ODBC Driver};Database=" & Application.ActiveWorkbook.Path & "\TestDB.db;" Query = "drop table FUND; create table FUND (Fund_Code, Fund_Name, End_Date, PRIMARY KEY('Fund_Code'));" riga = 3 colonna = 1 While Not (IsNull(ActiveSheet.Cells(row, column).Value) Or IsEmpty(ActiveSheet.Cells(row, column).Value)) Query = Query & "insert into FUND values('" & Cells(row, column) & "','" & Cells(row, column + 1) & "','" & Cells(row, column + 2) & "');" row = row + 1 Wend objConnection.Open strDatabase objConnection.Execute Query objConnection.Close End Sub
Теперь я хотел бы изменить итеративную часть, в которой я говорю row = row + 1
с разновидностью объемной вставки, в которой программа принимает всю таблицу вместо того, чтобы делать это по строке.
Я не хочу создавать файл csv / txt, если это возможно.
Большое спасибо, любой вклад будет оценен.
- Простейший рабочий процесс для перемещения текстовой базы данных excel на другую платформу
- Расчет уровня заполнения бака через SQLite
- Excel для SQLite в android
- Как читать данные из файлов Excel и вставлять их в базу данных Sqlite с помощью PHP
- Rails отображает столбцы файла excel в столбцы db
- как скопировать данные из локального листа Excel в таблицу базы данных sqlite в android
- Экспорт базы данных SQLite в Excel из PHP
- Как получить доступ к SQLite из VBA?
Решением самого базового уровня может быть первое построение полного запроса для массовой вставки, а затем выполнение запроса за один раз.
Например –
вставить в значения FUND (val1, val2); вставить в значения FUND (val3, val4);
можно заменить на – вставить в значения FUND (val1, val2), (val3, val4)
вы можете добавить все данные из листа. Перейдите в массив (вариант)
Dim arr as Variant arr = Application.Transpose(range(your_range_of_data).values)
и затем, используя данные в массиве, постройте строку запроса SQL, используя этот шаблон
INSERT INTO table (column1, column2, ... ) VALUES (expression1, expression2, ... ), (expression1, expression2, ... ), ...;
Функция VBA (написана «на колене», поэтому может потребоваться небольшая настройка, извините)
Function buildQueryFromArray(arr as Variant, table as String, columns as String) as String Dim strSqlQuery as String * 4096 Dim i as Integer strSqlQuery = "INSERT INTO " & table & " (" & columns & ") VALUES" For i=LBound(arr, 1) to UBound(arr, 1) strSqlQuery = strSqlQuery & "(" & arr(i,1) & ", " & arr(i,2) & "etc" & ")," Next i buildQueryFromArray = Left(strSqlQuery, len(strSqlQuery)-1) & ";" End Function
Причина использования массива вместо захвата данных непосредственно с рабочего листа: намного быстрее. Вы можете прочитать больше здесь: http://www.cpearson.com/excel/ArraysAndRanges.aspx lemme знает, работает ли это для вас:)
РЕДАКТИРОВАТЬ:
Ad1: вы правы, мы фактически не хотим его переносить. однако я привык писать так из-за причин, которые хорошо описаны в статье № 7 в этом разделе: mrexcel.com/forum/ Почему мы используем application.transpose?
Ad2: нет, он не должен функционировать, если это ваш вопрос, но он делает код чистым и более многоразовым. Ниже вы найдете встроенное решение:
Sub Scrivi() Dim objConnection As Object, objRecordset As Object Dim strDatabase As String, strQuery as String Set objConnection = CreateObject("ADODB.Connection") strDatabase = "DRIVER={SQLite3 ODBC Driver};Database=" & Application.ActiveWorkbook.Path & "\TestDB.db;" strQuery = "drop table FUND; create table FUND (Fund_Code, Fund_Name, End_Date, PRIMARY KEY('Fund_Code')); insert into FUND values" 'determine how many rows of data there is Dim lastRow as Integer lastRow = ActiveSheet.Range("A:A").Find("*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 'transfer all data from range to array 'range: from A3 to Cx, where x equals to lastRow Dim arr as Variant arr = ActiveSheet.Range("A3:C" & lastRow).Value 'add all records from arr into single SQL query 'Lbound(xArray, xDimension)/Ubound(xArray, xDimension) - returns integer equal to first/last xArray item in xDimension. Everyday-use function. Google some more to have better insight of whats going on Dim i as Integer For i=Lbound(arr,1) to Ubound(arr,1) strQuery = strQuery & "(" & arr(i,1) & "," & _ arr(i,2) & "," & _ arr(i,3) & ")," Next i 'from the strQuery - swap last comma for semi-colon strQuery = Left(strQuery, len(strQuery)-1) & ";" objConnection.Open strDatabase objConnection.Execute strQuery objConnection.Close
Лемме знаю, все ли ясно 🙂