Qt优秀开源项目之二十四:EXCEL读写利器QXlsx

server/2024/10/20 10:42:17/

QXlsx是基于Qt5/Qt6的Excel文件(*.xlsx)的读写库。
github地址:https://github.com/QtExcel/QXlsx
QXlsx既可以编译成库,也可以直接引用源码QXlsx-master\QXlsx\QXlsx.pri
QXls提供了非常丰富的Examples,比如:

1️⃣ 读单元格数据

using namespace QXlsx;Document doc("ReadExcel.xlsx");
if (!doc.load())return false;int row = 1; int col = 1;
QVariant var = doc.read( row, col );
// check type of var for more information
qDebug() << var.toString(); 

2️⃣ 写单元格数据

QVariant writeValue = QString("hello"); // you can use QString, double(or int), QDateTime, QDate, QTime
int row = 1; int col = 1;
doc.write(row, col, writeValue);doc.saveAs("datetime.xlsx");

3️⃣ 添加sheet

doc.addSheet("added sheet"); // add a sheet. current sheet is 'added sheet'.
int row = 1; int col = 1;
QVariant var = doc.read( row, col );

4️⃣ 选择sheet

doc.selectSheet("added sheet"); // select a sheet. current sheet is 'added sheet'.
int row = 1; int col = 1;
QVariant var = doc.read( row, col );

5️⃣ 读所有sheet的数据

using namespace QXlsx;
Document xlsxDoc;// ...int sheetIndexNumber = 0;
foreach( QString currentSheetName, xlsxDoc.sheetNames() )
{// get current sheet AbstractSheet* currentSheet = xlsxDoc.sheet( currentSheetName );if ( NULL == currentSheet )continue;// get full cells of current sheetint maxRow = -1;int maxCol = -1;currentSheet->workbook()->setActiveSheet( sheetIndexNumber );Worksheet* wsheet = (Worksheet*) currentSheet->workbook()->activeSheet();if ( NULL == wsheet )continue;QString strSheetName = wsheet->sheetName(); // sheet nameqDebug() << strSheetName; 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 ){CellLocation cl = clList.at(ic); // cell locationint row = cl.row - 1;int col = cl.col - 1;QSharedPointer<Cell> ptrCell = cl.cell; // cell pointer// value of cellQVariant var = cl.cell.data()->value();QString str = var.toString();cellValues[row][col] = str;}for (int rc = 0; rc < maxRow; rc++){for (int cc = 0; cc < maxCol; cc++){QString strCell = cellValues[rc][cc];qDebug() << "( row : " << rc << ", col : " << cc << ") " << strCell; // display cell value}}sheetIndexNumber++;
}

6️⃣ 日期和时间

  • Code
using namespace QXlsx;Document doc;doc.write( "A1", QVariant(QDateTime::currentDateTimeUtc()) );
doc.write( "A2", QVariant(double(10.5)) );
doc.write( "A3", QVariant(QDate(2019, 10, 9)) );
doc.write( "A4", QVariant(QTime(10, 9, 5)) );
doc.write( "A5", QVariant((int) 40000) );qDebug() << "doc.read()";
qDebug() << doc.read( 1, 1 ).type() << doc.read( 1, 1 );
qDebug() << doc.read( 2, 1 ).type() << doc.read( 2, 1 );
qDebug() << doc.read( 3, 1 ).type() << doc.read( 3, 1 );
qDebug() << doc.read( 4, 1 ).type() << doc.read( 4, 1 );
qDebug() << doc.read( 5, 1 ).type() << doc.read( 5, 1 );
qDebug() << "\n";qDebug() << "doc.cellAt()->value()";
qDebug() << doc.cellAt( 1, 1 )->value().type() << doc.cellAt( 1, 1 )->value();
qDebug() << doc.cellAt( 2, 1 )->value().type() << doc.cellAt( 2, 1 )->value();
qDebug() << doc.cellAt( 3, 1 )->value().type() << doc.cellAt( 3, 1 )->value();
qDebug() << doc.cellAt( 4, 1 )->value().type() << doc.cellAt( 4, 1 )->value();
qDebug() << doc.cellAt( 5, 1 )->value().type() << doc.cellAt( 5, 1 )->value();doc.saveAs("datetime.xlsx");
  • Output
doc.read()
QVariant::QDateTime QVariant(QDateTime, QDateTime(2019-10-12 01:25:59.047 대한민국 표준시 Qt::LocalTime))
QVariant::double QVariant(double, 10.5)
QVariant::QDate QVariant(QDate, QDate("2019-10-09"))
QVariant::QTime QVariant(QTime, QTime("10:09:05.000"))
QVariant::double QVariant(double, 40000)doc.cellAt()->value()
QVariant::double QVariant(double, 43750.1)
QVariant::double QVariant(double, 10.5)
QVariant::double QVariant(double, 43747)
QVariant::double QVariant(double, 0.422975)
QVariant::double QVariant(double, 40000)

7️⃣ 单元格的颜色

void printColor(Cell* cell)
{if ( NULL == cell )return;QColor clrForeGround = cell->format().patternForegroundColor();QColor clrBackGround = cell->format().patternBackgroundColor();if ( clrForeGround.isValid() &&clrBackGround.isValid() ){qDebug() << "[debug] color : " << clrForeGround << clrBackGround;}
}

此处省略N个例子............................

除了基本功能外,一些不常用的功能也是提供的,比如分组(类似树结构的折叠和展开):

原文链接:Qt优秀开源项目之二十四:EXCEL读写利器QXlsx-CSDN博客


http://www.ppmy.cn/server/133313.html

相关文章

十四、行为型(观察者模式)

观察者模式&#xff08;Observer Pattern&#xff09; 概念 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了对象间的一对多依赖关系&#xff0c;当被观察的对象&#xff08;主题&#xff09;状态发生改变时&#xff0c;所有依赖…

STM32—旋转编码器控制直流电机(标准库)

本文使用 KY-040旋转编码器 通过TC1508A电机驱动模块来控制直流电机正转和反转&#xff08;Speed&#xff1a;0-100&#xff09;&#xff0c;代码部分基于标准库&#xff0c;使用定时器输出比较两个通道来控制PWM输出。 一、KY-040旋转编码器 下图为KY-040旋转编码器&#xf…

数据结构常考基础代码题-数组倒置

题目要求 将数组 (a1, a2, a3, ..., am, b1, b2, ..., bn) 转换成 (b1, b2, ..., bn, a1, a2, a3, ..., am)。 代码实现步骤 第一步&#xff1a;定义反转函数 根据题目中的“将数组中的元素顺序反转”&#xff0c;我们需要实现一个函数 Reverse&#xff0c;用于反转数组中从…

kafka脚本工具使用

如何定位kakfa消费端消息异常问题 查看主题查看消费者组查看消费者详情&#xff08;LAG: 消费者与最新消息的滞后程度(数字越大说明消费者处理消息的速度越慢)&#xff09; 进入docker容器&#xff0c;直接运行sh脚本即可 docker exec -it <containerName> /bin/bash或…

游戏盾真的能无视攻击吗?

在当今社会&#xff0c;网络游戏已成为人们娱乐休闲的重要组成部分。随着游戏行业的快速扩展&#xff0c;网络安全挑战也随之加剧。DDoS攻击、CC攻击等恶意手段频繁出现&#xff0c;给游戏运营商及玩家带来了重重困扰。幸运的是&#xff0c;游戏盾这一专为游戏领域设计的网络安…

C语言:c语言中‘ ‘空格与‘\0‘的区别

c语言中’ ‘空格与’\0’的区别 在C语言中&#xff0c;空格和\0是两个不同的字符&#xff0c;具有不同的作用和含义。 空格&#xff08;’ &#xff09;是一个可打印的字符&#xff08;可见字符&#xff09;&#xff0c;用于表示空白区域。它的ASCII值为32&#xff0c;主要用于…

读书读到NOBEL

最近在读陈逸鹤的《程序员的自我修养》这本书&#xff0c;里面有这么一段话&#xff1a; “远古时代的人们只能创造出用于猎捕的长矛&#xff0c;而今天借助来自各行各业人 们的智慧&#xff0c;我们可以制造出高铁、大型飞机&#xff0c;并探索宇宙。但要更进一步解决人类所面…

LeetCode 24 - 两两交换链表中的节点

题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 解题思路 交换链表中相邻节点的问题可以通过迭代或递归来解决。本…