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
AD

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

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

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

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

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

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 22:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi01 листопада 2024 р. 00:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 18:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 17:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 21:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi25 червня 2024 р. 01:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 17:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 13:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 19:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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