QT读取Excel表格内容到Table Widget

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

QT读取Excel表格内容到Table Widget

前言

有一个需求是要把Excel的数据导入到QT的Table Widget表格中。我是一个QT新手,在网上找了很多方法,在这里汇总记录一下。

导读

目前总共有四种方法:

一、ODBC 导入
二、QAxObject 导入
三、QXlsx 导入
四、复制导入

其中方法一至三适用于不加密的Excel文件,如果公司的Excel文件是加密过的,这三个方法是处理不了的,在我使用时是这样,如果有大佬懂的话请多指教。复制导入加密的Excel也能处理的,除非连复制黏贴都加密了,那真是离谱。

一、ODBC 导入

首先需要确认是否存在处理Excel的DSN
我们可以在C:\Windows\SysWOW64文件夹中找到odbcad32.exe,打开
如果有下面这个就可以了,没有的话看看添加里面有没有,还是没有就再找其他文章安装对应的东西吧,这里就不扩展了
QT读取Excel表格内容到Table Widget
然后就直接写代码就好了,先随便建个QT项目,随便搞个界面
QT读取Excel表格内容到Table Widget

在.pro文件中加入sql
QT读取Excel表格内容到Table Widget
头文件中加入这些

#include <QStandardPaths>
#include <QFileDialog>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
#include <QMessageBox>
#include <QDebug>

随便在界面中加个按钮,然后创建一个**clicked()**的槽函数
函数代码如下:

void MainWindow::on_pushButton_clicked()
{
    //桌面打开//Qt4
    //QString desktopDir=QDesktopServices::storageLocation(QDesktopServices::DesktopLocation);
    //Qt 5
    QString desktopDir=QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
    //选择Excel文件,并获取路径
    QString filePath=QFileDialog::getOpenFileName(NULL,"选择Excel",desktopDir,"*.xlsx *.xls");
    if(filePath.isNull()){
        QMessageBox::warning(NULL, "错误提示", "无法打开excel文件");
        return;
    }
    
    //读取excel
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC","excel");
    if(!db.isValid())
    {
        QMessageBox::warning(NULL, "错误提示", "数据库驱动异常");
        db.close();
        return;
    }

    QString dsn = QString("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Readonly=TRUE;DBQ=%1;").arg(filePath);
    db.setDatabaseName(dsn);
    if(!db.open())
    {
        QMessageBox::warning(NULL, "错误提示", "无法打开数据库");
        db.close();
        return;
    }
    QSqlQuery query(db);
    QString tableName = "Sheet1$"; //sheet名,$是必须的
    QString sql="select * from ["+tableName+"]";
    query.exec(sql);

    int row = 1; //行号
    while (query.next()) {
        //每次query就是一行数据
        for (int i = 0; i < ui->tableWidget->columnCount() - 1; i++)
        {
            QTableWidgetItem *item = new QTableWidgetItem(QString::number(query.value(i).toDouble(), 'f', 2));
            ui->tableWidget->setItem(row, i + 1, item);
        }
        row++;
    }
    query.clear();
    db.close();
}

使用ODBC时,Excel中的数据格式:
QT读取Excel表格内容到Table Widget
第一行是字段名,格式比较固定

二、QAxObject 导入

这个需要在.pro文件中加入axcontainer
QT读取Excel表格内容到Table Widget
头文件中需要加入

#include <QStandardPaths>
#include <QFileDialog>
#include <QMessageBox>
#include <QDebug>
#include <QAxObject>

代码:

void MainWindow::on_pushButton_2_clicked()
{
    QString desktopDir=QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
    QString path=QFileDialog::getOpenFileName(NULL,"选择Excel",desktopDir,"*.xlsx *.xls");
    QAxObject *excel = NULL;
    QAxObject *workbooks = NULL;
    QAxObject *workbook = NULL;
    excel = new QAxObject(this);
    if (!excel->setControl("Excel.Application"))
    {
        excel->setControl("ket.Application");
    }
    if (!excel)
    {
        QMessageBox::critical(NULL, "错误信息", "EXCEL对象丢失");
        return;
    }
    excel->dynamicCall("SetVisible(bool)", false);
    workbooks = excel->querySubObject("WorkBooks");
    workbook = workbooks->querySubObject("Open(const QString&)",path);
    QAxObject * worksheet = workbook->querySubObject("WorkSheets(int)", 1); // 获取第一个工作sheet
    QAxObject * usedrange = worksheet->querySubObject("UsedRange");//获取该sheet的使用范围对象
    QAxObject * rows = usedrange->querySubObject("Rows");
    QAxObject * columns = usedrange->querySubObject("Columns");

    /*获取行数和列数*/
    int intCols = columns->property("Count").toInt();
    int intRows = rows->property("Count").toInt();
    int intRowStart = usedrange->property("Row").toInt();
    int intColStart = usedrange->property("Column").toInt();

    /*获取excel内容*/
    for (int i = intRowStart; i < intRowStart + intRows; i++)  //行
    {
        for (int j = intColStart; j < intColStart + intCols; j++)
        {
            QAxObject *cell = worksheet->querySubObject("Cells(int,int)", i, j);
            QTableWidgetItem *item = new QTableWidgetItem(QString::number(cell->dynamicCall("Value2()").toDouble(), 'f', 2));
            ui->tableWidget->setItem(i, j, item);
            delete cell;
        }
    }
    // 关闭excel
    workbook->dynamicCall("Close(Boolean)",true);
    excel->dynamicCall("Quit(void)");
    delete excel;
    excel = NULL;
}

wps使用的是ket.Application
使用这个时Excel表格的数据格式是这样的:
QT读取Excel表格内容到Table Widget
不需要第一行那个字段名了,直接全是数据就行,但是这种方法处理的速度很慢,可以说是四种方法中最慢的了

三、QXlsx导入

这是QT官方推荐的一个开源项目,看github上好像是一个韩国人开发的
项目的github地址:https://github.com/QtExcel/QXlsx
当然他也有告诉我们安装的步骤:https://github.com/QtExcel/QXlsx/blob/master/HowToSetProject.md
那我就大致翻译一下吧
首先我们先把项目克隆到本地
在一个新建的文件夹中打开cmd
QT读取Excel表格内容到Table Widget
然后在字符界面中输入下面的命令,回车

git clone https://github.com/j2doll/QXlsx.git

QT读取Excel表格内容到Table Widget
下载完成就是一个QXlsx的文件夹
QT读取Excel表格内容到Table Widget
然后打开这个文件夹,里面还有一个QXlsx,把里面的
QT读取Excel表格内容到Table Widget
复制到自己项目的主目录下面
QT读取Excel表格内容到Table Widget
在自己项目的.pro文件中添加

# QXlsx code for Application Qt project
QXLSX_PARENTPATH=./         # current QXlsx path is . (. means curret directory)
QXLSX_HEADERPATH=./header/  # current QXlsx header path is ./header/
QXLSX_SOURCEPATH=./source/  # current QXlsx source path is ./source/
include(./QXlsx.pri)

QT读取Excel表格内容到Table Widget
然后头文件添加

#include "xlsxdocument.h"
#include "xlsxchartsheet.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxrichstring.h"
#include "xlsxworkbook.h"
using namespace QXlsx;

完整代码:

void MainWindow::on_pushButton_3_clicked()
{
    QString desktopDir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
    QString filepath = QFileDialog::getOpenFileName(NULL,"选择Excel",desktopDir,"*.xlsx *.xls");
    Document xlsxR(filepath);
    if (xlsxR.load()) //加载Excel文件
    {
        for (int row = 1; row <= 4; row++)
        {
            for (int col = 1; col <= 4; col++)
            {
                Cell* cell = xlsxR.cellAt(row, col); //获取具体位置单元格
                if (cell != NULL)
                {
                    QVariant var = cell->readValue(); // 读取单元格的内容
                    QTableWidgetItem *item = new QTableWidgetItem(QString::number(var.toDouble(), 'f', 2));
                    ui->tableWidget->setItem(row, col, item);
                }
                else
                {
                    QMessageBox::warning(NULL, "错误提示", "Excel表格数据格式错误");
                    return;
                }
            }
        }
    }
}

注意:它的第一个数据的下标是从1开始的
这种方法的代码量比前面的少,看起来很简洁,速度也快

四、复制导入

我用上面的三种方法都发现无法处理公司的加密Excel。虽然可以先解密再导入,但是解密要申请太麻烦了,所以我就想到这种逆天的做法:直接手动复制Excel中想要导入的内容,然后处理系统剪切板中复制到的内容形成一个数组,再依次绘制在表格中,这样就不用管加不加密了。不过面对连复制黏贴都加密的,也是没用的。而且逼格看起来就没用前面那些看起来高级,显得有点low,哈哈哈
需要导入的头文件:

//获取剪切板内容
#include <QClipboard>
#include <QApplication>
#include <QMimeData>
#include <QMessageBox>

代码:

void MainWindow::on_pushButton_4_clicked()
{
    //获取剪切板内容
    QClipboard *clipboard = QApplication::clipboard();
    QString copyContent = clipboard->text();
	
	//更新 2022-08-03 :在实际应用中出现复制到粘贴板的数据是以"\n"和"\t"连接,少了一个空格,所以会有两种情况
	//我们需要先判断能否使用" \n"分割,若不匹配则改为使用"\n"分割
	QString regex1 = " \n";
	QString regex2 = " \t";
	if (copyContent.split(" \n").size() <= 1)
	{
		regex1 = "\n";
		regex2 = "\t";
	}
    QStringList splitList = copyContent.split(regex1);
    QStringList dataList;
    for (int i = 0; i < splitList.size() - 1; i++)
    {
        dataList.append(splitList.at(i).split(regex2));
    }
    if (dataList.size() != 4 * 4)
    {
        QMessageBox::warning(NULL, "错误提示", "请复制正确的表格内容");
        return;
    }
    for (int i = 0; i < dataList.size(); i++)
    {
        qDebug()<<dataList.at(i);
    }

    for (int i = 0; i < ui->tableWidget->rowCount() - 1; i++)
    {
        for (int j = 0; j < ui->tableWidget->columnCount() - 1; j++)
        {
            QTableWidgetItem *item = new QTableWidgetItem(dataList.at(i * 4 + j));
            ui->tableWidget->setItem(i + 1, j + 1, item);
        }
    }
}

剪切板中的内容是这样的:
注意:可能会出现"\t","\n"前面没有空格的情况

"2.00 \t5.00 \t10.00 \t9.00 \n10.00 \t0.00 \t0.00 \t11.00 \n0.00 \t0.00 \t0.00 \t12.00 \n6.00 \t7.00 \t8.00 \t88.00 \n"

所以就先用 \n 来分割成每一行,再用 \t 分割成每个单元格存入数组列表中,注意前面还有个空格
由于是复制的,所以数据在哪个位置都没问题
QT读取Excel表格内容到Table Widget
我这个操作是先手动复制数据,然后点击界面的按钮进行处理
QT读取Excel表格内容到Table Widget

结尾

ok,就这么多了,不知道大伙儿还有什么其他方法吗?如果对我这篇文章有不解和建议的话,可以直接评论或者私信我哦。

附件

这个演示的项目下载地址(免费的免费的)
https://download.csdn.net/download/qq_16186465/85847594
QXlsx资源下载地址(这是我自己上传的,也可以去github正版官网下)
https://download.csdn.net/download/qq_16186465/85847616文章来源地址https://www.toymoban.com/news/detail-441781.html

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

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

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

相关文章

  • vue表格插件vxe-table导出 excel

    vxe-table 默认支持导出 CSV、HTML、XML、TXT格式的文件,不支持 xlsx 文件 要想导出 xlsx 文件,需要使用 vxe-table-plugin-export-xlsx 依赖  参考:https://cnpmjs.org/package/vxe-table-plugin-export-xlsx/v/2.1.0-beta 1.安装  例子: 如果用最新版的,依赖,这样使用就会报错 Uncaught (in promise) 亲测2.2.2版

    2024年01月22日
    浏览(15)
  • Java 读取 Excel 表格—— Easy Excel 基本使用

    Java 读取 Excel 表格—— Easy Excel 基本使用

    确定表头:建立对象,和表头形成映射关系。 不确定表头:每一行数据映射为 MapString, Object ,比如用户自己上传的表格。 监听器:先创建监听器、在读取文件时绑定监听器。单独抽离处理逻辑,代码清晰易于维护;一条一条处理,适用于数据量大的场景。 同步读:无需创建

    2024年01月21日
    浏览(16)
  • Element ui table表格内容超出隐藏显示省略号

    Element ui table表格内容超出隐藏显示省略号

    element ui官方文档上面有个参数 给el-table-column设置:show-overflow-tooltip=\\\"true\\\"属性可以使单元格超出的内容被隐藏显示为...当鼠标移入时单元格的上方会弹出一个tooltip来显示单元格的所有内容。 效果图: 有时候因为table中的文字非常的多,而show-overflow-tooltip默认是把折叠的内容全

    2024年02月11日
    浏览(11)
  • Python如何读取Excel表格数据

    Python如何读取Excel表格数据

    环境: Pycharm IDE 3.9  2021.2.1 Excel作为目前主要的流行数据表格,其存储的数据整齐,强可观性。需要对大量的数据进行分析时,可以利用python脚本语言进行数据分析。 python读取excel数据: 1.打开 pycharm IDE ,新建项目,在IDE 的UI界面下点击左下角的 Python Packages .   此项用于安

    2024年02月05日
    浏览(10)
  • vue纯前端导入excel,获取excel的表格数据渲染el-table

    vue纯前端导入excel,获取excel的表格数据渲染el-table

    最近有个需求,最开始列表数据是通过新增按钮一条条添加的,但是部分数据量可能上百条,客户自己手选会很慢,所以产品经理给了个需求要求可以通过上传excle文件进行导入。 经过网上查询及涉及自己项目,实现了此功能。 第一步:安装插件,我安的是0.16.0;原因是默认

    2024年02月16日
    浏览(16)
  • 94.qt qml-分页Table表格组件

    94.qt qml-分页Table表格组件

    在我们之前学习了87.qt qml-分页组件控件(支持设置任意折叠页数等)_qt分页控件_诺谦的博客-CSDN博客 然后我们又学习了Table实现,所以本章实现一个分页Table表格组件,配合分页控件, 模拟请求服务器数据来实现数据分解效果,因为一般使用分页的时候,一般都是分页请求,避

    2024年02月15日
    浏览(10)
  • vue+Element UI Table表格动态渲染表头内容及操作按钮

    循环表格头信息数组 封装操作组件并引入表格文件内 配置表头信息数组及添加操作事件

    2024年02月13日
    浏览(44)
  • 【Unity】用Excel库读取Excel表格(.xlsx或者.xls)

    【Unity】用Excel库读取Excel表格(.xlsx或者.xls)

    首先需要下载解析的库  EPPlus,  Excel,  ICSharpCode.SharpZipLib    下载链接: https://download.csdn.net/download/weixin_46472622/87238048 使用方法 我的Excel 表格是这样的,每一列有一个 我用一个结构体对象来表示 读取的方法  全部代码,以及调用: 如果是打包PC端的exe,需要将编辑

    2024年02月12日
    浏览(14)
  • qt表格可修改不可修改(qt tableview修改表格内容)

    qt表格可修改不可修改(qt tableview修改表格内容)

    QTableWidget是QT程序中常用的显示数据表格的控件.qt表格可修改不可修改. 不管是在金融app,还是医疗机械,还是智慧农业,QTableWidget无处不在. QTableWidget的效果大概如下图: 好了,接下来就来教大家如何使用QTableWidget. 首先,它的位置控件在: 注意,不要拖错控件,很多同学容易犯的错误

    2024年02月09日
    浏览(11)
  • vue Element UI table表格根据内容长度自适应列宽(af-table-column解决)

    vue Element UI table表格根据内容长度自适应列宽(af-table-column解决)

    支持自适应列宽功能, 使用方法如下: 安装 引入 使用在需要自适应的列上使用即可 使用前效果 使用后效果

    2024年02月14日
    浏览(15)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包