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;
}
相关推荐
nice_lcj52027 分钟前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
百事牛科技37 分钟前
Excel的三种密码:防看、防存、防乱改,各管各的
windows·excel
紧跟先前的步伐38 分钟前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
bksczm2 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库
春涧草茶2 小时前
慢就是快16-1协程
开发语言·前端·python
Dovis(誓平步青云)3 小时前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
做科研的周师兄3 小时前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
.痞老板.4 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee
奇树谦4 小时前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
青梅味猪大肠4 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统