В том случае, если Вам понадобилось выгрузить таблицу с данными из приложения в файл формата 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. А как это будет работать, смотрите в видеоуроке.