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.

                        Пікірлер

                        Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                        Кіріңіз немесе Тіркеліңіз
                        OI
                        • Ora Iro
                        • Жел. 24, 2024, 6:38 Т.Ж.

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

                        • Нәтиже:40ұпай,
                        • Бағалау ұпайлары-8
                        AD

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

                        • Нәтиже:50ұпай,
                        • Бағалау ұпайлары-4
                        m
                        • molni99
                        • Қаз. 26, 2024, 1:37 Т.Ж.

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

                        • Нәтиже:80ұпай,
                        • Бағалау ұпайлары4
                        Соңғы пікірлер
                        ИМ
                        Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
                        Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                        Evgenii Legotckoi
                        Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
                        Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                        A
                        ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
                        Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                        ИМ
                        Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
                        Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                        d
                        dblas5Шілде 5, 2024, 11:02 Т.Ж.
                        QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                        Енді форумда талқылаңыз
                        Evgenii Legotckoi
                        Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                        t
                        tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
                        google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                        NSProject
                        NSProjectМаусым 4, 2022, 3:49 Т.Ж.
                        Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                        9
                        9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
                        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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