“QT下Excel文件的读写” 实战1——简介及读取特定单元格

同栏目文章:QT下Excel文件的读写” 实战2——读取并显示表格全部内容

文章目录

    • 一、简介
    • 二、环境配置
      • 1、excel 相关(通常默认不用配置,可以跳过)
      • 2、QAxObject类相关 (必备!)
    • 三、读单元格实例
      • 1、运行结果
      • 2、源码
    • 资源自取

结尾工程文件自取

一、简介

使用 Qt 的 QAxObject 类可以方便地读取 Excel 文件。该类封装了 ActiveX 技术,可以用于与 COM组件进行交互。在读取 Excel 文件时, QAxObject 类会创建 Excel.Application 对象,打开 Excel 文件,然后通过该对象的方法和属性读取文件中的数据。

具体来说,我们需要使用 QAxObject 的querySubObject方法来获取 Excel 对象的各种属性和方法。例如,我们可以使用该方法获取 Workbooks 对象,然后使用 Workbooks 对象的 Open 方法打开指定的 Excel 文件。接下来,我们可以使用 Workbook 对象的 Worksheets 属性来获取所有工作表对象,然后使用 Worksheets 对象的 Cells 属性获取单元格数据。最后,我们可以使用 QAxObject 的dynamicCall方法来调用各种Excel对象的方法,例如获取单元格数据、保存文件等等。

需要注意的是,在使用 QAxObject 读取 Excel 文件时,我们需要确保 Excel 对象的生命周期正确管理。在读取完毕后,需要释放所有对象并关闭 Excel 文件。此外,如果在读取 Excel 文件时遇到任何错误,应该正确处理错误,避免出现意外情况。

二、环境配置

1、excel 相关(通常默认不用配置,可以跳过)

在使用 Qt 的 QAxObject 类读取 Excel 文件之前,需要确保已经安装了 Microsoft Office 软件,并且在系统环境变量中配置了 COM 组件的路径。如果没有安装 Microsoft Office 软件,也可以使用其他兼容 Excel 文件格式的软件,例如 LibreOffice 或 OpenOffice 。
在 Windows 系统中,需要在系统环境变量中添加以下两个路径:
Microsoft Office 安装路径下的 Office 文件夹路径,例如:C:\Program Files\Microsoft Office\Office16
Microsoft Office 安装路径下的 Office16 文件夹路径,例如:C:\Program Files\Microsoft Office\Office16

这两个路径可以通过以下步骤添加到系统环境变量中:

  • 右键单击“此电脑”,选择“属性”。
  • 点击“高级系统设置”。
  • 在“系统属性”对话框中,点击“环境变量”。
  • 在“环境变量”对话框中,找到“系统变量”区域,选择“Path”变量,然后点击“编辑”。
  • 在“编辑环境变量”对话框中,添加上述两个路径,用分号分隔即可。
  • 点击“确定”保存设置。

完成上述设置后,就可以在 Qt 中使用 QAxObject 类读取 Excel 文件了。在读取完毕后,需要正确释放 Excel 对象并关闭 Excel 文件,避免出现资源泄漏等问题。

2、QAxObject类相关 (必备!)

  • 右击Qtcreator,打开文件所在位置
  • 运行文件夹下的Qt Maintenance Tool
  • 添加组件 - 添加ActiveX

三、读单元格实例

1、运行结果

先上效果!

  • 示例表格文件:test.xlsx
“QT下Excel文件的读写” 实战1——简介及读取特定单元格_第1张图片
  • 运行程序,打开test.xlsx:

    “QT下Excel文件的读写” 实战1——简介及读取特定单元格_第2张图片

    显示结果为第6行第7列单元格的内容

2、源码

  • MainWindow函数(及其析构)
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)            //定义了MainWindow类的构造函数,它继承自QMainWindow类,并且接受一个QWidget类型的指针作为参数。
{
    setWindowTitle("Excel Reader");     //设置程序的窗口标题为“Excel Reader”。
    setGeometry(QRect(QPoint(300, 300), QSize(500, 400)));     //设置窗口的位置和大小。

    button = new QPushButton("Open Excel", this);               //创建一个QPushButton对象,文本标签为“Open Excel”,并将它添加到MainWindow类的窗口中。
    button->setGeometry(QRect(QPoint(10, 10), QSize(100, 40)));//设置按钮的位置和大小。

    table_view = new QTableView(this);                  //创建一个QTableView对象,并将它添加到MainWindow类的窗口中。
    table_view->setGeometry(QRect(QPoint(10, 80), QSize(400, 300)));  //设置表格视图的位置和大小。

    connect(button, SIGNAL(clicked()), this, SLOT(on_button_clicked()));    //将按钮的“clicked”信号连接到MainWindow类中的“on_button_clicked”槽函数。
}

MainWindow::~MainWindow()    //析构
{
    delete excel;      //在程序退出时释放之前打开的Excel对象。
}
  • 槽函数 on_button_clicked函数
    函数功能:按钮按下功能函数
/*定义按钮控件槽函数*/
void MainWindow::on_button_clicked()   //定义了MainWindow类中的一个槽函数,当按钮被点击时会执行这个函数。
{
    QString filename = QFileDialog::getOpenFileName(this, "Open Excel File", "../", "Excel Files (*.xls *.xlsx)");
            //打开一个文件对话框,让用户选择Excel文件,如果选择了文件,则返回文件的路径和名称。‘当前指针,按钮标题,文件选择窗口默认路径,筛选文件类型’

    if (!filename.isEmpty()) {       //如果用户选择了文件,执行下面的代码。
        loadExcelFile(filename);     //调用MainWindow类中的“loadExcelFile”函数,打开Excel文件并读取其中的数据。
    }
}
  • loadExcelFile函数
    函数功能:打开并读取excel文件
/*定义读取函数*/
void MainWindow::loadExcelFile(const QString &filename)
{
    excel = new QAxObject("Excel.Application", this);                       //创建了一个QAxObject对象,用于访问Excel应用程序的COM接口。
    excel->setProperty("Visible", false);                                   //设置Excel应用程序的可见性为false,即不显示Excel应用程序的窗口。

    QAxObject *workbooks = excel->querySubObject("Workbooks");              //创建了一个QAxObject对象,用于访问Excel应用程序的Workbooks对象。
    QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filename); //使用Workbooks对象的querySubObject函数打开指定的Excel文件,并返回一个QAxObject对象,用于访问打开的Excel文件。

    QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);   //使用打开的Excel文件的querySubObject函数访问其中的第一个工作表,并返回一个QAxObject对象,用于访问这个工作表。
    //这里以读第6行第7列的单元格为例
    QAxObject *cell = worksheet->querySubObject("Cells(int, int)", 6, 7);    //使用工作表的querySubObject函数访问其中的第6行第7列的单元格,并返回一个QAxObject对象,用于访问这个单元格。

    QString value = cell->dynamicCall("Value()").toString();                //使用单元格的dynamicCall函数获取单元格中的值,并将它转换为一个QString对象。

    QStandardItemModel *model = new QStandardItemModel();                   //创建了一个QStandardItemModel对象,用于在表格视图中显示数据。
    model->setItem(0, 0, new QStandardItem(value));                         //将单元格中的值作为一个QStandardItem对象添加到模型的第0行第0列。
    table_view->setModel(model);                                            //将模型对象设置为表格视图的数据模型,这样就可以在表格视图中显示数据了。

    workbook->dynamicCall("Close()");                                       //使用动态调用的方式关闭Excel文件。
    excel->dynamicCall("Quit()");                                           //使用动态调用的方式退出Excel应用程序。
}

在这里可以修改要读的单元格的行数和列数。

资源自取

工程源码链接-免费自取

你可能感兴趣的:(#,Qt,excel,qt,学习,开发语言,windows)