Evgenii Legotckoi
Evgenii Legotckoi25. November 2015 09:43

QML - Lektion 017. Exportieren von Daten in das CSV-Format aus dem Datenmodell in QML Qt

Für den Fall, dass Sie eine Tabelle mit Daten aus der Anwendung in eine Datei im CSV -Format hochladen müssen, deren Schnittstelle ebenfalls in QML geschrieben ist, beeile ich mich mit diesem Artikel, einen kleinen Hinweis zu geben .

Beispielsweise wurde im Artikel über das Arbeiten mit der SQLite-Datenbank eine Datenbank in einer Anwendung in QML erstellt, der Daten hinzugefügt wurden und daraus gelöscht. Gleichzeitig wurden sie in TableView angezeigt, das bereits Teil der in QML geschriebenen Oberfläche war. Und um diese Tabelle anzuzeigen, wurde Datenmodell geerbt von QSqlQueryModel verwendet.

Ich schlage vor, die Quellen dieses Projekts zu verwenden und es so zu erweitern, dass die Anwendung eine Schaltfläche zum Exportieren von Daten in eine Datei im CSV -Format hat.

Was ist das CSV-Format

> CSV (aus dem Englischen Comma-Separated Values – durch Kommas getrennte Werte) – ein Textformat zur Darstellung tabellarischer Daten. Jede Zeile der Datei ist eine Zeile der Tabelle. Werte einzelner Spalten werden durch ein Trennzeichen (Trennzeichen) — ein Komma (

,
) getrennt. Die meisten Programme interpretieren den CSV-Standard jedoch frei und erlauben die Verwendung anderer Zeichen als Trennzeichen.
>
>

Im Allgemeinen besteht die Essenz der Arbeit darin, eine Methode in unserem Datenmodell zu erstellen, die Daten aus diesem Modell zieht und jede Zelle in der Zeile mit einem Semikolon trennt und jede Zeile mit dem Zeilenumbruchzeichen „\n“ trennt.


Schreiben Sie eine Methode zum Exportieren der Tabelle in eine CSV-Datei

In der Header-Datei unseres Projekts fügen wir jeweils eine neue Methode zum Exportieren und eine weitere Methode hinzu, die die Anzahl der Zeilen im Datenmodell zurückgibt. Lassen Sie uns die Datenexportmethode als SLOT deklarieren, damit sie von der Ebene QML verfügbar ist.

private:
    int countRow();

public slots:
    void exportCSV();

Hier mache ich einen Vorbehalt in dem Sinne, warum wir eine eigene Methode brauchen, die die Anzahl der Zeilen zurückgibt, wenn QSqlQueryModel, von dem We geerbt hat, eine eigene Methode hat, die die Anzahl der Zeilen zurückgibt. Das Problem ist, dass es nicht so funktioniert, wie wir es uns wünschen. Wenn weniger als 256 Zeilen vorhanden sind, funktioniert alles einwandfrei, und wenn es mehr sind, wird immer noch der Wert 256 oder in einigen Fällen 512 zurückgegeben. Im Allgemeinen werden Sie nicht auf echte Daten warten. Daher wird das Problem durch eine SQL-Abfrage an die Datenbank gelöst.

int ListModel::countRow()
{
    QSqlQuery query;
    query.prepare("SELECT COUNT(*) FROM " TABLE " ;");
    query.exec();
    query.first();

    return query.value(0).toInt();
}

Analysieren wir nun die Methode zum Exportieren von Daten in eine CSV-Datei, an der die obige Methode zum Abrufen der Anzahl der Zeilen in der Tabelle beteiligt ist.

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

Nun, um dieses Geschäft zu starten, werde ich dem rowLayout in der main.qml-Datei eine Schaltfläche hinzufügen, durch deren Drücken wir mit dem Exportieren von Daten aus der Tabelle in die CSV-Datei beginnen.

// Программный код из предыдущего урока    
    // Слой с TaxtField`ами и Button для занесения записей в базу данных
    RowLayout {
        id: rowLayout

    // Программный код из предыдущего урока

        // Кнопочка для запуска экспорта в Excel
        Button {
            text: qsTr("Экспорт в Excel")

            // Запускаем экспорт
            onClicked: {
                myModel.exportCSV()
            }
        }
    }

Insgesamt

Daher können Sie mit dem aktualisierten Anwendungscode aus dem letzten Artikel die Daten aus der Tabelle in einer CSV-Datei speichern. Und wie es funktioniert, sehen Sie sich das Video-Tutorial an.

Videoanleitung

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken