P
Peknic12 серпня 2016 р. 05:14

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

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

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

Вам це подобається? Поділіться в соціальних мережах!

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

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

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

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

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

        P
        • 16 серпня 2016 р. 08:29

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

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

          Evgenii Legotckoi
          • 16 серпня 2016 р. 08:45

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

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

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

            P
            • 18 серпня 2016 р. 05:26
            Незнаю как будет удобнее: считывать из файла нужную строку и находить в ней нужный столбец, или же переписать файл csv в создаваемую базу данных QSQLite и непосредственно к ней уже обращаться. Но в любом случае не знаю как обратиться и считать нужную строку csv (например 2). Мне кажется 2 вариант удобнее. Прошу помочь с реализацией
              Evgenii Legotckoi
              • 18 серпня 2016 р. 05: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 р. 04:45
                  Большое спасибо за помощь. Очень помогли!
                    P
                    • 24 серпня 2016 р. 09:47

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

                      Evgenii Legotckoi
                      • 24 серпня 2016 р. 11:17

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

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

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

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

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

                        Коментарі

                        Only authorized users can post comments.
                        Please, Log in or Sign up
                        m
                        • molni99
                        • 26 жовтня 2024 р. 01:37

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

                        • Результат:80бали,
                        • Рейтинг балів4
                        m
                        • molni99
                        • 26 жовтня 2024 р. 01:29

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

                        • Результат:20бали,
                        • Рейтинг балів-10

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

                        • Результат:42бали,
                        • Рейтинг балів-8
                        Останні коментарі
                        A
                        ALO1ZE19 жовтня 2024 р. 08:19
                        Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                        ИМ
                        Игорь Максимов05 жовтня 2024 р. 07:51
                        Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                        d
                        dblas505 липня 2024 р. 11:02
                        QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                        k
                        kmssr08 лютого 2024 р. 18:43
                        Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        АК
                        Анатолий Кононенко05 лютого 2024 р. 01:50
                        Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                        Тепер обговоріть на форумі
                        jd
                        jasmine disouza28 жовтня 2024 р. 04:58
                        GeForce Now India: Unlocking the Future of Cloud Gaming GeForce Now India has a major impact on the gaming scene by introducing NVIDIA's cloud gaming service to Indian gamers. GeForce Now India lets you stream top-notch PC games on any device, from b…
                        9
                        9Anonim25 жовтня 2024 р. 09:10
                        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                        J
                        JacobFib17 жовтня 2024 р. 03:27
                        добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                        ИМ
                        Игорь Максимов03 жовтня 2024 р. 04:05
                        Реализация навигации по разделам Спасибо Евгений!
                        JW
                        Jhon Wick01 жовтня 2024 р. 15:52
                        Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…

                        Слідкуйте за нами в соціальних мережах