Evgenii Legotckoi
Evgenii LegotckoiҚар. 25, 2015, 9:43 Т.Ж.

QML - 017-сабақ. QML Qt деректер үлгісінен деректерді CSV пішіміне экспорттау

В том случае, если Вам понадобилось выгрузить таблицу с данными из приложения в файл формата CSV , интерфейс которого ещё и написан на QML , то спешу с этой статьей, чтобы дать небольшую подсказку.

Например, в статье по работе с базой данных SQLite в приложении на 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 хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
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,>…

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