当前位置: 首页 > news >正文

QT5使用cmakelists引入Qt5Xlsx库并使用

1、首先需要已经有了Qt5Xlsx的头文件和库,并拷贝到程序exe路径下(以xxx.exe/3rdparty/qtxlsx路径为例,Qt5Xlsx版本为0.3.0);
2、cmakelist中:

# 设置 QtXlsx 路径
set(QTXLSX_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtxlsx)
set(QTXLSX_INCLUDE_DIR ${QTXLSX_ROOT_DIR}/include)
# 检查 QtXlsx 是否存在
if(NOT EXISTS ${QTXLSX_ROOT_DIR})message(FATAL_ERROR "QtXlsx directory not found at: ${QTXLSX_ROOT_DIR}")
endif()
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include${QTXLSX_INCLUDE_DIR}
)
# 根据构建类型选择库文件# Windows 系统set(QTXLSX_LIB_DEBUG ${QTXLSX_ROOT_DIR}/lib/Qt5Xlsxd.lib)set(QTXLSX_LIB_RELEASE ${QTXLSX_ROOT_DIR}/lib/Qt5Xlsx.lib)# 设置导入库目标add_library(QtXlsx SHARED IMPORTED)# 设置调试版属性set_target_properties(QtXlsx PROPERTIESIMPORTED_IMPLIB_DEBUG ${QTXLSX_LIB_DEBUG}IMPORTED_LOCATION_DEBUG ${QTXLSX_ROOT_DIR}/lib/Qt5Xlsxd.dllMAP_IMPORTED_CONFIG_MINSIZEREL ReleaseMAP_IMPORTED_CONFIG_RELWITHDEBINFO Release)# 设置发布版属性set_target_properties(QtXlsx PROPERTIESIMPORTED_IMPLIB_RELEASE ${QTXLSX_LIB_RELEASE}IMPORTED_LOCATION_RELEASE ${QTXLSX_ROOT_DIR}/lib/Qt5Xlsx.dll)#此处QtXlsx库的的名字需要与上面的名字一致target_link_libraries(MyProject PRIVATE Qt${QT_VERSION_MAJOR}::Widgets QtXlsx)

3、使用
需要包含头文件#include <QtXlsx/xlsxdocument.h>
1)读取数据:

		QXlsx::Document xlsx(file_name);// 获取第一个工作表QString sheetName = xlsx.sheetNames().value(0, "");auto ret = xlsx.selectSheet(sheetName);qDebug()<<"ret:"<<ret;// 获取当前工作表的最大行数和列数int rowCount = xlsx.dimension().rowCount();int colCount = xlsx.dimension().columnCount();//注意:若统计出来的行数、列数与肉眼看到的有差异,请滑动表格查看是否有数据项在视野外!!!// 遍历每一行std::map<int, std::vector<double>> data_map;for (int row = 1; row <= rowCount; ++row){std::vector<double> data_row;for (int col = 1; col <= colCount; ++col){bool ok{false};double data = xlsx.read(row, col).toDouble(&ok);//根据实际数据类型转换if (!ok)break;data_row.push_back(data);}if (data_row.size() == DATA_SIZE)//DATA_SIZE 自定义列宽,可去掉此判断{data_map.emplace(row,data_row);}}
2)保存数据
void MyProject::SaveDataToXlsFile(QMap<int, QPair<QString, QString>> data, QString name)
{if (data.empty())return;QString text = QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss");text = name + "_" + text;QString file_name = "./Output/" + text + ".xlsx";QFile file(file_name);if (file.exists()) {file.remove();}QXlsx::Document xlsx;QXlsx::Format fmt_header;//设置表头格式fmt_header.setFontSize(15);fmt_header.setVerticalAlignment(QXlsx::Format::AlignVCenter);fmt_header.setHorizontalAlignment(QXlsx::Format::AlignHCenter);fmt_header.setPatternBackgroundColor(QColor(211, 211, 211));fmt_header.setFontBold(true);fmt_header.setTextWarp(true);QXlsx::Format fmt_body;//fmt_body.setFontSize(15);fmt_body.setVerticalAlignment(QXlsx::Format::AlignVCenter);fmt_body.setHorizontalAlignment(QXlsx::Format::AlignHCenter);fmt_body.setTextWarp(true);xlsx.write(1, 1, "Col1", fmt_header);xlsx.write(1, 2, "Col2", fmt_header);xlsx.write(1, 3, "Col3", fmt_header);auto rows = data.size();int row = 0;for (auto iter = data.begin(); iter != data.end(); ++iter){auto zone = iter.key();auto data_double = iter.value();xlsx.write(row + 2, 1, row + 1, fmt_body);//数据项行数xlsx.write(row + 2, 2, data_double.first, fmt_body);xlsx.write(row + 2, 3, data_double.second, fmt_body);++row;}if (xlsx.saveAs(file_name)) {QMessageBox::information(nullptr, "提示", "保存成功到" + file_name);// QDesktopServices::openUrl(QUrl::fromLocalFile(file_name));//可选择是否自动打开}else {QMessageBox::information(nullptr, "提示", "保存失败");}
}

4、其他
使用qt的文件功能弹出窗口,让用户选择文件:

#include <QFileDialog>QString filePath = QFileDialog::getOpenFileName(nullptr,                            // 父窗口"选择文件",                         // 标题"./",                   // 默认打开路径"Excel文件(*.xlsx)"  // 文件过滤器);if (!filePath.isEmpty()) {qDebug() << "已选择文件:" << filePath;// 在这里处理选中的文件} else {qDebug() << "用户取消选择";}
http://www.dtcms.com/a/272632.html

相关文章:

  • 达梦数据库不兼容 SQL_NO_CACHE 报错解决方案
  • C++交叉编译工具链制作以及QT交叉编译环境配置
  • 生产环境CI/CD流水线构建与优化实践指南
  • 医院多部门协同构建知识库-指南库-预测模型三维网络路径研究
  • 12大产品规划工具对比:功能、价格与适用场景
  • (LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
  • 2023 年 12 月青少年软编等考 C 语言七级真题解析
  • 2025年语言处理、大数据与人机交互国际会议(DHCI 2025)
  • QBoost 2025版:加速手机性能,提升使用体验
  • django中如何使用Django REST Framework
  • 基于SpringBoot旅游资源信息管理系统的设计与实现
  • 【Learning Notes】 Derak Callan‘s Business English P30~31
  • Redis数据库基础
  • 网安系列【15】之Docker未授权访问漏洞
  • Pytest 预期失败测试:如何标记“已知问题”用例
  • squash压缩合并
  • 【无标题】 RV1126平台(Buildroot Linux)+ SunplusIT SPCA2688 USB摄像头 RTSP推流全流程复盘与问题解决记录
  • 系统性部署系统母盘【rhel7和rhel9】
  • 7月10号总结 (1)
  • 大数据的安全挑战与应对
  • Linux:库的原理
  • swift开发,关于应用、页面、视图的生命周期
  • [C++ STL] list类的刨析及简易实现
  • 亚马逊首个“海折节”,缘何加码进口电商?
  • java多线程环境下资源隔离机制ThreadLocal详解
  • C#内插字符串:从语法糖到深度优化
  • 学习笔记(32):matplotlib绘制简单图表-数据分布图
  • 入门级别的Transformer模型介绍
  • Rust中Option和Result详解
  • 微调性能赶不上提示工程怎么办?Can Gradient Descent Simulate Prompting?——论文阅读笔记