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() << "用户取消选择";}