欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QAxObject 读写 excel

程序员文章站 2024-03-17 19:33:58
...

初学Qt 时,发现Qt 并没有自带操作excel 的API, 所以很长时间内都是用的CSV 文件来储存数据报表。这段时间,因为需要,所以参考了一下网上资料,捣鼓了一番,发现使用 QAxObject 操作excel 也不是特别费劲,现在分享给大家。

//mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAxObject>
#include <QAxWidget>
#include <QDebug>
#include <QList>
#include <QVariant>
#include <QDir>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_Write_clicked();

    void on_Quit_clicked();

    void on_read_clicked();

private:
    Ui::MainWindow *ui;

    QAxObject *excel;
    QAxObject *workbooks;
    QAxObject *workbook;
    QAxObject *worksheets;
    QAxObject *worksheet;
    QAxObject *range;
    QAxObject *cell;
    QList<QVariant> allRowData;
};

#endif // MAINWINDOW_H

 

//mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

QString path = "E:/test.xlsx";

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //连接excel
    excel = new QAxObject("Excel.Application");
    //是否可视化excel
    excel->dynamicCall("SetVisible(bool Visible)", true);
    //是否弹出警告窗口
    excel->setProperty("DisplayAlerts", false);

    //获取工作簿集合
    workbooks = excel->querySubObject("WorkBooks");
    //新建一个工作簿
    workbooks->dynamicCall("Add");
    //获取当前工作簿
    workbook = excel->querySubObject("ActiveWorkBook");
    //获取工作表格集合
    worksheets = workbook->querySubObject("Sheets");
    //获取当前工作表格1,即sheet1
    worksheet  = worksheets->querySubObject("Item(int)", 1);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_Write_clicked()
{
    //产生数据
    for(int row = 1; row <=1000; row++) {
        QList<QVariant> aRowData;
        for(int column = 1; column <= 2; column++) {
            aRowData.append(QVariant(row*column));
        }
        allRowData.append(QVariant(aRowData));
    }

    //选取范围
    range = worksheet->querySubObject("Range(const QString)", "A1:B1000");
    //批量写入
    range->dynamicCall("SetValue(const QVariant&", QVariant(allRowData));
    //设置字体大小
    range->querySubObject("Font")->setProperty("Size", 30);
    //获取单元格
    cell = worksheet->querySubObject("Cells(int, int", 1, 1);
    //储存一个字符串数据至表格
    cell->dynamicCall("setValue(const QVariant&", QVariant("abc"));
    //读取单元格数据
    QString str = cell->dynamicCall("Value2()").toString();
    qDebug()<<"The value of cell is "<< str <<endl;
    //调整行高
    worksheet->querySubObject("Range(const QString&", "1:1")->setProperty("RowHeight", 60);
    //保存至文件注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"\",不然一定保存不了。
    workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(path));
    workbook->dynamicCall("Close()");
}

void MainWindow::on_Quit_clicked()
{

    excel->dynamicCall("Quit()");
}

void MainWindow::on_read_clicked()
{
    //获取工作簿集合
    workbooks = excel->querySubObject("WorkBooks");
    //打开一个工作簿
    workbooks->dynamicCall("Open(const QString&)", QDir::toNativeSeparators(path));
    //获取当前工作簿
    workbook = excel->querySubObject("ActiveWorkBook");
    //获取工作表格集合
    worksheets = workbook->querySubObject("Sheets");
    //获取当前工作表格1,即sheet1
    worksheet  = worksheets->querySubObject("Item(int)", 1);

    QVariant var;
    //读取当前工作表所有数据
    QAxObject *usedRange = worksheet->querySubObject("UsedRange");
    var = usedRange->dynamicCall("Value");

    QVariantList varRows = var.toList();
    const int rowCount = varRows.size();
    QVariantList rowData;
    for(int i = 0; i<rowCount; ++i) {
        rowData = varRows[i].toList();
        qDebug()<< rowData.at(1);
    }
    workbook->dynamicCall("Close()");
}

使用函数

QAxObject* querySubObject(const char *name, QList<QVariant> &vars);

的童鞋请注意,虽然获取的子对象是由父对象统一管理,但他们是在父对象被析构时进行销毁的,所以如果操作单元格时,频繁获取单元格对象,需要手动del 一下,上面的代码是一个简单的demo,写法并不严谨,所以仅供参考。

原本是想将此封装成一个类,再分享给大家,不过此方法是需要安装 office 或者 WPS 之类的办公软件才能使用,对于用户来说,甚是麻烦,所以现在被弃用了。网上有第三方库 QtXlsx,不用安装office, 也比较好用,大家可以试一下,下面是链接。

QtXlsx 的配置

QtXlsx 使用例程

本工程源码

 

参考资料:

  1. https://blog.csdn.net/czyt1988/article/details/52121360
  2. https://blog.csdn.net/qq_35057840/article/details/54318443
  3. https://www.cnblogs.com/woxinfeixiang2015/p/7677295.html

感谢网上提供参考资料的大神们!

 

 

 

相关标签: Qt Excel