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