文章目录

      • 一. xls/xlsx文件数据导入TableWidget表格
      • 二. tableWidget表格数据导出为xls/xlsx文件

QT里面自带的TableWidget控件可以实现表格显示的功能,刚开始学习TableWidget,只是自己提前创建好表格,规定好数据,但真正的软件不会让我们规定好数据格式。下面我们一起来看一下,如何导入xls文件,自动生成表格。

Qt Tablewidget表格数据的导出和导入-编程知识网
我所使用的这种方法,导入/导出相对较慢,网上有另一种比较快,有机会再写出来。

前期准备:

pro文件加入
QT += axcontainer

在头文件加入#include<ActiveQt/QAxObject>

网上还有写#include

版本不同,可能代码写法不同,自己测试。

一. xls/xlsx文件数据导入TableWidget表格

Qt Tablewidget表格数据的导出和导入-编程知识网
我们右击导入按钮,转到槽,添加被点击后的代码

QString strData;
void MainWindow::on_pushButton_17_clicked()
{//首先我们需要创建一个文件选择对话框QString curPash =QDir::currentPath(); //获取当前路径QString dlgTitle="选择表格文件";//xls和xlsx格式的文件都可以,xlsx兼容xls,注意每一种类型后面要加两个分号QString filter="表格文件(*.xls *.xlsx);;xls文件(*.xls);;xlsx文件(*.xlsx);;所有文件(*.*)";//创建文件选择对话框QStringList fileList = QFileDialog::getOpenFileNames(this,dlgTitle,curPash,filter);if(fileList.count()<1)return;for(int i = 0;i<fileList.count();i++){//保存文件地址strData = fileList.at(i);}//连接Excel控件QAxObject excel("Excel.Application");//不显示任何警告信息excel.setProperty("Visible",false);//获取工作簿集合QAxObject *workbooks = excel.querySubObject("WorkBooks");workbooks->dynamicCall("Open (const QString&)",str);//获取活动工作簿QAxObject *workbook = excel.querySubObject("ActiveWorkBook");//获取工作表集合的工作表1,即sheet1QAxObject *worksheet = workbook->querySubObject("Sheets(int)",1);QAxObject *range; //获取cell的值QString strVal="hull";QStringList header;//设置初始表格行列都为0ui->tableWidget->setRowCount(0); //设置行数为0ui->tableWidget->setColumnCount(0); //设置列数为0int count =0;for(int i = 1;i<row;i++){//注意setRowCount里面的函数不是追加,而是总数,很多人最开始都把这个函数以为是总数,造成程序经常崩溃ui->tableWidget->setRowCount(ui->tableWidget->rowCount()+1);for(int j = 1;j<column;j++){if(i == 1){ui->tableWidget->setColumnCount(ui->tableWidget->columnCount()+1);range = worksheet->querySubObject("Cells(int,int)",i,j); //获取cell的值strVal = range->dynamicCall("Value2()").toString();header<<strVal;//设置表格头}else{probar->setValue(++count);range = worksheet->querySubObject("Cells(int,int)",i,j); //获取cell的值strVal = range->dynamicCall("Value2()").toString();ui->tableWidget->setItem(i-2,j-1,new QTableWidgetItem(strVal));}}if(i == 1){ui->tableWidget->setHorizontalHeaderLabels(header);}}ui->tableWidget->setRowCount(ui->tableWidget->rowCount()-1);}
}

代码中的工作表就是xls文件打开左下角的这个:
Qt Tablewidget表格数据的导出和导入-编程知识网


二. tableWidget表格数据导出为xls/xlsx文件

Qt Tablewidget表格数据的导出和导入-编程知识网
我们右击导入按钮,转到槽,添加被点击后的代码

void MainWindow::on_pushButton_23_clicked()
{//获取保存路径QString filepath=QFileDialog::getSaveFileName(this,tr("Save"),".",tr(" (*.xlsx)"));if(!filepath.isEmpty()){QAxObject *excel = new QAxObject(this);//连接Excel控件excel->setControl("Excel.Application");//不显示窗体excel->dynamicCall("SetVisible (bool Visible)","false");//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示excel->setProperty("DisplayAlerts", false);//获取工作簿集合QAxObject *workbooks = excel->querySubObject("WorkBooks");//新建一个工作簿workbooks->dynamicCall("Add");//获取当前工作簿QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取工作表集合QAxObject *worksheets = workbook->querySubObject("Sheets");//获取工作表集合的工作表1,即sheet1QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);//设置表头值for(int i=1;i<ui->tableWidget->columnCount()+1;i++){//设置设置某行某列QAxObject *Range = worksheet->querySubObject("Cells(int,int)", 1, i);Range->dynamicCall("SetValue(const QString &)",ui->tableWidget->horizontalHeaderItem(i-1)->text());}//设置表格数据for(int i = 1;i<ui->tableWidget->rowCount()+1;i++){for(int j = 1;j<ui->tableWidget->columnCount()+1;j++){QAxObject *Range = worksheet->querySubObject("Cells(int,int)", i+1, j);Range->dynamicCall("SetValue(const QString &)",ui->tableWidget->item(i-1,j-1)->data(Qt::DisplayRole).toString());}}workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));//保存至filepathworkbook->dynamicCall("Close()");//关闭工作簿excel->dynamicCall("Quit()");//关闭exceldelete excel;excel=NULL;qDebug() << "\n导出成功啦!!!";}
}