一、作用
如果你开发的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, "保存成功", "保存成功!");
}