QT5使用cmakelists引入Qt5Xlsx库并使用

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() << "用户取消选择";
    }
相关推荐
晓131314 分钟前
JavaScript加强篇——第八章 高效渲染与正则表达式
开发语言·前端·javascript
阳光开朗_大男孩儿31 分钟前
nfs 锁机制demo
开发语言·多线程·多进程·文件锁
Hello-Mr.Wang1 小时前
使用Spring Boot和PageHelper实现数据分页
java·开发语言·spring boot
追风赶月、1 小时前
【QT】使用QSS进行界面美化
开发语言·qt
佩奇大王1 小时前
java 接口
java·开发语言
CodeWithMe1 小时前
【读书笔记】《C++ Software Design》第十章与第十一章 The Singleton Pattern & The Last Guideline
开发语言·c++·设计模式
林深的林1 小时前
Java小白-设计模式
java·开发语言·设计模式
EmpressBoost2 小时前
解决‘vue‘ 不是内部或外部命令,也不是可运行的程序
开发语言·前端·javascript
姜太公钓鲸2332 小时前
java中的List 和 ArrayList
java·开发语言
UP_Continue2 小时前
C++--List的模拟实现
开发语言·c++