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
一、安装配置
-
- 下载源码,如下图所示,
QXlsx
就是核心代码,里面还包含了很多示例。
- 下载源码,如下图所示,
-
- 创建一个工程,控制台或者带界面的都可以,将
QXlsx
复制到工程目录下。
- 创建一个工程,控制台或者带界面的都可以,将
-
- 在
.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)
二、简单测试
-
- 创建一个
.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;
}
-
- 读取一个
.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;
}
https://blog.csdn.net/qq_36393978/article/details/132542318 使用 QAxObject 高效任意读写 Excel 表 ↩︎ ↩︎
https://blog.csdn.net/techenliu/article/details/133089775 QT之excel的读写 ↩︎