P
PeknicAug. 12, 2016, 5:14 a.m.

Подключение внешней базы данных Excel

Excel, Qt, база данных

Дали задание сделать подключаемую базу данных. Решил что удобнее будет в Excel. База данных с параметрами объектов к которым надо будет обращаться. Она подключается также как и написанная в Qt или как-то по другому? Ну а обращение к элементам одинаково?
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

11
Evgenii Legotckoi
  • Aug. 13, 2016, 3:40 a.m.
Вообще, назвать документ Excel базой данных у меня как-то язык не поворачивается.
Это же файл с таблицами, в которых используются разделители определённых типов, например точка с запятой. Наиболее простым вариантом такого формат является формат CSV.
На сайте имеется урок по работе с CSV в Qt, можете там посмотреть, как с ним работать.
А вообще с файлами Excel в Qt всё печально. Это же по сути проприетарный формат и Qt не занимается его поддержкой. Поэтому готовых классов по работе с файлами Excel в Qt нет. Необходимо либо парсить файл Excel и разбирать его до основания, либо найти стороннюю библиотеку, которая даст весь необходимый для работы функционал.
А если Вы имели ввиду работу, например как, через QSqlDatabase, то вы ошиблись. Здесь механика работы совершенно различна.
    P
    • Aug. 16, 2016, 4:54 a.m.
    Т.е. я могу заполнить базу в Еxcel,сохранить ее формате csv (разделители-запятые) и подключить к проекту. Тогда обращаться к объектам как в Qsqldatabase я несмогу. Поэтому у меня возникают вопросы, как подключить такую базу и как оперировать с ее элементами? Спасибо!
      Evgenii Legotckoi
      • Aug. 16, 2016, 5:05 a.m.

      При сохранении в CSV скорее всего все связи и настройки будут утеряны.
      CSV является простейшим форматом. Если нужна сортировка, связи таблиц и прочие настройки, которые сделаете в Excel, то нужно будет всё-таки разбираться с форматом Excel и парсить его, но это довольно нетривиальная задача.

      Так что наиболее логичным будет поискать готовые решения по работе с Excel файлами.

      Впрочем, кажется я немного ошибся. Можно попробовать подключить файл с помощью драйвера QODBC. Вот ссылка Обработка Microsoft Excel в Qt

      Там же есть список готовых библиотек.

        P
        • Aug. 16, 2016, 8:29 a.m.

        Спасибо, попробую реализовать.

        Но если использовать Excel просто для составления самой простой таблицы, без связей и настроек, то при сохранении в csv все останется рабочим. Если делать так то должно работать? Если да, то вопрос еще актуален.

          Evgenii Legotckoi
          • Aug. 16, 2016, 8:45 a.m.

          Если использовать Excel просто для составления таблицы и сохранить его в CSV, то можно делать что-то вроде импорта документа в программу и распарсить его, разбирая на нужные объекты. Например, одна строка – это один объект. Поля объекта (то есть переменные), будут соответствовать полям таблицы в строке (то есть колонкам).

          Если посмотрите внимательно урок по CSV, который я привёл выше, то увидите, что там идёт довольно простое формирование ячеек таблицы. Символ ‘;’ служит для разделения колонок, а перевод строки ‘\n’ соответственно разделяет строки.

          Соответственно распарсить такой файл, прочитав его построчно, не должно составить большого труда.
          Когда сохраните файл, то откройте его обычным блокнотом, и станет сразу ясна структура документа.

            P
            • Aug. 18, 2016, 5:26 a.m.
            Незнаю как будет удобнее: считывать из файла нужную строку и находить в ней нужный столбец, или же переписать файл csv в создаваемую базу данных QSQLite и непосредственно к ней уже обращаться. Но в любом случае не знаю как обратиться и считать нужную строку csv (например 2). Мне кажется 2 вариант удобнее. Прошу помочь с реализацией
              Evgenii Legotckoi
              • Aug. 18, 2016, 5:59 a.m.

              Прошу помочь с реализацией

              Вечером накидаю небольшой набросок возможного варианта.

                Evgenii Legotckoi
                • Aug. 18, 2016, 4:46 p.m.
                • The answer was marked as a solution.

                Данные из CSV файла необходимо считывать построчно. Поскольку это формат данных, разделённых точкой запятой, и каждая строка закрывается последовательностью \r\n, как правило. А далее, чтобы отобразить данные в таблице в приложении на Qt, необходимо воспользоваться QStandardItemModel и QTableView, переписывая данные в соответствующие ячейки.

                Например, создали таблицу в Excel следующего вида:

                Чтобы получить следующий результат:

                У меня код получился следующий, для извлечения данных из csv файла, который хранится в файле ресурсов (для того, чтобы взять другой внешний файл, нужно только правильно указать путь к нему)

                mainwindow.h

                #ifndef MAINWINDOW_H
                #define MAINWINDOW_H
                 
                #include <QMainWindow>
                #include <QStandardItemModel>
                 
                namespace Ui {
                class MainWindow;
                }
                 
                class MainWindow : public QMainWindow
                {
                    Q_OBJECT
                 
                public:
                    explicit MainWindow(QWidget *parent = 0);
                    ~MainWindow();
                 
                private:
                    Ui::MainWindow *ui;
                    QStandardItemModel *csvModel;
                };
                 
                #endif // MAINWINDOW_H

                mainwindow.cpp

                #include "mainwindow.h"
                #include "ui_mainwindow.h"
                #include <QFile>
                #include <QTextStream>
                #include <QDebug>
                 
                MainWindow::MainWindow(QWidget *parent) :
                    QMainWindow(parent),
                    ui(new Ui::MainWindow)
                {
                    ui->setupUi(this);
                    // Создаём модель данных для отображения таблицы из CSV файла
                    csvModel = new QStandardItemModel(this);
                    csvModel->setColumnCount(3);
                    csvModel->setHorizontalHeaderLabels(QStringList() << "Марка" << "Модель" << "Цена");
                    ui->tableView->setModel(csvModel); // Устанавливаем модель в таблицу
                 
                    // Открываем файл из ресурсов. Вместо данного файла
                    // необходимо указывать путь к вашему требуемому файлу
                    QFile file(":/exampleTable.csv");
                    if ( !file.open(QFile::ReadOnly | QFile::Text) ) {
                        qDebug() << "File not exists";
                    } else {
                        // Создаём поток для извлечения данных из файла
                        QTextStream in(&file);
                        // Считываем данные до конца файла
                        while (!in.atEnd())
                        {
                            // ... построчно
                            QString line = in.readLine();
                            // Добавляем в модель по строке с элементами
                            QList<QStandardItem *> standardItemsList;
                            for (QString item : line.split(";")) {
                                standardItemsList.append(new QStandardItem(item));
                            }
                            csvModel->insertRow(csvModel->rowCount(), standardItemsList);
                        }
                        file.close();
                    }
                }
                 
                MainWindow::~MainWindow()
                {
                    delete ui;
                    delete csvModel;
                }

                А что касается добавления данных в базу данных SQLite, то посмотрите следующие уроки, в них навалом примеров по добавлению данных в базу данных SQLite:

                1. Работа с QSqlTableModel
                2. Работа с QSqlRelationalTableModel
                3. Работа с QSqlQueryModel
                4. Фильтр для QSqlTableModel
                5. Работа с базой данных с помощью QDataWidgetMapper
                6. Работа с SQLite для разработки приложений на QML
                7. Работа с QSqlQueryModel в QML
                8. Data Mapper для QML по аналогии с QDataWidgetMapper

                csvexample-1.zip

                  P
                  • Aug. 22, 2016, 4:45 a.m.
                  Большое спасибо за помощь. Очень помогли!
                    P
                    • Aug. 24, 2016, 9:47 a.m.

                    Пытался засунуть я данные в базу, однако не получается. Пишет ” Parameter count mismatch” .Подскажите что не так.
                    Ничего другого не придумал как переписать файл csv в массив, а потом хотел с него в базу записать.
                    Проект скинуть не могу ввиду требований секретности (армия). На ПК ни интернета, ни переводчика.

                      Evgenii Legotckoi
                      • Aug. 24, 2016, 11:17 a.m.

                      1-я Ошибка – это получается скорее массив из одного элемента. А если учесть, что он статический, то в него непонятно, что записывается. Чтобы работать с массивом, нужно знать заранее его длину. То есть длина должна быть равна количеству элементов, которое в него будет записано. Ну тут я ничем помочь не могу. Вам нужно почитать про массивы какую-нибудь литературу по C++, по его основам. Кто-то на эту тему советует Страуструпа, кто-то Лафоре. Авторов много.

                      2-я Ошибка – в методе, где создаётся база данных. Опять же, почитать про SQLite, а точнее про типы данных. А также про основы создания таблиц в SQL. У Вас там одни только типы данных перечислены и не более того. Нет названий колонок.

                      3-я Ошибка – в методе, где добавляется запись. Та же самая ерунда, отсутствуют названия колонок. В моих примерах они присутствовали. Вы их удалили.

                      Рекомендую почитать дополнительно про типы данных в SQL и массивы. То, как Вы создали массив, приведёт к созданию массива с одним элементом. Тут нужно дополнительно восполнять пробелы в знаниях чтением профильной литературы.

                      Рекомендую заменить на QList. В него помещать ваш собственный класс или структуру, которая будет содержать элементы i и j.

                        Comments

                        Only authorized users can post comments.
                        Please, Log in or Sign up
                        e
                        • ehot
                        • March 31, 2024, 2:29 p.m.

                        C++ - Тест 003. Условия и циклы

                        • Result:78points,
                        • Rating points2
                        B

                        C++ - Test 002. Constants

                        • Result:16points,
                        • Rating points-10
                        B

                        C++ - Test 001. The first program and data types

                        • Result:46points,
                        • Rating points-6
                        Last comments
                        k
                        kmssrFeb. 8, 2024, 6:43 p.m.
                        Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                        EVA
                        EVADec. 25, 2023, 10:30 a.m.
                        Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                        J
                        JonnyJoDec. 25, 2023, 8:38 a.m.
                        Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                        G
                        GvozdikDec. 18, 2023, 9:01 p.m.
                        Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                        Now discuss on the forum
                        a
                        a_vlasovApril 14, 2024, 6:41 a.m.
                        Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                        Павел Дорофеев
                        Павел ДорофеевApril 14, 2024, 2:35 a.m.
                        QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                        f
                        fastrexApril 4, 2024, 4:47 a.m.
                        Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                        AC
                        Alexandru CodreanuJan. 19, 2024, 11:57 a.m.
                        QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

                        Follow us in social networks