P
PeknicТам. 12, 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, 4: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.

                        Пікірлер

                        Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                        Кіріңіз немесе Тіркеліңіз
                        Г

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

                        • Нәтиже:66ұпай,
                        • Бағалау ұпайлары-1
                        t

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

                        • Нәтиже:33ұпай,
                        • Бағалау ұпайлары-10
                        t

                        Qt - Тест 001. Сигналы и слоты

                        • Нәтиже:52ұпай,
                        • Бағалау ұпайлары-4
                        Соңғы пікірлер
                        G
                        GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
                        Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                        d
                        dblas5Шілде 5, 2024, 11:02 Т.Ж.
                        QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                        k
                        kmssrАқп. 8, 2024, 6:43 Т.Қ.
                        Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        АК
                        Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
                        Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                        Енді форумда талқылаңыз
                        Evgenii Legotckoi
                        Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                        F
                        FynjyШілде 22, 2024, 4:15 Т.Ж.
                        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                        BlinCT
                        BlinCTМаусым 25, 2024, 1 Т.Ж.
                        Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                        BlinCT
                        BlinCTМамыр 5, 2024, 5:46 Т.Ж.
                        Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                        Evgenii Legotckoi
                        Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
                        Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                        Бізді әлеуметтік желілерде бақылаңыз