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 хостинг.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

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

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

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

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

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

  • Нәтиже:42ұпай,
  • Бағалау ұпайлары-8
Соңғы пікірлер
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 аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Енді форумда талқылаңыз
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
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 приложения их можно выбрать. В чем может …

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