QT(4)-EXCEL操作

1.QAxObject方式

测试

ExcelOperator.cpp

复制代码
#include "ExcelOperator.h"
#include <QAxObject>
#include <memory>
#include <QDebug>

ExcelOperator::ExcelOperator(QObject *parent)
    : QObject(parent)
{
}

ExcelOperator::~ExcelOperator()
{
}

void ExcelOperator::ReadExcel(const QString& filePath)
{
    // 写xlsx文件
    QAxObject* excel = std::make_unique<QAxObject>().release(); // 连接Excel控件    
    excel->setControl("ket.Application");       // wps程序(需要安装wps)
    //excel->setControl("Excel.Application");   // excel程序(需要激活)
    excel->setProperty("Visible", false);       // 不显示窗体
    excel->setProperty("DisplayAlerts", false); // 不显示任何警告信息。如果为true, 那么关闭时会出现类似"文件已修改,是否保存"的提示
    QAxObject* workbooks = excel->querySubObject("WorkBooks");  //获取工作簿集合
    workbooks->dynamicCall("Open(const QString&)", filePath); //打开打开已存在的工作簿
    QAxObject* workbook = excel->querySubObject("ActiveWorkBook"); //获取当前工作簿 
    QAxObject* sheet = workbook->querySubObject("WorkSheets(int)", 1);//获取工作表集合的工作表1,即sheet1
    QAxObject* range = sheet->querySubObject("UsedRange"); //获取该sheet的使用范围对象
    QVariant var = range->dynamicCall("Value");
    delete range;
    QVariantList dataList = var.toList();  //得到表格中的所有数据
    if (dataList.isEmpty()) {
        return;
    }
    // 所有数据用QVariantList存储,每行用QVariantList存储
    /***********************数据存储格式************************/
    // list1:data1,data2,data3,data4,data5
    // list2:data1,data2,data3,data4,data5
    // list3:data1,data2,data3,data4,data5
    // list4:data1,data2,data3,data4,data5
    // list5:data1,data2,data3,data4,data5
    for (int i = 1; i < dataList.size(); ++i) {
        QVariantList rowData = dataList[i].toList();
        qDebug() << rowData[0].toString();  // 第i行0列数据
        qDebug() << rowData[1].toString();  // 第i行1列数据
        qDebug() << rowData[2].toString();  // 第i行2列数据
    }
}

void ExcelOperator::WriteExcel(const QString& filePath)
{
    // 写xlsx文件
    QAxObject* excel = std::make_unique<QAxObject>().release(); // 连接Excel控件    
    excel->setControl("ket.Application");       // wps程序(需要安装wps)
    //excel->setControl("Excel.Application");   // excel文件(需要激活)
    excel->setProperty("Visible", false);       // 不显示窗体
    excel->setProperty("DisplayAlerts", false); // 不显示任何警告信息。如果为true, 那么关闭时会出现类似"文件已修改,是否保存"的提示
    QAxObject* workbooks = excel->querySubObject("WorkBooks");  // 获取工作簿(excel文件)集合
    workbooks->dynamicCall("Add");              // 新建一个工作簿
    QAxObject* workbook = excel->querySubObject("ActiveWorkBook");  //获取当前工作簿
    QAxObject* sheet = workbook->querySubObject("WorkSheets(int)", 1);//获取工作表集合的工作表1,即sheet1
    QAxObject* user_range = sheet->querySubObject("Range(const QString&)", "A1:D100");//写数据在表格的范围(A1:A列1行位置;D100:D列100行位置)
    if (NULL == user_range || user_range->isNull()) {
        return;
    }
    QList<QVariant> dataList;
    for (int i = 0; i < 100; i++) {
        dataList.push_back(QList<QVariant>() << "1" << "2" << "3" << "4");
    }
    user_range->dynamicCall("SetValue(const QVariant&)", QVariant(dataList));
    workbook->dynamicCall("SaveAs(const QString&)", filePath); // 保存到filepath,路径需要把"/"改为"\\"
    workbook->dynamicCall("Close (Boolean)", false);  // 关闭文件
    excel->dynamicCall("Quit(void)");   // 关闭excel
}

ExcelOperator.h

复制代码
#ifndef EXCELOPERATOR_H
#define EXCELOPERATOR_H

#include <QObject>

class ExcelOperator : public QObject {
    Q_OBJECT

public:
    explicit ExcelOperator(QObject* parent = nullptr);
    ~ExcelOperator();
    static void ReadExcel(const QString& filePath);
    static void WriteExcel(const QString& filePath);
};
#endif // !EXCELOPERATOR_H

在pro内加入

复制代码
QT       += axcontainer

2.QtXlsxWriter库

地址:GitHub - dbzhang800/QtXlsxWriter: .xlsx file reader and writer for Qt5 · GitHub

在pro内加入

复制代码
# 使用qtxlsx源代码,自己工程下的相对路径
include($$PWD/source/excel/QtXlsxWriter/src/xlsx/qtxlsx.pri)

库的源码会被加入到工程中

测试

复制代码
#include <QtCore>
#include "xlsxdocument.h"

int main()
{
    //![0]
    QXlsx::Document xlsx;
    //![0]

    //![1]
    xlsx.write("A1", "Hello Qt!");
    xlsx.write("A2", 12345);
    xlsx.write("A3", "=44+33");
    xlsx.write("A4", true);
    xlsx.write("A5", "http://qt-project.org");
    xlsx.write("A6", QDate(2013, 12, 27));
    xlsx.write("A7", QTime(6, 30));
    //![1]

    //![2]
    xlsx.save();
    //![2]

    return 0;
}
相关推荐
「QT(C++)开发工程师」4 小时前
C++ 11 常用for循环
开发语言·c++
我还记得那天5 小时前
0 初识C++
开发语言·c++
FfHUCisI5 小时前
Go 编译过程全景
开发语言·后端·golang
FfHUCisI5 小时前
Golang 语法分析与 AST:Parser 与 go/ast
开发语言·后端·golang
lemon_sjdk6 小时前
ObjectProperty
java·开发语言·算法
大模型码小白6 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
hh9506 小时前
Agent Plan x DeepSeek Harness:Agent 供应链安全与第三方插件审计
java·开发语言·安全·agent plan·adg成都社区·adg社区
AI英德西牛仔6 小时前
文心 Excel 与“AI 导出鸭”:PC 端批量导出方案的技术解构
人工智能·excel·deepseek·ai导出鸭
「QT(C++)开发工程师」7 小时前
C++ std::move 详解
开发语言·c++