Qt Tablewidget表格数据的导出和导入

简介: Qt Tablewidget表格数据的导出和导入

@[TOC]


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

在这里插入图片描述
我所使用的这种方法,导入/导出相对较慢,网上有另一种比较快,有机会再写出来。

前期准备:

pro文件加入
QT += axcontainer

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

网上还有写#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;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,即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;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文件打开左下角的这个:
在这里插入图片描述


二. 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;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));//保存至filepath
           workbook->dynamicCall("Close()");//关闭工作簿
           excel->dynamicCall("Quit()");//关闭excel
           delete excel;
           excel=NULL;
           qDebug() << "\n导出成功啦!!!";
       }
}
相关文章
|
10天前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
3月前
|
JSON 网络协议 开发工具
基于Qt实现的TCP端口数据转发服务器
基于Qt实现的TCP端口数据转发服务器
45 0
基于Qt实现的TCP端口数据转发服务器
|
3月前
|
SQL 缓存 网络协议
利用QT实现多平台数据互通
利用QT实现多平台数据互通
|
3月前
|
Linux Windows
imx6ull开发板之qt应用编程读取AP3216c(光照,距离)数据。
imx6ull开发板之qt应用编程读取AP3216c(光照,距离)数据。
44 0
|
3月前
|
JSON JavaScript 前端开发
C++ Qt开发:运用QJSON模块解析数据
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QJson`组件的实现对JSON文本的灵活解析功能。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,也易于机器解析和生成。该格式是基于JavaScript语言的一个子集,但它是一种独立于语言的数据格式,因此可以在许多不同的编程语言中使用。
100 0
C++ Qt开发:运用QJSON模块解析数据
|
3月前
|
存储 设计模式 数据库
C++ Qt开发:StandardItemModel数据模型组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍`StandardItemModel`数据模型组件的常用方法及灵活运用。 `QStandardItemModel` 是 Qt 中用于存储标准项数据的模型类之一,它继承自 `QAbstractItemModel` 类。这个模型提供了一种灵活的方式来组织和管理数据,适用于各种视图类(比如 `QTreeView`、`QListView`、`QTableView` 等)。该组件是标准的以项数据为单位的基于M/V模型的
71 0
C++ Qt开发:StandardItemModel数据模型组件
|
3月前
|
存储 JSON JavaScript
[Qt5] QJson库进行存储、加载数据
[Qt5] QJson库进行存储、加载数据
31 0
|
3月前
|
算法 编译器
[C++&Qt] 通过信号与槽传递数据
[C++&Qt] 通过信号与槽传递数据
89 0
|
10月前
|
索引
【Qt上位机】打开本地表格文件并获取其中全部数据
本文给出了利用Qt编写一个上位机,实现打开本地表格文件,获取表格总行列数,操作单个单元格以及获取全部单元格内容并输出的解决办法,仅供参考。
102 1
|
10月前
|
传感器 Linux C语言
linux系统中利用QT实现环境传感器的数据获取方法
linux系统中利用QT实现环境传感器的数据获取方法
153 0