P
Peknic12 августа 2016 г. 5:14

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

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

Дали задание сделать подключаемую базу данных. Решил что удобнее будет в Excel. База данных с параметрами объектов к которым надо будет обращаться. Она подключается также как и написанная в Qt или как-то по другому? Ну а обращение к элементам одинаково?
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

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

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

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

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

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

        P
        • 16 августа 2016 г. 8:29

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

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

          Evgenii Legotckoi
          • 16 августа 2016 г. 8:45

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

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

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

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

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

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

                Evgenii Legotckoi
                • 18 августа 2016 г. 16:46
                • Ответ был помечен как решение.

                Данные из 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
                  • 22 августа 2016 г. 4:45
                  Большое спасибо за помощь. Очень помогли!
                    P
                    • 24 августа 2016 г. 9:47

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

                      Evgenii Legotckoi
                      • 24 августа 2016 г. 11:17

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

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

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

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

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

                        Комментарии

                        Только авторизованные пользователи могут публиковать комментарии.
                        Пожалуйста, авторизуйтесь или зарегистрируйтесь
                        d
                        • dsfs
                        • 26 апреля 2024 г. 4:56

                        C++ - Тест 004. Указатели, Массивы и Циклы

                        • Результат:80баллов,
                        • Очки рейтинга4
                        d
                        • dsfs
                        • 26 апреля 2024 г. 4:45

                        C++ - Тест 002. Константы

                        • Результат:50баллов,
                        • Очки рейтинга-4
                        d
                        • dsfs
                        • 26 апреля 2024 г. 4:35

                        C++ - Тест 001. Первая программа и типы данных

                        • Результат:73баллов,
                        • Очки рейтинга1
                        Последние комментарии
                        k
                        kmssr8 февраля 2024 г. 18:43
                        Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        АК
                        Анатолий Кононенко5 февраля 2024 г. 1:50
                        Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                        EVA
                        EVA25 декабря 2023 г. 10:30
                        Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                        J
                        JonnyJo25 декабря 2023 г. 8:38
                        Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                        G
                        Gvozdik18 декабря 2023 г. 21:01
                        Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                        Сейчас обсуждают на форуме
                        PS
                        Peter Son3 мая 2024 г. 17:57
                        Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
                        Evgenii Legotckoi
                        Evgenii Legotckoi2 мая 2024 г. 14:07
                        Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
                        IscanderChe
                        IscanderChe30 апреля 2024 г. 4:22
                        Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
                        G
                        Gar22 апреля 2024 г. 5:46
                        Clipboard Как скопировать окно целиком в clipb?
                        Павел Дорофеев
                        Павел Дорофеев14 апреля 2024 г. 2:35
                        QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь

                        Следите за нами в социальных сетях