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;
}
相关推荐
fengfuyao9851 小时前
基于MATLAB的HHT变换完整实现(含EMD分解与三维时频谱生成)
开发语言·算法·matlab
luj_17681 小时前
马克思的跨学科学术体系
c语言·开发语言·c++·经验分享·算法
码不停蹄的玄黓1 小时前
Java 实现阻塞队列
java·开发语言
SunnyDays10111 小时前
Java 实现 PDF 转 PDF/A 和 PDF/A 转 PDF(超详细教程)
java·开发语言·pdf
meilindehuzi_a1 小时前
打破0基础:通过 5 个核心案例深度拆解 JavaScript 正则表达式与运行时类型系统
开发语言·javascript·正则表达式
Deep-w1 小时前
【MATLAB】基于 MATLAB 的直流电动机双闭环调速系统建模与仿真
开发语言·算法·matlab
未若君雅裁2 小时前
线程池核心参数与执行流程
java·开发语言
lbb 小魔仙2 小时前
稳定比技巧更重要:海外多地区数据采集的经验教训
开发语言·javascript·ecmascript
pursue.dreams2 小时前
Windows系统Golang超详细安装配置教程(2026最新、零基础)
开发语言·windows·golang