使用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等,防止进程不会销毁。