Qt提取excel表单中数据

这篇具有很好参考价值的文章主要介绍了Qt提取excel表单中数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 这是一个excel表单,目标是把其中的数据提取出来。

文章学习自:QT中将excel中的数据快速的读取出来显示在tablewidget中/将tablewidget中的数据快速的写入excel中_qt将excel表格中指定范围内容显示在界面中_Jessica_1409573408的博客-CSDN博客

Qt提取excel表单中数据,qt,excel

程序如下:1.打开一个Excel应用程序,并使其可视化。

QAxObject excel("Excel.Application");   
excel.setProperty("Visible",true);

Qt提取excel表单中数据,qt,excel

2.打开已存在的工作簿

QAxObject *workbooks = excel.querySubObject("WorkBooks");

QString path="D:/Qt/Qt5Book/Qt5.9Samp/happy_prediction_table/build-happy_prediction_table-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug/test.xlsx";        

workbooks->dynamicCall("Open (const QString&)",QString(path));
 

 3.初步获取数据

QAxObject *workbook = excel.querySubObject("ActiveWorkBook"); //获取活动工作簿

//获取第一个工作表        
QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);

Qt提取excel表单中数据,qt,excel

QAxObject *usedrange=worksheet->querySubObject("UsedRange");//获取整个worksheet的范围 

QVariant cell=usedrange->dynamicCall("value");//将worksheet的全部内容存储在QVariant变量中 

qDebug()<<cell;

结果(这已经是我优化过的了): 

QVariant(QVariantList, (

QVariant(QVariantList,
(

QVariant(QString, "日期"),

QVariant(QString, "活动类型(特指能使你产\n生成就感或快乐的活动)"),

QVariant(QString, "陪你完成活动的人(如果是独\n自一人,请写明\"我自己\")"), QVariant(QString, "预计快乐程度\n(0~100%,活动\n开始前填写)"),

QVariant(QString, "实际快乐程度\n(0~100%,活动\n结束后填写)")

)

),

QVariant(QVariantList,

(

QVariant(QString, "2023/7/7\t"),

QVariant(QString, "写我有兴趣的程序\t"),

QVariant(QString, "我自己\t"),

QVariant(QString, "30%\t"),

QVariant(QString, "50%\t")

)

),

QVariant(QVariantList,

(

QVariant(QString, "2023/7/7\t"),

QVariant(QString, "跑步\t"),

QVariant(QString, "我自己\t"),

QVariant(QString, "45%\t"),

QVariant(QString, "55%\t")

)

),

QVariant(QVariantList,

(

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t")

)

),

QVariant(QVariantList,

(

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t")

)

)

)

)

为了更好地看出数据的层次,我做了这样的处理。 

x1=QVariant(QString, "日期")

x2=QVariant(QString, "活动类型(特指能使你产\n生成就感或快乐的活动)")

x3=QVariant(QString, "陪你完成活动的人(如果是独\n自一人,请写明\"我自己\")") 

x4=QVariant(QString, "预计快乐程度\n(0~100%,活动\n开始前填写)")

x5=QVariant(QString, "实际快乐程度\n(0~100%,活动\n结束后填写)")

QVariant(QVariantList,(x1,x2,x3,x4,x5))

y1=QVariant(QString, "2023/7/7\t")

y2=QVariant(QString, "写我有兴趣的程序\t")

y3=QVariant(QString, "我自己\t")

y4=QVariant(QString, "30%\t")

y5=QVariant(QString, "50%\t")

QVariant(QVariantList, (y1,y2,y3,y4,y5))

z1=QVariant(QString, "2023/7/7\t")

z2=QVariant(QString, "跑步\t")

z3=QVariant(QString, "我自己\t")

z4=QVariant(QString, "45%\t")

z5=QVariant(QString, "55%\t") 

QVariant(QVariantList, (z1,z2,z3,z4,z5))

 h=QVariant(QString, "\t")

 QVariant(QVariantList, (h,h,h,h,h))

化简后:

QVariant(QVariantList,

(

QVariant(QVariantList,(x1,x2,x3,x4,x5)),

QVariant(QVariantList, (y1,y2,y3,y4,y5)),

QVariant(QVariantList, (z1,z2,z3,z4,z5)),

QVariant(QVariantList, (h,h,h,h,h)),

QVariant(QVariantList, (h,h,h,h,h)),

)

)

探索: 

因为觉得上面的数据没有规律性,不方便找规律,我建了下面这张表: 

 Qt提取excel表单中数据,qt,excel

QVariant(QVariantList, (

QVariant(QVariantList,

(QVariant(QString, "(1,1)"), QVariant(QString, "(1,2)"), QVariant(QString, "(1,3)"))),

QVariant(QVariantList,

(QVariant(QString, "(2,1)"), QVariant(QString, "(2,2)"), QVariant(QString, "(2,3)")))))

转化:

QVariant(QVariantList, (QVariant(QVariantList, (x)),QVariant(QVariantList, (y))))

x=QVariant(QString, "(1,1)"), QVariant(QString, "(1,2)"), QVariant(QString, "(1,3)")

y=QVariant(QString, "(2,1)"), QVariant(QString, "(2,2)"), QVariant(QString, "(2,3)")

最外层是一个QVariantList,里面是两个QVariant,对应两行数据。

每个QVariant又是一个QVariantList,里面是3个QVariant,对应3列数据。

小贴士: 

观察QVariant(QString, "活动类型(特指能使你产\n生成就感或快乐的活动)")

发现它的结构是:QVariant(类型,内容)

含义:类型为QString,内容为"活动类型(特指能使你产\n生成就感或快乐的活动)"

 

 

现在已经得到了QVariant类型的数据,它存储的数据类似二维数组,这里把它转化为

QList<QList<QVariant>>

使用这个函数:

Qvariant2listlistVariant(const QVariant &var,QList<QList<QVariant>> &ret)
{
    QVariantList varrows=var.toList();
    if(varrows.isEmpty())
    {
        return;
    }
    else {
        const int rowcount=varrows.size();//行数
        qDebug()<<"excel中有几行"<<rowcount;
        QVariantList rowdata;
        for(int i=0;i<rowcount;i++)
        {
            rowdata=varrows[i].toList();//将每一行的值存入到list中
            ret.push_back(rowdata);
        }
    }
}

语句解析:

 QVariantList varrows=var.toList();

使用函数:
QList<QVariant> toList() const
QList<QVariant>与QVariantList是同义的。

那么QList<QList<QVariant>>等同于QList<QVariantList>。

varrows的内容:文章来源地址https://www.toymoban.com/news/detail-556584.html

(
QVariant(QVariantList, 
(
QVariant(QString, "(1,1)"), QVariant(QString, "(1,2)"), QVariant(QString, "(1,3)")
)
),
QVariant(QVariantList,
(
QVariant(QString, "(2,1)"), QVariant(QString, "(2,2)"), QVariant(QString, "(2,3)")
)
)
)

4.这时候就可以把 QList<QList<QVariant>> ret中的信息提取出来了。

        int row=ret.size();
        //qDebug()<<row;
        for(int i=0;i<row;i++)
        {
            QList<QVariant> one=ret.at(i);
            int column=one.size();
            //qDebug()<<column;
            for(int j=0;j<column;j++)
            {
                QString strVal=one.at(j).toString();
                qDebug()<<strVal;
                /*在这里进行数据提取操作*/
            }
        }

5. workbook->dynamicCall("Close()"); //关闭工作簿

 

 6.excel.dynamicCall("Quit()");//关闭excel

程序完整版:

#include <QApplication>
#include <QAxObject>
#include <QDebug>
#include <QList>
#pragma execution_character_set("utf-8")
void Qvariant2listlistVariant(const QVariant &var,QList<QList<QVariant>> &ret)
{
    QVariantList varrows=var.toList();
    qDebug()<<varrows;
    if(varrows.isEmpty())
    {
        return;
    }
    else{
        const int rowcount=varrows.size();//行数
        //qDebug()<<"excel中有几行"<<rowcount;
        QVariantList rowdata;
        for(int i=0;i<rowcount;i++)
        {
            rowdata=varrows[i].toList();//将每一行的值存入到list中
            ret.push_back(rowdata);
        }
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QAxObject excel("Excel.Application");
    //不对excel进行显示
    excel.setProperty("Visible",true);
    //添加新的工作簿
    QAxObject *workbooks = excel.querySubObject("WorkBooks");
    //打开已存在的工作簿
    QString path="D:/Qt/Qt5Book/Qt5.9Samp/happy_prediction_table/build-happy_prediction_table-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug/test.xlsx";
    workbooks->dynamicCall("Open (const QString&)",QString(path));
    //获取活动工作簿
    QAxObject *workbook = excel.querySubObject("ActiveWorkBook");
    //获取第一个工作表
    QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 2);
    QAxObject *usedrange=worksheet->querySubObject("UsedRange");//获取整个worksheet的范围
    QVariant cell=usedrange->dynamicCall("value");//将worksheet的全部内容存储在QVariant变量中
    QList<QList<QVariant>> ret;
    Qvariant2listlistVariant(cell,ret);//将QVariant转换为QList<QList<QVariant>>
    int row=ret.size();
    //qDebug()<<row;
    for(int i=0;i<row;i++)
    {
        QList<QVariant> one=ret.at(i);
        int column=one.size();
        //qDebug()<<column;
        for(int j=0;j<column;j++)
        {
            QString strVal=one.at(j).toString();
            qDebug()<<strVal;
        }
    }
    workbook->dynamicCall("Close()");      //关闭工作簿
    excel.dynamicCall("Quit()");           //关闭excel
    return a.exec();
}

到了这里,关于Qt提取excel表单中数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT使用QXlsx实现对Excel sheet的相关操作 QT基础入门【Excel的操作】

     准备环搭:QT中使用QtXlsx库的三种方法 1、查询打开的Excel中所有可用的工作表(Sheet)名称 功能说明:  查询Excel中所有的工作表(Sheet)名称; 返回值:  所有工作表的名称列表;

    2024年02月11日
    浏览(38)
  • QT操作Excel

    在具体操作之前,我们先了解一下excel的层次结构,如图所示,Application对象–Workbook对象–Worksheet对象–Range对象。 1个excel有一个Application对象,1个Application对象有多个workbook对象组成,这些workbook对象由workbooks对象统一管理,workbook对象下包含若干个worksheet,这些worksheet对象

    2024年02月11日
    浏览(42)
  • Qt 调用 Microsoft Excel 组件生成 Excel 文档

    在.pro文件中添加模块: 参考界面:界面中只有一个 pushButton 按钮。 参考代码: mainwindow.h: mainwindow.cpp: 程序执行效果:会在桌面生成一个data.xlsx文档,打开此文档后显示如下信息: 注意:若你的电脑安装的是 WPS ,没有安装 Office,那么使用 WPS 中的 Excel 也是完全没问题的

    2024年02月15日
    浏览(46)
  • QT中使用QtXlsx库的三种方法 QT基础入门【Excel的操作】

    对于Linux用户,如果Qt是通过“ apt-get”之类的软件包管理器工具安装的,请确保已安装Qt5开发软件包qtbase5-private-dev QtXlsx是一个可以读写Excel文件的库。它不需要Microsoft Excel,可以在Qt5支持的任何平台上使用。该库可用于从头开始生成新的.xlsx文件从现有.xlsx文件中提取数据编

    2024年02月12日
    浏览(44)
  • qt对excel的基本操作

    1.1 配置方面 ​ ① 确保Excel软件在本地服务器注册成功,没注册成功的可以通过 在运行中\\\"E:program FilesMicrosoft OfficeOffice12EXCEL.EXE\\\" /regserver 手动注册,注意路径要用自己的excel路径。 ​ ② 确保组件配制正确,运行命令:dcomcnfg,查看DCOM配置下是否有Microsoft Excel Application,有

    2024年02月04日
    浏览(30)
  • QT使用QAxObject读取Excel教程-全网最全

    QT中没有操作Excel的官方库,本文章介绍的是Windows系统的ActiveX对象(QAxObject)操作Excel。 当然还有一些开源库可以用来操作Excel,详见:Qt处理Excel的一些库 本文只对QAxObject读取Excel作说明。 首先,我们先来解释一些概念,方面我们去理解Qt操作excel的基本流程。 Qt中,QAxObject对

    2024年02月15日
    浏览(37)
  • QT读取Excel表格内容到Table Widget

    有一个需求是要把Excel的数据导入到QT的Table Widget表格中。我是一个QT新手,在网上找了很多方法,在这里汇总记录一下。 目前总共有四种方法: 一、ODBC 导入 二、QAxObject 导入 三、QXlsx 导入 四、复制导入 其中方法 一至三 适用于 不加密的Excel文件 ,如果公司的Excel文件是加

    2024年02月04日
    浏览(31)
  • QT 使用第三方库QtXlsx操作Excel表

    一直以来,都想学习一下C/C++如何操作excel表,在网上调研了一下,觉得使用C/C++去操作很麻烦,遂转向QT这边;QT有一个自带的类 QAxObject ,可以使用他去操作,但随着了解的深入,觉得他并不是很好,有很多其他缺陷(例如必须电脑安装了办公软件才可以进行操作等),所以继

    2024年02月15日
    浏览(43)
  • 【Qt QAxObject】使用 QAxObject 高效任意读写 Excel 表

       Qt 的官网库中是不包含 Microsoft Excel 的操作库,关于对 Microsoft Excel 的操作库可选的有很多,包含基于 Windows 系统本身的 ActiveX 、 Qt Xlsx 、 xlsLib 、 LibXL 、 qtXLS 、 BasicExcel 、 Number Duck 。 库 .xls .xlsx 读 写 平台 Qt Xlsx ❌ ✔️ ✔️ ✔️ 跨平台 xls ✔️ ❌ ❌ ✔️ 跨平台

    2024年02月11日
    浏览(33)
  • 【EXCEL】快速填充数据,批量提取与组合数据

    目录 0.环境 1.简要介绍功能 2.具体实际应用 1)提取括号中的内容 2)拆分重组--重组“姓”和“职位” 3)数据拆分 windows + office2021 注意: 此功能可能需 excel 2013版本及以上 使用 在excel中,有没有遇到过以下情况,有一列是邮箱(名字+@qq.com组成),我希望提取所有的用户名

    2024年02月11日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包