Evgenii Legotckoi
25 ноября 2015 г. 20:43

QML - Урок 017. Экспорт данных в формат CSV из модели данных в QML Qt

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

Например, в статье по работе с базой данных SQLite в приложении на QML была создана база данных, в которую добавлялись данные и удалялись из неё. При этом они отображались в TableView , который был уже частью интерфейса, написанного на QML. А для отображения этой таблицы использовалась модель данных, наследованная от QSqlQueryModel .

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

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

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

  1. ,
). Однако, большинство программ вольно трактует стандарт CSV и допускают использование иных символов в качестве разделителя.

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


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

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

  1. private:
  2. int countRow();
  3.  
  4. public slots:
  5. void exportCSV();

Здесь я оговорюсь в том плане, для чего же нужен собственный метод, который возвращает количество строк, если QSqlQueryModel, от которого Мы наследовались имеет собственный метод, который возвращает количество строк. Проблема в том, что он работает не так, как нам надо. Если строк меньше 256, то всё работает нормально, а если больше, то он всё равно будет возвращать значение 256 или в некоторых случаях 512. В общем реальных данных не дождётесь. Поэтому проблема решается SQL-запросом к базе данных.

  1. int ListModel::countRow()
  2. {
  3. QSqlQuery query;
  4. query.prepare("SELECT COUNT(*) FROM " TABLE " ;");
  5. query.exec();
  6. query.first();
  7.  
  8. return query.value(0).toInt();
  9. }

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

  1. void ListModel::exportCSV()
  2. {
  3. /* Создаём объекта файла CSV и указываем путь к этому файлу
  4. * Не забудьте указать валидный путь и расширение .csv
  5. * */
  6. QFile csvFile("C:/example/excelExample.csv");
  7.  
  8. // Открываем, или создаём файл, если он не существует
  9. if(csvFile.open( QIODevice::WriteOnly ))
  10. {
  11. // Создаём текстовый поток, в который будем писать данные
  12. QTextStream textStream( &csvFile );
  13. QStringList stringList; // Вспомогательный объект QSqtringList, который сформирует строку
  14.  
  15. // Проходимся по всем строкам ...
  16. for( int row = 0; row < this->countRow(); row++ )
  17. {
  18. stringList.clear(); // ... каждый раз очищая stringList
  19. /* Если обратить внимание в заголовочный файл, то
  20. * можно увидеть в перечислении Roles, что ролей модели всего 4
  21. * */
  22. for( int column = 0; column < 4; column++ )
  23. {
  24. // Записываем в stringList каждый элемент таблицы
  25. stringList << this->data(this->index(row, column), Qt::UserRole + 1 + column).toString();
  26. }
  27. /* После чего отправляем весь stringList в файл через текстовый поток
  28. * добавляя разделители в виде ";", а также поставив в конце символ окончания строки
  29. * */
  30. textStream << stringList.join( ';' )+"\n";
  31. }
  32. // Закрываем файл - готово
  33. csvFile.close();
  34. }
  35. }

main.qml

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

  1. // Программный код из предыдущего урока
  2. // Слой с TaxtField`ами и Button для занесения записей в базу данных
  3. RowLayout {
  4. id: rowLayout
  5.  
  6. // Программный код из предыдущего урока
  7.  
  8. // Кнопочка для запуска экспорта в Excel
  9. Button {
  10. text: qsTr("Экспорт в Excel")
  11.  
  12. // Запускаем экспорт
  13. onClicked: {
  14. myModel.exportCSV()
  15. }
  16. }
  17. }

Итог

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

Видеоурок

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь