Evgenii Legotckoi
Evgenii Legotckoi25 листопада 2015 р. 09:43

QML - Урок 017. Експорт даних у формат CSV з моделі даних у QML Qt

У тому випадку, якщо Вам знадобилося вивантажити таблицю з даними з програми у файл формату CSV , інтерфейс якого ще й написаний на QML , то поспішаю з цією статтею, щоб дати невелику підказку.

Наприклад, у статті по роботі з базою даних SQLite (https://evileg.com/ru/post/189/) у додатку на QML була створена база даних, в яку додавалися дані та видалялися з неї. При цьому вони відображалися в TableView , який був вже частиною інтерфейсу, написаного на QML. Для відображення цієї таблиці використовувалася модель даних, успадкована від QSqlQueryModel .

Пропоную скористатися вихідними джерелами проекту та розширити його так, щоб у додатку була кнопочка для експорту даних у файл формату CSV .

Що таке формат CSV

> CSV (від англ. Comma-Separated Values — значення, розділені комами) — текстовий формат, призначений для представлення табличних даних. Кожен рядок файлу – це один рядок таблиці. Значення окремих колонок поділяються розділовим символом (delimiter) - комою (

,
). Однак, більшість програм вільно трактує стандарт CSV і допускають використання інших символів як роздільник.
>
>

Взагалі суть роботи зведеться до того, щоб зробити метод нашої моделі даних, який буде смикати дані з цієї моделі і розділяти крапкою з комою кожну комірку в рядку, а кожен рядок розділяти символом нового рядка "\n".


Пишемо метод для експорту таблиці у файл формату CSV

У заголовний файл нашого проекту додамо відповідно новий метод для експорту та ще один метод, який повертатиме кількість рядків у моделі даних. Метод для експорту даних оголосимо як СЛОТ , щоб він був доступний з QML шару.

private:
    int countRow();

public slots:
    void exportCSV();

Тут я обмовлюся в тому плані, для чого потрібен власний метод, який повертає кількість рядків, якщо QSqlQueryModel, від якого ми успадковувалися, має власний метод, який повертає кількість рядків. Проблема в тому, що він працює не так, як нам треба. Якщо рядків менше 256, то все працює нормально, а якщо більше, то він все одно повертатиме значення 256 або в деяких випадках 512. Загалом реальних даних не дочекаєтеся. Тому проблема вирішується SQL-запитом до бази даних.

int ListModel::countRow()
{
    QSqlQuery query;
    query.prepare("SELECT COUNT(*) FROM " TABLE " ;");
    query.exec();
    query.first();

    return query.value(0).toInt();
}

А тепер розберемо метод для експорту даних у файл CSV, в якому братиме участь наведений вище метод отримання числа рядків у таблиці.

void ListModel::exportCSV()
{
    /* Создаём объекта файла CSV и указываем путь к этому файлу
     * Не забудьте указать валидный путь и расширение .csv
     * */
    QFile csvFile("C:/example/excelExample.csv");

    // Открываем, или создаём файл, если он не существует
    if(csvFile.open( QIODevice::WriteOnly ))
    {
        // Создаём текстовый поток, в который будем писать данные
        QTextStream textStream( &csvFile );
        QStringList stringList; // Вспомогательный объект QSqtringList, который сформирует строку

        // Проходимся по всем строкам ...
        for( int row = 0; row < this->countRow(); row++ )
        {
            stringList.clear(); // ... каждый раз очищая stringList
            /* Если обратить внимание в заголовочный файл, то
             * можно увидеть в перечислении Roles, что ролей модели всего 4
             * */
            for( int column = 0; column < 4; column++ )
            {
                // Записываем в stringList каждый элемент таблицы
                stringList << this->data(this->index(row, column), Qt::UserRole + 1 + column).toString();
            }
            /* После чего отправляем весь stringList в файл через текстовый поток
             * добавляя разделители в виде ";", а также поставив в конце символ окончания строки
             * */
            textStream << stringList.join( ';' )+"\n";
        }
        // Закрываем файл - готово
        csvFile.close();
    }
}

main.qml

Ну а для того, щоб цю справу можна було запустити, додам у rowLayout у файлі main.qml кнопочку, натискання якої будемо запускати експорт даних з таблиці в файл CSV.

// Программный код из предыдущего урока    
    // Слой с TaxtField`ами и Button для занесения записей в базу данных
    RowLayout {
        id: rowLayout

    // Программный код из предыдущего урока

        // Кнопочка для запуска экспорта в Excel
        Button {
            text: qsTr("Экспорт в Excel")

            // Запускаем экспорт
            onClicked: {
                myModel.exportCSV()
            }
        }
    }

Підсумок

В результаті оновлений код програми з попередньої статті дозволить зберегти дані з таблиці у файл CSV. А як це працюватиме, дивіться у відеоуроці.

Відеоурок

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
Дмитрий

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

  • Результат:60бали,
  • Рейтинг балів-1
Дмитрий

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

  • Результат:92бали,
  • Рейтинг балів8
d
  • dsfs
  • 26 квітня 2024 р. 14:56

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

  • Результат:80бали,
  • Рейтинг балів4
Останні коментарі
k
kmssr09 лютого 2024 р. 05:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 12:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 грудня 2023 р. 21:30
Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 грудня 2023 р. 19:38
Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 грудня 2023 р. 08:01
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
G
George1307 травня 2024 р. 10:27
добавить qlineseries в функции в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент
BlinCT
BlinCT05 травня 2024 р. 15:46
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
PS
Peter Son04 травня 2024 р. 03: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 Legotckoi03 травня 2024 р. 00:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 квітня 2024 р. 14:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

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