QAxObject 读写 excel

版权声明:未经许可,请勿转载! https://blog.csdn.net/weixin_37204973/article/details/80059096

初学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

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

猜你喜欢

转载自blog.csdn.net/weixin_37204973/article/details/80059096