当前位置: 首页 > 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.lryc.cn/news/584237.html

相关文章:

  • 公网 IP 不稳定?用多点 Ping 策略监控真实可达率
  • MyBatis集成Logback日志全攻略
  • Java---IDEA
  • 开源 Canvas 和 WebGL 图形库推荐与对比
  • Yolov模型参数对比
  • 基于大模型的膀胱癌全周期精准诊疗方案研究
  • python自动化面试问题——关于python
  • Using Spring for Apache Pulsar:Transactions
  • Alibaba Druid主要配置
  • WiFi技术深度研究报告:从基础原理到组网应用与未来演进
  • 快速上手MongoDB与.NET/C#整合
  • 跨网文件交换?内外网文件交换十大方法构建安全合规的数据传输通道
  • XSS(跨站脚本攻击)
  • 3.9 spring的mybatis数据库数据回弹以及下划线,驼峰转换
  • 【音视频】TS协议解析
  • 在vscode中和obsidian中使用Mermaid
  • SSRF(ctfshow)
  • 生成式人工智能实战 | 自注意力生成对抗网络(Self-Attention Generative Adversarial Network, SAGAN)
  • Java并发编程中的StampedLock详解:原理、实践与性能优化
  • UI前端大数据可视化实战策略:如何设计交互式数据探索界面?
  • Spring AI Alibaba(2)——通过Graph实现工作流
  • 异步I/O库:libuv、libev、libevent与libeio
  • Ubuntu基础(Python虚拟环境和Vue)
  • 输入框过滤选项列表,el-checkbox-group单选
  • 案例分享--福建洋柄水库大桥智慧桥梁安全监测(二)之数字孪生和系统平台
  • Qt开发:QtConcurrent介绍和使用
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_max_orphans
  • 如何发现Redis中的bigkey?
  • 数据库复合索引设计:为什么等值查询列应该放在范围查询列前面?
  • ip地址可以精确到什么级别?如何获取/更改ip地址