QT里面自带的TableWidget控件可以实现表格显示的功能,刚开始学习TableWidget,只是自己提前创建好表格,规定好数据,但真正的软件不会让我们规定好数据格式。下面我们一起来看一下,如何导入xls文件,自动生成表格。
我所使用的这种方法,导入/导出相对较慢,网上有另一种比较快,有机会再写出来。
(资料图片仅供参考)
前期准备:
pro文件加入 QT += axcontainer
在头文件加入#include
网上还有写#include
版本不同,可能代码写法不同,自己测试。
一. xls/xlsx文件数据导入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;idynamicCall(\"Open (const QString&)\",str); //获取活动工作簿 QAxObject *workbook = excel.querySubObject(\"ActiveWorkBook\"); //获取工作表集合的工作表1,即sheet1 QAxObject *worksheet = workbook->querySubObject(\"Sheets(int)\",1); QAxObject *range; //获取cell的值 QString strVal=\"hull\"; QStringList header; //设置初始表格行列都为0 ui->tableWidget->setRowCount(0); //设置行数为0 ui->tableWidget->setColumnCount(0); //设置列数为0 int count =0; for(int i = 1;itableWidget->setRowCount(ui->tableWidget->rowCount()+1); for(int j = 1;jtableWidget->setColumnCount(ui->tableWidget->columnCount()+1); range = worksheet->querySubObject(\"Cells(int,int)\",i,j); //获取cell的值 strVal = range->dynamicCall(\"Value2()\").toString(); header<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文件打开左下角的这个:
二. tableWidget表格数据导出为xls/xlsx文件
我们右击导入按钮,转到槽,添加被点击后的代码
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,即sheet1 QAxObject *worksheet = worksheets->querySubObject(\"Item(int)\",1); //设置表头值 for(int i=1;itableWidget->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;itableWidget->rowCount()+1;i++) { for(int j = 1;jtableWidget->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));//保存至filepath workbook->dynamicCall(\"Close()\");//关闭工作簿 excel->dynamicCall(\"Quit()\");//关闭excel delete excel; excel=NULL; qDebug() << \"
导出成功啦!!!\"; }}
【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里:
关键词: