Win10(11)下Qt6.2编译Qtxlsx库


Qtxlsx简介

QtXlsx是一个可以读取和写入Excel文件的库。它不需要Microsoft Excel,可以在Qt5支持的任何平台上使用。QtXlsx库可以用来

  • 生成一个新的.xlsx文件;
  • 从已有的.xlsx文件中提取数据;
  • 编辑已有.xlsx文件。

一、准备

1.1 QtXlsx源码下载

https://github.com/dbzhang800/QtXlsxWriter

1.2 Perl5下载

https://www.perl.org/get.html

在这里插入图片描述

二、编译源码

已安装QtCreator(QT6.2)

2.1 打开源码

直接打开src下的src.pro工程。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.2 修改编译错误

错误列表,排名不分先后。
1.error: C2371: “QStringList”: 重定义;不同的基类型。
【解析】:

在这里插入图片描述

//xlsxutility_p.h
#ifndef XLSXUTILITY_H
#define XLSXUTILITY_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt Xlsx API.  It exists for the convenience
// of the Qt Xlsx.  This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//

#include "xlsxglobal.h"
class QPoint;
class QString;
class QStringList;
class QColor;
class QDateTime;
class QTime;

直接删除前置声明。

2.error: unknown type name ‘QStringRef’。
【解析】:QStringRef移到core5compat模块,详见c++程序从QT5(MSVC2015)移植到QT6.2(MSVC2019)

//qtxlsx.pri
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat

使用该类的地方需要主动包含头文件 #include < QStringRef >。

3.xlsxchart.cpp:269:16: error: no viable conversion from ‘QStringView’ to ‘QStringRef’。
【解析】:QStringView QXmlStreamReader::name() const;
返回值变成了QStringView,而原来的代码使用的是QStringRef。
建议用QStringView替代QStringRef,源代码里的QStringRef相关需要修改。如果改用QStringView,那工程文件就不必添加greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat了。

4.xlsxformat.cpp:549:34: error: incomplete type ‘QIODevice’ named in nested name specifier
qdatastream.h:56:7: note: forward declaration of ‘QIODevice’。

【解析】:
在使用该类的地方主动引用#include < QIODevice>。

5.xlsxstyles.cpp:55:9: error: use of undeclared identifier ‘qRegisterMetaTypeStreamOperators’。
xlsxstyles.cpp:56:20: error: no member named ‘registerDebugStreamOperator’ in ‘QMetaType’。

【解析】:https://www.qt.io/blog/whats-new-in-qmetatype-qvariant
在这里插入图片描述

大致意思就是都啥时候了,都二十一世纪了,还用这些过时的代码,巴拉巴拉,总之就在源码中删除就完事了。

6.xlsxcolor.cpp:131:11: error: no member named ‘sprintf’ in 'QString’
【解析】:sprintf修改为asprintf。

7.xlsxcolor.cpp:114:12: error: no matching constructor for initialization of 'QVariant’
【解析】:QVariant()初始化方式修改。

XlsxColor::operator QVariant() const
{
    return QVariant(qMetaTypeId<XlsxColor>(), this);
}

修改成

XlsxColor::operator QVariant() const
{
    return QVariant::fromValue<XlsxColor>(*this);
}

三、编译例程

3.1 打开源码

直接打开qtxlsxwriter-master下的qtxlsx.pro工程。
在这里插入图片描述
在这里插入图片描述

3.2 修改编译错误

1.main.cpp:281:5: error: use of undeclared identifier ‘qsrand’; did you mean ‘srand’?
stdlib.h:350:23: note: ‘srand’ declared here。
main.cpp:284:34: error: use of undeclared identifier ‘qrand’; did you mean ‘rand’?
stdlib.h:352:37: note: ‘rand’ declared here

【解析】:qrand()、qsrand()已弃用,使用QRandomGenerator类替代。

qsrand(QDateTime::currentMSecsSinceEpoch());
for (int row = 2; row < 31; ++row) {
    for (int col = 1; col <= 10; ++col)
        xlsx.write(row, col, qrand() % 100);
}

修改成

for (int row = 2; row < 31; ++row) {
    for (int col = 1; col <= 10; ++col)
        xlsx.write(row, col, QRandomGenerator::system()->generate() % 100);
}

部分内容参考QtXlsx适配qt6源码修改,由于源码版本不一样,所以错误代码也有部分差异。

四、使用Qtxlsx库

4.1 生成库

如果没修改工程文件,那默认生成路径在源码同级目录中。
在这里插入图片描述

4.2 配置QT可识别的库

QT += xlsx

作为三方库,上图的三个文件已经够了,即dll,.h,lib文件。但是要把这个库配置成QT的原生库,还需要将这些文件配置到QT安装目录下。
1.拷贝头文件
在这里插入图片描述

在这里插入图片描述

D:\program\Qt为我的QT安装路径。

2.将Qt6Xlsx.prl、Qt6Xlsxd.prl、Qt6Xlsx.lib

在这里插入图片描述
拷贝到
在这里插入图片描述

我只编译了release版本,不知为何出来个Qt6Xlsxd.prl,不知道有没有用,先拷过去再说。

3.将dll文件Qt6Xlsx.dll
在这里插入图片描述
拷贝到
在这里插入图片描述
4.最重要的一步,将mkspecs\modules下的qt_lib_xlsx.pri
在这里插入图片描述

//qt_lib_xlsx.pri
QT_MODULE_BIN_BASE = D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/bin
QT_MODULE_INCLUDE_BASE = D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/include
QT_MODULE_LIB_BASE = D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/lib
QT_MODULE_HOST_LIB_BASE = D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/lib
include(D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/mkspecs/modules-inst/qt_lib_xlsx.pri)
QT.xlsx.priority = 1
include(D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/mkspecs/modules-inst/qt_lib_xlsx_private.pri)
QT.xlsx_private.priority = 1

拷贝到QT安装目录下的mkspecs\modules
在这里插入图片描述

关于qt_lib_xlsx.pri文件这里要做下解释说明,和QT原生库做了对比,内容差别还是挺大的。

//qt_lib_xml.pri
QT.xml.VERSION = 6.2.2
QT.xml.name = QtXml
QT.xml.module = Qt6Xml
QT.xml.libs = $$QT_MODULE_LIB_BASE
QT.xml.ldflags = 
QT.xml.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtXml
QT.xml.frameworks = 
QT.xml.bins = $$QT_MODULE_BIN_BASE
QT.xml.depends =  core
QT.xml.uses = 
QT.xml.module_config = v2
QT.xml.DEFINES = QT_XML_LIB
QT.xml.enabled_features = dom
QT.xml.disabled_features = 
QT_CONFIG += dom
QT_MODULES += xml
//qt_lib_xlsx.pri
QT_MODULE_BIN_BASE = D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/bin
QT_MODULE_INCLUDE_BASE = D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/include
QT_MODULE_LIB_BASE = D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/lib
QT_MODULE_HOST_LIB_BASE = D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/lib
include(D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/mkspecs/modules-inst/qt_lib_xlsx.pri)
QT.xlsx.priority = 1
include(D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/mkspecs/modules-inst/qt_lib_xlsx_private.pri)
QT.xlsx_private.priority = 1

既然文件里有绝对路径,也试了下将编译文件删除,结果是不能使用

QT += xlsx

在这里插入图片描述
未删除前,某得问题。
在这里插入图片描述
仔细阅读qt_lib_xlsx.pri文件发现最后两句有点问题

include(D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/mkspecs/modules-inst/qt_lib_xlsx.pri)
QT.xlsx.priority = 1
include(D:/code/src/qtxlsxwriter-master/build-qtxlsx-Desktop_Qt_6_2_2_MSVC2019_64bit-Release/mkspecs/modules-inst/qt_lib_xlsx_private.pri)
QT.xlsx_private.priority = 1

modules-inst文件夹下还有个qt_lib_xlsx.pri文件,
在这里插入图片描述

打开一看

QT.xlsx.VERSION = 0.3.0
QT.xlsx.name = QtXlsx
QT.xlsx.module = Qt6Xlsx
QT.xlsx.ldflags = 
QT.xlsx.libs = $$QT_MODULE_LIB_BASE
QT.xlsx.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/QtXlsx
QT.xlsx.frameworks =
QT.xlsx.bins = $$QT_MODULE_BIN_BASE
QT.xlsx.depends = core gui
QT.xlsx.uses =
QT.xlsx.module_config = v2
QT.xlsx.DEFINES = QT_XLSX_LIB
QT.xlsx.enabled_features =
QT.xlsx.disabled_features =
QT_CONFIG +=
QT_MODULES += xlsx

和原生库的文件极度相似,将modules-inst文件夹下的qt_lib_xlsx.pri文件拷贝到QT安装路径下,覆盖原来的文件,重新qmake。
在这里插入图片描述
极度舒爽。

编译后的文件可以在资源下载。

  • 13
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

家有一枚袁宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值