Что нового

В Excel из Базы данных

Genics

Новичок
Сообщения
39
Репутация
0
Версия AutoIt: v3.3.10.2
Примечание: Операционная система: Microsoft Windows 7 Max Service Pack 1 x64
Excel 2010
База Данных: SQLite3

Нужен скрипт при запуске которого данные из файлов баз данных (их 8 штук) скидывает в таблицу Excel. После скрипт прекращает работу.

Графическое пояснение что куда кидать:
Рисунок_1.png



Файлы баз данных во вложении. Строки таблиц в БД это столбцы в таблице Excel. Количество строк в таблице базы данных может быть более 1, поэтому считывать и кидать в Excel при запуске скрипта надо самую последнюю строку (последнюю запись).

В файле Excel PROTOCOL_ISO.xlsx 2 листа, файл открывается с первого а кидать надо в таблицу на втором листе.
Обязательно необходимо что бы скрипт работал в указанной версии AutoIt.
DLL для баз данных тоже во вложении sqlite3.dll
 

Вложения

  • Вложенные файлы.zip
    374.9 КБ · Просмотры: 2

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Значение в ячейку "J9" не стал заморачиваться с форматом ячеек - записал с апострофом (как текст) , можете сами поиграться с форматом, скрипт располагаете рядом с папками "DB_PROTOCOL" и "TEMP_ISO".
Насчёт версии AutoIt - попробуйте, я уже не помню , с какой версии обновился "Excel.au3" :
Код:
#include <SQLite.au3>
#include <array.au3>
#include <excel.au3>

$oExcel = _Excel_Open(False)
$oExcBook = _Excel_BookOpen($oExcel, @ScriptDir & '\TEMP_ISO\PROTOCOL_ISO.xlsx')

_SQLite_Startup(False)
If @error > 0 Then
    MsgBox(16, 'SQLite Ошибка', 'SQLite.dll Не может быть загружен!')
    _Exit()
EndIf

$aBaseName = _Excel_RangeRead($oExcBook, 2, 'D11:K11')

For $j = 0 To UBound($aBaseName, 2) - 1
    $TabName = $aBaseName[0][$j]
    If $TabName = 'dpmpmax       A B' Then $TabName = 'DataTable'

    $dbn = _SQLite_Open(@ScriptDir & '\DB_PROTOCOL\DB_ISO17089_' & $TabName & '.db')

    Local $aResult, $iRows, $iColumns
    $iRval = _SQLite_GetTable2d(-1, 'SELECT * FROM ' & $TabName & ';', $aResult, $iRows, $iColumns)
    If $iRval = $SQLITE_OK Then
        If $TabName <> 'DataTable' Then
            For $i = 0 To UBound($aResult, 2) - 1
                _Excel_RangeWrite($oExcBook,2, $aResult[1][$i], Chr(68 + $j) & $i + 15)
            Next
        Else
            _Excel_RangeWrite($oExcBook, 2, $aResult[1][0], 'K15')
            _Excel_RangeWrite($oExcBook,2, $aResult[1][1], 'K16')
            _Excel_RangeWrite($oExcBook, 2, $aResult[1][2], 'E9')
            _Excel_RangeWrite($oExcBook, 2, "'"&$aResult[1][3], 'J9')
        EndIf
        _SQLite_Close($dbn)
    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
        _Exit()
    EndIf
Next

_Exit()
Func _Exit() ; Выход
    _SQLite_Close($dbn)
    _SQLite_Shutdown()
    _Excel_Close($oExcel )
    MsgBox(48,'','Готово !!!',3)
    Exit
EndFunc   ;==>_Exit
 
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
Приветствую тебя ra4o :bye:
Я проверил но у меня не заработало. Кажется у нас файлы <SQLite.au3><array.au3><excel.au3> отличаются.
Вложил мои версии. Переделай пожалуйста что бы с моими работало
 

Вложения

  • Include.zip
    28.6 КБ · Просмотры: 3

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Пробуйте под старую UDF "Excel.au3" (array.au3 не нужен, SQLite.au3 вроде бы не менялся)
Код:
#include <SQLite.au3>
#include  <excel.au3>

$oExcBook = _ExcelBookOpen(@ScriptDir & '\TEMP_ISO\PROTOCOL_ISO.xlsx')
_ExcelSheetActivate($oExcBook,2)

_SQLite_Startup(False)
If @error > 0 Then
    MsgBox(16, 'SQLite Ошибка', 'SQLite.dll Не может быть загружен!')
    _Exit()
EndIf

For $j = 0 To 7
    $aBaseName = _ExcelReadCell($oExcBook, Chr(68 + $j) & 11)
    $TabName = $aBaseName
    If $TabName = 'dpmpmax       A B' Then $TabName = 'DataTable'

    $dbn = _SQLite_Open(@ScriptDir & '\DB_PROTOCOL\DB_ISO17089_' & $TabName & '.db')

    Local $aResult, $iRows, $iColumns
    $iRval = _SQLite_GetTable2d(-1, 'SELECT * FROM ' & $TabName & ';', $aResult, $iRows, $iColumns)
    If $iRval = $SQLITE_OK Then
        If $TabName <> 'DataTable' Then
            For $i = 0 To UBound($aResult, 2) - 1
                _ExcelWriteCell($oExcBook,$aResult[1][$i], Chr(68 + $j) & $i + 15)
            Next
        Else
            _ExcelWriteCell($oExcBook, $aResult[1][0], 'K15')
            _ExcelWriteCell($oExcBook,$aResult[1][1], 'K16')
            _ExcelWriteCell($oExcBook, $aResult[1][2], 'E9')
            _ExcelWriteCell($oExcBook, "'"&$aResult[1][3], 'J9')
        EndIf

        _SQLite_Close($dbn)
    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
        _Exit()
    EndIf

Next


_Exit()
Func _Exit() ; Выход
    _SQLite_Close($dbn)
    _SQLite_Shutdown()
   ; _ExcelBookClose($oExcBook)
    MsgBox(48,'','Готово !!!',3)
    Exit
EndFunc   ;==>_Exit
 
Последнее редактирование:
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
Сейчас всё работает, но не так как мне удобно.
Согласен это моя вина, не описал нужную последовательность действий. Исправляю свою ошибку.

Уточню что файл PROTOCOL_ISO.xlsx это шаблон. Он должен иметь свойство «только для чтения». Он всегда пустой.

Нужна работа скрипта в такой последовательности:
1. Скрипт читает базы данных
2. Открывает файл PROTOCOL_ISO.xlsx в Excele
3. Переходит на 2 страницу
4. Заполняет таблицу данными
5. Закрывает работу с БД и прекращает свою работу
6. Excel остаётся открытым и я решаю сохранить его или нет и с каким названием.
 
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
Спасибо ra4o :yes:

Сейчас всё работает! Тема закрыта
Сообщение автоматически объединено:

Последние тесты показали что скрипт не совсем правильно работает.
В описании необходимой работы скрипта я писал что:
Количество строк в таблице базы данных может быть более 1, поэтому считывать и кидать в Excel при запуске скрипта надо самую последнюю строку (последнюю запись).

Так вот сейчас скрипт читает только самые первые строки (т. е. всегда одну и ту же)
А надо что бы читал самую последнюю.

ra4o если можно исправь пожалуйста
 
Последнее редактирование:

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
А надо что бы читал самую последнюю.
Тогда так :
Код:
#include <SQLite.au3>
#include <excel.au3>

$oExcBook = _ExcelBookOpen(@ScriptDir & '\TEMP_ISO\PROTOCOL_ISO.xlsx', False)
_ExcelSheetActivate($oExcBook, 2)

_SQLite_Startup(False)
If @error > 0 Then
    MsgBox(16, 'SQLite Ошибка', 'SQLite.dll Не может быть загружен!')
    _Exit()
EndIf

For $j = 0 To 7

    $TabName = _ExcelReadCell($oExcBook, Chr(68 + $j) & 11)
    If $TabName = 'dpmpmax       A B' Then $TabName = 'DataTable'

    $dbn = _SQLite_Open(@ScriptDir & '\DB_PROTOCOL\DB_ISO17089_' & $TabName & '.db')

    Local $aResult, $iRows, $iColumns
    $iRval = _SQLite_GetTable2d(-1, 'SELECT * FROM ' & $TabName & ';', $aResult, $iRows, $iColumns)
    If $iRval = $SQLITE_OK Then

        $MaxIndex = UBound($aResult) - 1

        If $TabName <> 'DataTable' Then
            For $i = 0 To UBound($aResult, 2) - 1
                _ExcelWriteCell($oExcBook, $aResult[$MaxIndex][$i], Chr(68 + $j) & $i + 15)
            Next
        Else
            _ExcelWriteCell($oExcBook, $aResult[$MaxIndex][0], 'K15')
            _ExcelWriteCell($oExcBook, $aResult[$MaxIndex][1], 'K16')
            _ExcelWriteCell($oExcBook, $aResult[$MaxIndex][2], 'E9')
            _ExcelWriteCell($oExcBook, "'" & $aResult[$MaxIndex][3], 'J9')
        EndIf

        _SQLite_Close($dbn)
    Else

        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
        _Exit()

    EndIf

Next

_Exit()
Func _Exit() ; Выход
    _SQLite_Close($dbn)
    _SQLite_Shutdown()
    _ExcelBookClose($oExcBook)
    MsgBox(48, '', 'Готово !!!', 3)
    Exit
EndFunc   ;==>_Exit
 
Верх