使用QAxObject操作Excl的时候,总是莫名的出现一些问题,今天把使用方法,和常使用的函数这里做些记录。

此类操作的属性和方法是我们Excel.Application提供的,可以在微软提供的VB说明查看:

https://docs.microsoft.com/en-us/office/vba/api/excel.application(object)

引入QAxObject模块

我们需要在.pro的工程文件中添加axcontainer这个模块

QT += widgets core axcontainer core5compat

我们会用到QAxWidget和QAxObject 这2个类。

如何打开Excl

如果我们电脑安装了Office,使用如下代码代开

QAxWidget *excl = new QAxWidget("Excel.Application");
    excl->dynamicCall("SetVisible (bool Visible)",  "false");
    excl->setProperty("DisplayAlerts","false");
    QAxObject *workBooks = excl->querySubObject("WorkBooks");

    QAxObject *workBook = workBooks->querySubObject("Open (const QString&)",fileName);

如何获取工作簿的Sheet

workSheets = workBook->querySubObject("Sheets");
    int sheet_count = workSheets->property("Count").toInt();
    for(int i = 1; i <= sheet_count; ++i)
    {
        QAxObject *work_sheet = workBook->querySubObject("Sheets(int)",i);
        QString sheetName = work_sheet->property("Name").toString();
        sheetNames.append(sheetName);
    }
    qDebug() << sheetNames;

如何创建一个Excl

方法跟打开Excl是类似的

excl = new QAxWidget("Excel.Application");
    excl->dynamicCall("SetVisible (bool Visible)",  "false");
    excl->setProperty("DisplayAlerts","false");
    workBooks = excl->querySubObject("WorkBooks");
    QFile file(fileName);
    if(file.exists())
    {
        workBook = workBooks->querySubObject("Open (const QString&)",fileName);
        if(!workBook)
        {
            return false;
        }
    }else{
        workBooks->dynamicCall("Add");
        workBook = excl->querySubObject("ActiveWorkBook");
        if(!workBook)
        {
            return false;
        }
    }

上面Add我们直接添加一个工作簿,然后通过SaveAs的方法存储为对应的文件

if(workBook)
    {
        workBook->dynamicCall("SaveAs(const QString &)",QDir::toNativeSeparators(fileName));
    }

如何获取一个Sheet的全部数据

首先获取到此Sheet的对象,获取Sheet只能根据Sheet的顺序查询的

QAxObject * sheet = workBook->querySubObject("Sheets(int)",i);

然后使用范围属性获取使用范围内的全部数据

QList<QVariant> datas;
QAxObject * usedRange = sheet->querySubObject("UsedRange");
QVariant t = usedRange->dynamicCall("Value");
QList<QVariant> rows = t.toList();
datas.append(rows);

如何获取设置一个Cell的值

QAxObject * sheet = workBook->querySubObject("Sheets(int)",i);
QAxObject *cell = sheet->querySubObject("Cells(int, int)", row,  col);
return cell->property("Value");

QAxObject *cell = sheet ->querySubObject("Cells(int, int)", row,  col);
cell->setProperty("Value",value);

如何插入删除行和列

QAxObject *cell = curSheet->querySubObject("Rows(int)", row);
cell->dynamicCall("Insert");

QAxObject *cell = curSheet->querySubObject("Rows(int)", row);
cell->dynamicCall("Delete");

QAxObject *cell = curSheet->querySubObject("Columns(int)", col);
cell->dynamicCall("Insert");

QAxObject *cell = curSheet->querySubObject("Columns(int)", col);
cell->dynamicCall("Delete");

如何追加一个Sheet

QAxObject * last = workBook->querySubObject("Sheets(int)",sheetNames.size());
workSheets->dynamicCall("Add(QVariant)",last->asVariant());
int cnt = sheetNames.size();
QAxObject * pNewSheet = workBook->querySubObject("Sheets(int)", cnt);
last->dynamicCall("Move(QVariant)", pNewSheet->asVariant());
pNewSheet->setProperty("Name", name);

如何删除一个Sheet

QVariant t = curSheet->dynamicCall("Delete");

如何范围写入数据

QVariantList list;
//设置list的值,开始使用append添加不成功,使用<<操作符添加
QVariantList row1;
row1 << "id" << "one" << "two";
list << QVariant(row1);
QAxObject *range = curSheet->querySubObject("Range(const QString&)","A1");
//重新设置range范围,否则就是A1这一个
 range = range->querySubObject("Resize(int,int)",1,3);
 range->setProperty("Value",list);

工作簿保存

workBook->dynamicCall("Save()");

关闭Excl

workBook->dynamicCall("Close(Boolean)",false); //参数表示是否自动弹出保存提示

退出Excl

excl->dynamicCall("Quit(void)");

全部关闭,退出之后,记得delete我们创建的对象,入workBook,excl等,防止进程不会销毁。