1、首先需要已经有了Qt5Xlsx的头文件和库,并拷贝到程序exe路径下(以xxx.exe/3rdparty/qtxlsx路径为例,Qt5Xlsx版本为0.3.0);
2、cmakelist中:
cpp
# 设置 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 PROPERTIES
IMPORTED_IMPLIB_DEBUG ${QTXLSX_LIB_DEBUG}
IMPORTED_LOCATION_DEBUG ${QTXLSX_ROOT_DIR}/lib/Qt5Xlsxd.dll
MAP_IMPORTED_CONFIG_MINSIZEREL Release
MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release
)
# 设置发布版属性
set_target_properties(QtXlsx PROPERTIES
IMPORTED_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)读取数据:
cpp
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)保存数据
cpp
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的文件功能弹出窗口,让用户选择文件:
cpp
#include <QFileDialog>
QString filePath = QFileDialog::getOpenFileName(
nullptr, // 父窗口
"选择文件", // 标题
"./", // 默认打开路径
"Excel文件(*.xlsx)" // 文件过滤器
);
if (!filePath.isEmpty()) {
qDebug() << "已选择文件:" << filePath;
// 在这里处理选中的文件
} else {
qDebug() << "用户取消选择";
}