QAxObject实现读写excel

源代码如下:

#include "widget.h"

#include "ui_widget.h"

#include "QToolBox"

#include "QTabWidget"

#include "QPushButton"

#include "QDebug"

#include "QDir"

#include

#include

#include

#include

#include

Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget)

{

ui->setupUi(this);

this->resize(800,500);

}

Widget::~Widget()

{

delete ui;

}

void Widget::on_openFile_clicked()

{

QAxObject *excel = nullptr;

QAxObject *workbooks = nullptr;

QAxObject *workbook = nullptr;

QAxObject *worksheet = nullptr;

QAxObject *usedRange = nullptr;

复制代码
try {
    // 1. 启动Excel COM对象
    excel = new QAxObject("Excel.Application", this);
    if (excel->isNull()) {
        qDebug() << "启动失败:请确认电脑已安装 Office 或 WPS";
        return;
    }
    excel->setProperty("Visible", false);       // 后台运行,不弹窗口
    excel->setProperty("DisplayAlerts", false); // 关闭所有提示弹窗

    // 2. 打开指定的Excel文件(注意转Windows原生路径格式)
    workbooks = excel->querySubObject("Workbooks");
    // 在构造函数或按钮槽函数里调用,传入你的Excel文件绝对路径
    QString dir = QDir::currentPath();
    QString filter = "*.xlsx";
    QString filePath = QFileDialog::getOpenFileName(this,"file",dir,filter);
    workbook  = workbooks->querySubObject("Open(const QString&)",
                                         QDir::toNativeSeparators(filePath));
    if (!workbook || workbook->isNull()) {
        qDebug() << "文件打开失败,请检查路径:" << filePath;
        return;
    }

    // 3. 获取第1个工作表
    worksheet = workbook->querySubObject("Worksheets(int)", 1);

    // 4. 获取表格已使用的区域,得到总行数、总列数
    usedRange = worksheet->querySubObject("UsedRange");
    if (!usedRange || usedRange->isNull()) {
        qDebug() << "表格为空,无内容可读取";
        return;
    }
    int rowCount = usedRange->querySubObject("Rows")->property("Count").toInt();
    int colCount = usedRange->querySubObject("Columns")->property("Count").toInt();
    qDebug() << QString("=== 表格共 %1 行,%2 列 ===").arg(rowCount).arg(colCount);

    // 先清空表格原有内容
    ui->tableWidget->clearContents();
    ui->tableWidget->setRowCount(0);
    ui->tableWidget->setColumnCount(3); // 设置总列数

    for (int rowExcel = 1; rowExcel <= rowCount; rowExcel++)
    {
        // QTableWidget 行下标 = Excel行 - 1
        int tableRow = rowExcel - 1;
        // 给表格新增一行
        ui->tableWidget->insertRow(tableRow);

        QString line;
        for (int colExcel = 1; colExcel <= colCount; colExcel++)
        {
            int tableCol = colExcel - 1;

            // 读取Excel单元格文本
            QAxObject *cell = worksheet->querySubObject("Cells(int,int)", rowExcel, colExcel);
            QString cellText = cell->property("Value").toString();
            delete cell;

            // 新建表格单元格条目,填入文本
            QTableWidgetItem *item = new QTableWidgetItem(cellText);
            ui->tableWidget->setItem(tableRow, tableCol, item);

            line += cellText + "\t";
        }
        qDebug() << QString("第%1行: ").arg(rowExcel) << line;
    }
}
catch (...) {
    qDebug() << "读取Excel发生异常";
}

// ========== 必须倒序释放所有COM对象,否则Excel进程会后台残留 ==========
if (usedRange) delete usedRange;
if (worksheet) delete worksheet;
if (workbook) {
    workbook->dynamicCall("Close()"); // 关闭文件,不保存修改
    delete workbook;
}
if (workbooks) delete workbooks;
if (excel) {
    excel->dynamicCall("Quit()");
    delete excel;
}

}

void Widget::on_saveFile_clicked()

{

}

2)创建两个按钮和一个tableWidget部件;

3)测试如下:

相关推荐
周洲083012 小时前
STM32 GPIO 外部中断深度解析:边沿触发 / 电平触发、NVIC 优先级配置、中断嵌套实战
stm32·单片机·嵌入式硬件
LCG元13 小时前
STM32F103 CAN 总线通信实战:标准库双机通信与过滤器配置精讲
stm32·单片机·嵌入式硬件
zlinear数据采集卡13 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
Kuakewei88814 小时前
平芯微42V热拔插OVP过压保护芯片:PW1600
嵌入式硬件
ACP广源盛1392462567315 小时前
WAIC2026 国产超节点算力浪潮下@ACP#IX9104 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
z203483152015 小时前
STM32单片机控制无源蜂鸣器播放《晴天》
stm32·单片机·嵌入式硬件
国科安芯16 小时前
详解ADC 规则组外部触发:CH2、CH3 与 TRGO2
运维·网络·单片机·嵌入式硬件·mcu·系统架构
ACP广源盛1392462567317 小时前
WAIC2026 国产算力浪潮@ACP#YLB3118 在算力矩阵中的存储定位与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
ACP广源盛1392462567317 小时前
WAIC2026 国产算力浪潮下@ACP#IX8024 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
振南的单片机世界17 小时前
硬核菊花链:3个GPIO+无限74HC595=端口扩展“无限套娃”
arm开发·stm32·单片机·嵌入式硬件