由于工程量大,担心在主线程把数据写入Excel,会导致界面卡顿,所以使用线程写Excel
Qtxlsx创建环境,在另一篇笔记说明
1.新建一个C++类,继承QObject,创建写Excel的线程
ave_excel_thread = new excel_thread;
mythread_excel = new QThread(this);
save_excel_thread->moveToThread(mythread_excel);
mythread_excel->start();
2.“保存文件”槽函数:选择文件路径,输入文件名,把文件通过信号和槽发送给线程;
void Widget::on_btn_save_file_clicked()
{
QString file_name = QFileDialog::getSaveFileName(this, tr("保存文件1"), "./", tr("Text File(*.xlsx)"));
qDebug() << file_name;
ui->lineEdit_filename->setText(file_name);
connect(this,&Widget::signal_excel_save_file, save_excel_thread, &excel_thread::save_file);
emit signal_excel_save_file(file_name);
}
3.在线程中,声明QXlsx::Document xlsx;声明Excel文件,并获取文件名,并创建文件名.xlsx文件;
.h
private:
QXlsx::Document xlsx;
.cpp
void excel_thread::save_file(QString file_name)
{
file_name_data = file_name;
xlsx.saveAs(file_name);
}
4.主线程中,开始测试槽函数:创建一些数据,把数据(行,列,数据)通过信号发送给Excel线程
void Widget::on_btn_start_test_clicked()
{
if(ui->lineEdit_filename->text().isEmpty())
{
QMessageBox::critical(this,"警告","请先选择文件保存",QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
return;
}
connect(this, &Widget::signal_excel_save, save_excel_thread, &excel_thread::save_data);
for (int i = 1; i < 3; i++)
{
for (int j = 1; j < 5; j++)
{
double k = i + j + 0.1*i;
emit signal_excel_save(i, j, k);
}
}
}
5.线程中,往xlsx文件中写入数据,保存;
void excel_thread::save_data(int a, int b, double c)
{
xlsx.write(a,b,c);
qDebug() << a << b << c;
xlsx.saveAs(file_name_data);
}
结果:
输出:
excel文件: