“QT下Excel文件的读写” 实战2——读取并显示表格全部内容

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

四、读表格全部内容

1、运行结果

  • 点击“打开文件”按钮,在文件选择窗口选择并打开excel文件(test.xlsx),所有内容显示在第一个tableview。
  • 输入目标单元格的行号和列号,点击“获取单元格”按钮,该单元格内容显示在第二个tableview。

2、源码

  • MainWindow函数 (及其析构)
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle("Excel Reader");     //设置程序的窗口标题为“Excel Reader”。
    setGeometry(QRect(QPoint(300, 300), QSize(1000, 600)));     //设置窗口的位置和大小。

    button1 = new QPushButton("打开文件", this);               //创建一个QPushButton对象,文本标签为“ ”,并将它添加到MainWindow类的窗口中。
    button1->setGeometry(QRect(QPoint(550, 20), QSize(100, 30)));//设置按钮的位置和大小。
    button2 = new QPushButton("读取单元格", this);               //创建一个QPushButton对象,文本标签为“ ”,并将它添加到MainWindow类的窗口中。
    button2->setGeometry(QRect(QPoint(440, 140), QSize(100, 30)));//设置按钮的位置和大小。

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

    lineText = new QLineEdit(this);
    lineText->setGeometry(QRect(QPoint(10, 20), QSize(500, 30)));  //设置表格视图的位置和大小。

    spinBox1 = new QSpinBox(this);
    spinBox1->setMaximum(999);
    spinBox1->setMinimum(1);
    spinBox1->setGeometry(QRect(QPoint(440, 100), QSize(50, 30)));  //设置表格视图的位置和大小。

    spinBox2 = new QSpinBox(this);
    spinBox2->setMaximum(999);
    spinBox2->setMinimum(1);
    spinBox2->setGeometry(QRect(QPoint(500, 100), QSize(50, 30)));  //设置表格视图的位置和大小。


    connect(button1, SIGNAL(clicked()), this, SLOT( loadExcelData() ) );
    connect(button2, SIGNAL(clicked()), this, SLOT( showCellData() ) );
}

MainWindow::~MainWindow()
{
   delete excel;      //在程序退出时释放之前打开的Excel对象。
}
  • 槽函数 loadExcelData
    函数功能:“打开文件”按钮按下功能函数,打开并呈现表格文件。
void MainWindow::loadExcelData()
{
    QString filePath = QFileDialog::getOpenFileName(this, tr("Open Excel file"), "", tr("Excel Files (*.xlsx *.xls)"));
    if (!filePath.isEmpty())
    {
        lineText->setText(filePath);
        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&)", filePath); //使用Workbooks对象的querySubObject函数打开指定的Excel文件,并返回一个QAxObject对象,用于访问打开的Excel文件。
        QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);   //使用打开的Excel文件的querySubObject函数访问其中的第一个工作表,并返回一个QAxObject对象,用于访问这个工作表。

        QAxObject *usedRange = worksheet->querySubObject("UsedRange");
        QAxObject *rows = usedRange->querySubObject("Rows");
        QAxObject *columns = usedRange->querySubObject("Columns");
        int row_count = rows->property("Count").toInt();       // 获取Excel文件中的行数
        int column_count = columns->property("Count").toInt(); // 获取Excel文件中的列数

        QStringList data_list;
        for (int i = 1; i <= row_count; i++) {
            QString row_data;
            for (int j = 1; j <= column_count; j++) {
                QAxObject *cell = worksheet->querySubObject("Cells(int, int)", i, j);
                QString cell_value = cell->dynamicCall("Value()").toString();
                row_data += cell_value + "\t";
                cell->clear();
                delete cell;
            }
            data_list << row_data;
        }

        QStandardItemModel *model = new QStandardItemModel();
        for (int i = 0; i < data_list.count(); i++) {
            QStringList row_data = data_list.at(i).split("\t", Qt::SkipEmptyParts);
            for (int j = 0; j < row_data.count(); j++) {
                QStandardItem *item = new QStandardItem(row_data.at(j));
                model->setItem(i, j, item);
            }
        }

        tableView1->setModel(model);

        workbook->dynamicCall("Close()");
        excel->dynamicCall("Quit()");
    }
}
  • 槽函数 showCellData
    函数功能:“获取单元格”按钮按下功能函数,呈现指定单元格的内容。
void MainWindow::showCellData()
{
    int rowIndex = spinBox1->value();
    int columnIndex = spinBox2->value();

    QString filePath = lineText->text();
    if (!filePath.isEmpty()) {
        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&)", filePath); //使用Workbooks对象的querySubObject函数打开指定的Excel文件,并返回一个QAxObject对象,用于访问打开的Excel文件。
        QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);   //使用打开的Excel文件的querySubObject函数访问其中的第一个工作表,并返回一个QAxObject对象,用于访问这个工作表。

        QAxObject *cell = worksheet->querySubObject("Cells(int, int)", rowIndex, columnIndex);    //使用工作表的querySubObject函数访问其中的第x行第y列的单元格,并返回一个QAxObject对象,用于访问这个单元格。

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

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

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

五、读表格全部内容(UI版)

功能与上面一样,界面由QtUI设计。

1、运行结果

2、源码

  • UI
  • MainWindow函数 (及其析构)
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)                   // 调用基类QMainWindow的构造函数
    , ui(new Ui::MainWindow)                // 创建一个新的MainWindow界面
{    
    ui->setupUi(this);                      // 使用ui文件中的定义来设置MainWindow的UI,即窗口上的各种控件
    // 初始化各种控件
     // 初始化 pushButton_1 和 pushButton_2
    pushButton_1 = ui->pushButton_1;
    pushButton_2 = ui->pushButton_2;
     // 初始化 lineEdit
    lineEdit = ui->lineEdit;
     // 初始化 tableView_1 和 tableView_2
    tableView_1 = ui->tableView_1;
    tableView_2 = ui->tableView_2;
     // 初始化 spinBox_1 和 spinBox_2
    spinBox_1 = ui->spinBox_1;
    spinBox_2 = ui->spinBox_2;
     // 初始化 label_1 和 label_2
    label_1 = ui->label_1;
    label_2 = ui->label_2;

    // 将按钮与槽函数关联
    connect(pushButton_1, SIGNAL(clicked()), this, SLOT( loadExcelData() ) );
    connect(pushButton_2, SIGNAL(clicked()), this, SLOT( showCellData() ) );
}

MainWindow::~MainWindow() // MainWindow析构函数
{
    delete excel;       //在程序退出时释放之前打开的Excel对象。
    delete ui;          // 释放MainWindow对象的内存
}
  • 槽函数 loadExcelData
    函数功能:“打开文件”按钮按下功能函数,打开并呈现表格文件。
/*加载Excel数据的函数*/
void MainWindow::loadExcelData()
{
    QString filePath = QFileDialog::getOpenFileName(this, tr("Open Excel file"), "", tr("Excel Files (*.xlsx *.xls)"));  // 获取 Excel 文件路径
    if (!filePath.isEmpty())
    {
        //打开excel,选定工作表
        lineEdit->setText(filePath);                                            //将文件路径设置到lineEdit控件中
        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&)", filePath); //使用Workbooks对象的querySubObject函数打开指定的Excel文件,并返回一个QAxObject对象,用于访问打开的Excel文件。
        QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);   //使用打开的Excel文件的querySubObject函数访问其中的第一个工作表,并返回一个QAxObject对象,用于访问这个工作表。

        //获得excel的行列数
        QAxObject *usedRange = worksheet->querySubObject("UsedRange");           //创建了一个QAxObject类型的指针变量usedRange,它调用了worksheet对象的querySubObject()方法,该方法返回代表Excel中正在使用的区域(即非空单元格所在的区域)的QAxObject对象。
        QAxObject *rows = usedRange->querySubObject("Rows");                     //创建了一个QAxObject类型的指针变量rows,它调用了usedRange对象的querySubObject()方法,该方法返回代表Excel中正在使用的区域的行的QAxObject对象。
        QAxObject *columns = usedRange->querySubObject("Columns");               //创建了一个QAxObject类型的指针变量columns,它调用了usedRange对象的querySubObject()方法,该方法返回代表Excel中正在使用的区域的列的QAxObject对象。
        int row_count = rows->property("Count").toInt();                        // 获取Excel文件中的行数
        int column_count = columns->property("Count").toInt();                  // 获取Excel文件中的列数

        //将 Excel 中的数据存入一个 QStringList 对象中
        QStringList data_list;
        for (int i = 1; i <= row_count; i++) {
            QString row_data;
            for (int j = 1; j <= column_count; j++) {
                QAxObject *cell = worksheet->querySubObject("Cells(int, int)", i, j);
                QString cell_value = cell->dynamicCall("Value()").toString();
                row_data += cell_value + "\t";
                cell->clear();
                delete cell;
            }
            data_list << row_data;
        }

        // 将 QStringList 对象中的数据存入一个 QStandardItemModel 对象中,用于在表格视图中显示数据。
        QStandardItemModel *model = new QStandardItemModel();
        for (int i = 0; i < data_list.count(); i++) {
            QStringList row_data = data_list.at(i).split("\t", Qt::SkipEmptyParts);
            for (int j = 0; j < row_data.count(); j++) {
                QStandardItem *item = new QStandardItem(row_data.at(j));
                model->setItem(i, j, item);
            }
        }
        tableView_1->setModel(model);// 将 QStandardItemModel 对象设置为表格视图的数据模型,这样就可以在表格视图中显示数据了。

        workbook->dynamicCall("Close()");
        excel->dynamicCall("Quit()");
    }
}
  • 槽函数 showCellData
    函数功能:“获取单元格”按钮按下功能函数,呈现指定单元格的内容。
void MainWindow::showCellData()
{
    int rowIndex = spinBox_1->value();                  //获取spinBox_1中的值作为行号
    int columnIndex = spinBox_2->value();               //获取spinBox_2中的值作为列号

    QString filePath = lineEdit->text();                                         //获取lineEdit中的文本作为Excel文件路径
    if (!filePath.isEmpty()) {
        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&)", filePath); //使用Workbooks对象的querySubObject函数打开指定的Excel文件,并返回一个QAxObject对象,用于访问打开的Excel文件。
        QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);   //使用打开的Excel文件的querySubObject函数访问其中的第一个工作表,并返回一个QAxObject对象,用于访问这个工作表。

        //读第rowIndex行第columnIndex列的单元格
        QAxObject *cell = worksheet->querySubObject("Cells(int, int)", rowIndex, columnIndex);    //使用工作表的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列。
        tableView_2->setModel(model);                                            //将模型对象设置为表格视图的数据模型,这样就可以在表格视图中显示数据了。

        workbook->dynamicCall("Close()");                                       //使用动态调用的方式关闭Excel文件。
        excel->dynamicCall("Quit()");
    }
}
  • 6
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

frozendure

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值