Qt Excel读写 - QXlsx的安装配置以及测试

news2024/11/17 15:41:56

Qt Excel读写 - QXlsx的安装配置以及测试

  • 引言
  • 一、安装配置
  • 二、简单测试

引言

Qt无自带的库处理Excel 文件,但可通过QAxObject 借助COM接口进行Excel的读写1。亦可使用免费的开源第三方库:QXlsx,一个基于Qt库开发的用于读写Microsoft Excel文件的C++库。它提供了一组简单易用的API,可以方便地创建、修改和操作Excel文件。

可参考:
https://github.com/QtExcel/QXlsx 官方源码
https://gitcode.com/qtexcel/qxlsx/overview?utm_source=csdn_github_accelerator&isLogin=1 官方源码 - gitCode(GitHub加速计划 - 推荐)
https://blog.csdn.net/qq_36393978/article/details/132542318 使用 QAxObject 高效任意读写 Excel 表1
https://blog.csdn.net/techenliu/article/details/133089775 QT之excel的读写2

一、安装配置

    1. 下载源码,如下图所示,QXlsx就是核心代码,里面还包含了很多示例。
      在这里插入图片描述
    1. 创建一个工程,控制台或者带界面的都可以,将QXlsx复制到工程目录下。
      在这里插入图片描述
    1. .pro文件中添加以下语句,将QXlsx添加到工程中,保存pro文件 (自动会执行qmake 或自己手动执行) :
# QXlsx code for Application Qt project
QXLSX_PARENTPATH=./QXlsx/         # current QXlsx path is . (. means curret directory)
QXLSX_HEADERPATH=./QXlsx/header/  # current QXlsx header path is ./header/
QXLSX_SOURCEPATH=./QXlsx/source/  # current QXlsx source path is ./source/
include(./QXlsx/QXlsx.pri)

在这里插入图片描述

二、简单测试

    1. 创建一个.xlsx文件,对单元格赋值,保存到磁盘上。
      在这里插入图片描述
#include "mainwindow.h"
#include <QApplication>

// QXlsx
#include "xlsxdocument.h"
#include "xlsxchartsheet.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxrichstring.h"
#include "xlsxworkbook.h"

int main(int argc, char *argv[])
{
//    QApplication a(argc, argv);
//    MainWindow w;
//    w.show();

//    return a.exec();
    // 测试QXlsx
    QXlsx::Document xlsx;
    xlsx.write("A1", "A1");   // (A,1)  第一行第一列
    xlsx.write(1, 2, "A2");   // (A,2)  第一行第二列
    xlsx.saveAs("Test.xlsx"); // 保存
    return 0;
}

    1. 读取一个.xlsx文件,输出到控制台。(使用官方的ShowConsole代码)
      修改官方代码.pro文件,配置添加QXlsx。修改xlsxFileName为刚才生成的Test.xlsx,运行即可。
      在这里插入图片描述
// main.cpp

#include <iostream>
#include <vector>

#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QVariant>
#include <QtCore>
#include <QtGlobal>
using namespace std;

// [0] include QXlsx headers
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxchartsheet.h"
#include "xlsxdocument.h"
#include "xlsxrichstring.h"
#include "xlsxworkbook.h"
using namespace QXlsx;

#include "fort.hpp" // libfort

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // get xlsx file name
    QString xlsxFileName = "Test.xlsx";
    qDebug() << xlsxFileName;

    // tried to load xlsx using temporary document
    QXlsx::Document xlsxTmp(xlsxFileName);
    if (!xlsxTmp.isLoadPackage()) {
        qCritical() << "Failed to load" << xlsxFileName;
        return (-1); // failed to load
    }

    // load new xlsx using new document
    QXlsx::Document xlsxDoc(xlsxFileName);
    xlsxDoc.isLoadPackage();

    int sheetIndexNumber = 0;
    foreach (QString curretnSheetName, xlsxDoc.sheetNames()) {
        QXlsx::AbstractSheet *currentSheet = xlsxDoc.sheet(curretnSheetName);
        if (NULL == currentSheet)
            continue;

        // get full cells of sheet
        int maxRow = -1;
        int maxCol = -1;
        currentSheet->workbook()->setActiveSheet(sheetIndexNumber);
        Worksheet *wsheet = (Worksheet *) currentSheet->workbook()->activeSheet();
        if (NULL == wsheet)
            continue;

        QString strSheetName = wsheet->sheetName(); // sheet name

        // display sheet name
        std::cout << std::string(strSheetName.toLocal8Bit()) << std::endl;

        QVector<CellLocation> clList = wsheet->getFullCells(&maxRow, &maxCol);

        QVector<QVector<QString>> cellValues;
        for (int rc = 0; rc < maxRow; rc++) {
            QVector<QString> tempValue;
            for (int cc = 0; cc < maxCol; cc++) {
                tempValue.push_back(QString(""));
            }
            cellValues.push_back(tempValue);
        }

        for (int ic = 0; ic < clList.size(); ++ic) {
            // cell location
            CellLocation cl = clList.at(ic);

            int row = cl.row - 1;
            int col = cl.col - 1;

            // https://github.com/QtExcel/QXlsx/commit/9ab612ff5c9defc35333799c55b01be31aa66fc2
            // {{
            // QSharedPointer<Cell> ptrCell = cl.cell; // cell pointer
            std::shared_ptr<Cell> ptrCell = cl.cell; // cell pointer

            // value of cell
            // QVariant var = cl.cell.data()->value();
            QVariant var = ptrCell->value();
            // }}

            QString str = var.toString();

            cellValues[row][col] = str;
        }

        fort::table fortTable;
        for (int rc = 0; rc < maxRow; rc++) {
            for (int cc = 0; cc < maxCol; cc++) {
                QString strTemp = cellValues[rc][cc];
                fortTable << std::string(strTemp.toLocal8Bit()); // display value
            }
            fortTable << fort::endr; // change to new row
        }

        std::cout << fortTable.to_string() << std::endl; // display forttable row

        sheetIndexNumber++;
    }

    return 0;
}


  1. https://blog.csdn.net/qq_36393978/article/details/132542318 使用 QAxObject 高效任意读写 Excel 表 ↩︎ ↩︎

  2. https://blog.csdn.net/techenliu/article/details/133089775 QT之excel的读写 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1423376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

存储监控工具:监控存储区域网络(SAN)

从托管应用程序到提供大型多媒体服务&#xff0c;组织都依靠其 IT 基础架构来提供无与伦比的最终用户体验。为了提供这种卓越的体验&#xff0c;必须大大提高应用程序的可用性和性能。在许多其他挑战中&#xff0c;存储区域网络 &#xff08;SAN&#xff09; 正好用于应对这些挑…

Fiddler-02使用

文章目录 一、Fiddler的作用二、Fiddler抓取https请求三、Fiddler过滤请求1、案例一2、案例二3、过滤页面介绍4、总结 四、Fiddler删除数据五、Fiddler接口基础概述六、Fiddler请求响应报文详解1、请求2、响应 七、Fiddler定位前后端的问题八、Fiddler弱网测试方式一&#xff1…

(十六)串口UART

文章目录 UART简介传输数据帧和波特率定时器1作为串口1波特率发生器串口部分相关寄存器TMODAUXRPCONSCONSBUF 串口1工作模式1&#xff1a;8位UART&#xff0c;波特率可变总体工作原理如何简单接收一个字符和发送数据一步之遥的设置现象演示 UART简介 通用异步收发传输器(Unive…

程序员每天会阅读哪些技术网站来提升自己?

我有一个很特别的习惯……每周会固定一天去看一下接单网站上的高薪单子&#xff0c;不完全是为了接单&#xff0c;而是看现在稀缺的岗位是什么…… 其实很多程序员对外包接单都有误解&#xff0c;觉得外包接单平台上的项目都是一些边缘的、没人愿意干的项目&#xff0c;虽然这类…

好用的制造业项目管理工具推荐:提升生产效率与项目成功的关键利器

有什么好用的制造业项目管理工具&#xff1f;制造业作为传统行业&#xff0c;经常会采用项目制管理模式&#xff0c;项目管理对制造业的重要性不言而喻。2024年制造业企业面对国内依然激烈的竞争&#xff0c;想要进一步发展&#xff0c;不仅要对外谋取&#xff0c;也要对内优化…

【LLM多模态】Cogview3、DALL-E3、CogVLM、CogVideo模型

note 文章目录 noteVisualGLM-6B模型图生文&#xff1a;CogVLM-17B模型1. 模型架构2. 模型效果 文生图&#xff1a;CogView3模型DALL-E3模型CogVideo模型网易伏羲-丹青模型Reference VisualGLM-6B模型 VisualGLM 是一个依赖于具体语言模型的多模态模型&#xff0c;而CogVLM则是…

2024年【中级消防设施操作员(考前冲刺)】考试题及中级消防设施操作员(考前冲刺)考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 中级消防设施操作员&#xff08;考前冲刺&#xff09;考试题参考答案及中级消防设施操作员&#xff08;考前冲刺&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及中级消防设施操作员&#xff08;考前冲刺…

[PHP]严格类型

PHP: 类型声明 - Manual

如何有效获取 Go 变量类型?探索多种方法

嗨&#xff0c;大家好&#xff01;本文是系列文章 Go 小技巧第九篇&#xff0c;系列文章查看&#xff1a;Go 语言小技巧。 文章目录 Go 的类型系统类型获取使用 fmt.Printf类型选择类型选择反射 reflect.TypeOf 其他注意点错误处理性能考量 总结 在 Python 中&#xff0c;可以使…

SpringBoot项目logback日志配置

Session 认证和 Token 认证 过滤器和拦截器 SpringBoot统一返回和统一异常处理 SpringBoot项目logback日志配置 程序运行出现错误时&#xff0c;第一时间想到的是甩锅还是日志&#xff1f;通过查看日志定位出问题的位置&#xff0c;才能更好的甩锅&#xff0c;今天就来学习…

Mastercam 2024 下载安装教程,流程简单,小白也能轻松搞定,附安装包和工具

前言 Mastercam是一款高效专业的实用型CAD/CAM设计辅助工具&#xff0c;集二维绘图、三维实体造型、曲面设计、体素拼合、数控编程、刀具路径模拟及真实感模拟等多种功能于一身&#xff0c;能够帮助用户轻松设计各种复杂的曲线、曲面零件、刀具路径等。 准备工作 1、Win10及…

Python爬虫:数据获取requests

1. 基本用法 1.1. 安装requests库 pip3 install requests 1.2. 发送HTTP请求 requests.request(method, url, **kwargs) 1.3. 发送GET请求 requests.get(url, paramsNone, **kwargs) 1.4. 发送POST请求 requests.post(url, dataNone, jsonNone, **kwargs) 1.5. 发送PU…

传感器类总结(一)MPU9250 3-2程序关于IIC的底层程序

关于IIC的逻辑和底层协议可以看之前总结的 #IIC 通信协议 1、读写数据 1.1、写数据 发送N个字节程序的流程: 1、发送起始信号 2、发送从机地址和写 3、等待从机发回应答信号 4、发送第一字节数据 等待应答 5、发送下一字节数据 等带应答或非应答信号 6、发送停止信号停止发送…

Kafka核心概念、数据存储设计及Partition数据文件 生产者负载均衡策略、批量发送技巧、消息压缩手段、消费者设计

关注公众号&#xff0c;发送 “面试题” 即可免费领取一份超全的面试题PDF文件&#xff01;&#xff01;&#xff01;&#xff01; 1、kafka的概念 Kafka 是一个开源的分布式流处理平台&#xff0c;最初由LinkedIn开发&#xff0c;后来成为Apache软件基金会的一个顶级项目。它…

【解决】Unity 工程无法正常打开而崩溃问题

开发平台&#xff1a;Unity 2022.3.17f1c1 一、问题描述 访问 Unity 工程等待 Open Projet&#xff08;busy for 时间&#xff09;&#xff0c;出现崩溃、闪退等情况&#xff0c;导致无法正常进入Unity编辑页面。 二、问题分析 笔者在 URP 渲染管线下处理 Obi Fluid 流体插件 D…

detectron2的read_image方法

在看代码的时候&#xff0c;看到一行注释&#xff1a;use PIL, to be consistent with evaluation 说是用PIL方法加载&#xff0c;却又看见了BGR这种表述&#xff0c;后面的调用也都是cv2格式&#xff1a; 那我就要看下这里面是怎么实现的了&#xff0c;找到了read_image函数&…

知识点积累系列(一)golang语言篇【持续更新】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 知识点积累 系列文章的第一篇&#xff0c;记录golang语言相关的知识点 1.结构体的mapstructure是什么 mapstructure:"default" mapstructure是一个Go语言的库&#xff0c;用于将一个map中的值映射到…

通过手写简易版RPC理解RPC原理

RPC是什么 所谓的RPC其实是为了不同主机的两个进程间通信而产生的&#xff0c;通常不同的主机之间的进程通信&#xff0c;程序编写需要考虑到网络通信的功能&#xff0c;这样程序的编写将会变得复杂。RPC就来解决这一问题的&#xff0c;一台主机上的进程对另外一台主机的进程发…

【2024程序员必看】鸿蒙应用开发行业分析

鸿蒙操作系统沉浸四年&#xff0c;这次终于迎来了破局的机会&#xff0c;自从2023年华为秋季发布会上宣布鸿蒙 Next操作系统不在兼容Android后&#xff0c;就有不少大厂开始陆续与华为达成了鸿蒙原生应用的开发合作&#xff0c;据1月18日华为官方宣布110多天的产业合力“突进”…

log4j2 无垃圾稳态日志 Garbage-free Steady State Logging

无垃圾稳态日志 垃圾收集暂停是导致延迟峰值的常见原因&#xff0c;对于许多系统来说&#xff0c;需要花费大量精力来控制这些暂停。 许多日志库&#xff0c;包括以前版本的Log4j&#xff0c;在稳态日志记录期间分配临时对象&#xff0c;如日志事件对象、字符串、char数组、字…