QT C++ 的 QTableWidget数据导出

一、作用

如果你开发的QT应用程序没有数据查询或者数据统计功能,可以使用此功能做导出数据可以让excel表格复杂的数据处理、数据查询

二、效果

效果

三、源代码

.ui

.h

#pragma once
#pragma execution_character_set("utf-8")
#include <QtWidgets/QWidget>
#include "ui_testQTableWidget.h"
class testQTableWidget : public QWidget
{
    Q_OBJECT

public:
    testQTableWidget(QWidget *parent = nullptr);

    ~testQTableWidget();

private slots:
        void on_pushButton_clicked(); //点击导出数据

   
private:
    Ui::testQTableWidgetClass ui;

    void loadData();  //生成数据

    void QtableWidgetToCSV(const QString& SaveFileName, const QTableWidget* saveTable);  //导出数据到csv文件

};

.cpp

#include "testQTableWidget.h"
#include <QCheckBox>
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>
testQTableWidget::testQTableWidget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    loadData();
}

testQTableWidget::~testQTableWidget()
{

}

void testQTableWidget::on_pushButton_clicked()
{
    // 打开文件对话框,允许用户选择保存 CSV 文件的路径和文件名
    QString filePath = QFileDialog::getSaveFileName(nullptr, "Save CSV File", "", "CSV files (*.csv)");

    // 检查用户是否选择了有效的文件路径
    if (!filePath.isEmpty()) {
        // 调用 QtableWidgetToCSV 函数,将 ui.tableWidget 的内容保存为 CSV 文件
        QtableWidgetToCSV(filePath, ui.tableWidget);
    }

}

void testQTableWidget::loadData()  //随机生成些数据
{

    // 创建一个 QStringList 来存储表格的列标题
    QStringList header;
    // 添加列标题,包括 "姓名"、"性别" 和 "班级"
    header << "姓名" << "性别" << "班级";

    // 设置表格行数为 0,清空之前的内容
    ui.tableWidget->setRowCount(0);
    // 设置表格列数为 header 的大小,动态调整列数
    ui.tableWidget->setColumnCount(header.size());
    // 设置表格的水平表头标签
    ui.tableWidget->setHorizontalHeaderLabels(header);

    // 插入 5 行数据
    for (int row = 0; row < 5; ++row) {
        // 在指定行数插入新行
        ui.tableWidget->insertRow(row);
        // 遍历列标题的数量,对每一列插入数据
        for (int col = 0; col < header.size(); ++col) {
            // 创建一个新的表格项,内容为 "Item 行-列"
            QTableWidgetItem* item = new QTableWidgetItem(QString("Item %1-%2").arg(row).arg(col));
            // 将新项设置到指定的行和列
            ui.tableWidget->setItem(row, col, item);
        }
    }
    // 设置最后一列的伸展属性,使其占满可用空间
    ui.tableWidget->horizontalHeader()->setStretchLastSection(true);
    // 调整列宽以适应内容
    ui.tableWidget->resizeColumnsToContents();
}


void testQTableWidget::QtableWidgetToCSV(const QString &SaveFileName,const QTableWidget* saveTable)
{
      // 创建一个 QStringList 来存储表格的列标题
    QStringList header;
    // 创建一个列表,用于存储表格每一行的数据
    QList<QList<QString>> data;

    // 遍历保存的表格列数
    for (int col = 0; col < saveTable->columnCount(); ++col) {
        // 将每一列的标题添加到 header 列表中
        header << saveTable->horizontalHeaderItem(col)->text();
    }
    // 遍历保存的表格行数
    for (int row = 0; row < saveTable->rowCount(); ++row) {
        // 检查行是否被隐藏,如果没有则处理该行
        if (!saveTable->isRowHidden(row)) {
            QList<QString> rowData; // 创建一个用于存储当前行数据的列表
            // 遍历当前行的列数
            for (int col = 0; col < saveTable->columnCount(); ++col) {
                // 获取当前单元格的项
                QTableWidgetItem* item = saveTable->item(row, col);
                if (item)
                    // 将单元格的文本添加到行数据中
                    rowData << item->text();
                else
                    // 如果当前单元格为空,则添加一个空字符串
                    rowData << "";
            }
            // 将当前行的数据添加到总数据列表中
            data << rowData;
        }
    }

    // 创建一个 QFile 对象,用于保存 CSV 文件
    QFile file(SaveFileName);
    // 打开文件,设置为只写模式和文本模式
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        // 如果打开失败,弹出警告消息框
        QMessageBox::warning(this, "保存失败", "保存失败,请检查文件路径是否正确!");
        return; // 退出函数
    }
    // 创建一个 QTextStream 对象,用于写入文件
    QTextStream out(&file);
    // 写入表头
    for (int i = 0; i < header.size(); ++i) {
        out << header.at(i); // 写入当前列的标题
        // 如果不是最后一个标题,则添加逗号分隔符
        if (i < header.size() - 1)
            out << ",";
    }
    // 写入换行符
    out << "\n";

    // 将数据写入文件
    for (const auto& row : data) {
        for (int i = 0; i < row.size(); ++i) {
            out << row.at(i); // 写入当前单元格的数据
            // 如果不是最后一个单元格,则添加逗号分隔符
            if (i < row.size() - 1)
                out << ",";
        }
        // 写入换行符以分隔行
        out << "\n";
    }

    // 关闭文件
    file.close();

    // 弹出保存成功的消息框
    QMessageBox::information(this, "保存成功", "保存成功!");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值