Qt excel 操作使用说明
转载来自:https://www.cnblogs.com/ybqjymy/p/13864716.html
学习背景:
适合熟悉些qt开发,但是不是深入了解的开发者学习。具体实现(qt 5.1版本),office2007 Excel做验证,Win 7(64位),如有讲解有误,欢迎斧正!
一.简单介绍
QAxObject是Qt提供的包装COM组件的类,通过COM通过COM操作使用QAxObject类,使用此类,需要在pro文件中添加
QT += axcontainer
二.与excel com连接的方法
三.Excel基本操作
只介绍简单的读写操作,需要修改单元格格式等操作,请"Excel VBA参考手册.chm"
3.1 excel文件操作
获取当前工作簿的集合
QAxObject *workbooks = excel->querySubObject("Workbooks"); //! 获取工作簿(excel文件)集合
新建一个工作簿
workbooks->synamicCall("Add"); //新建一个工作簿 QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); //! 获取当前工作簿
打开一个已有的工作簿
QString filename = "e:/123.xlsx"; QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filename);
保存工作簿
workbook->dynamicCall("Save()"); //!保存文件 workbook->dynamicCall("Close(Boolean)", false); //! 关闭文件 excel->dynamicCall("Quit()"); //! 关闭excel
另存为工作簿
QDir::toNativeSeparators,将路径中的"/"转换为"\",否则无法保存,"/"只是qt中可以识别 workbook->dynamiCall("SaveAs(const QString&)", QDit::toNativeSeparators(filename)); workbook->synamicCall("Close(Boolean)", false); //! 关闭文件 excel->dynamicCall("Quit()"); //! 关闭excel
3.2 Sheet工作表操作
获取所有工作表
QAxObject *worksheets = workbook->querySubObject("Sheets"):
根据序号获取某个工作表,序号顺序就是excel 打开后下方的排序
QAxObject *worksheet = worksheets->querySubObejct("Item(int)", 1);
获取表中的行数列数
3.3 内容操作
数据内容操作--获取单元格--基于坐标
QAxObject *cell = worksheet->querySubObject("Cells(int, int)", i, j);
数据内容操作--获取单元格--基于行列名称
QAxObject *cell = worksheet->querySubObject("Range(QVariant, QVariant)", "A1");
数据内容操作--读单元格内容
QVariant cell_value = cell->property("Value");
数据内容操作-- 写单元格内容
cell->setProperty("Value", "内容");
4.其他(没有实践操作)
4.1 大数据量读取
读取所有单元格内容-数据量大,只需要进行一次操作即可读取所有内容,避免重复对每个单元格进行QAxObect操作
QVariant var; QAxObject * usedRange = sheet->querySubObject("UseRange"); //! 获取用户区域范围 if(NULL == usedRange || usedRange->isNull()) { return var; } var = usedRange->dynamicCall("Value"); // 读取区域内所有值 delete usedRange;
此时结果以QVariant保存,需要自行转化为QList<QList<QVariant>>
QList<QList<QVariant>> excel_list; auto rows = var.toList(); for(auto row:rows) { excel_list.append(row.toList()); }
4.2 大数据写入
以QList<QList<QVariant>>存储,需要限定范围
QAxObject *user_rang = this->sheet->querySubObject("Rang(const QString&)", "A1:D100");
写入数据
rang->setProperty("Value", var);
4.3 简单的范例
// HRESULT r = OleInitialize(0); // if(r != S_OK && r != S_FALSE) // { //qWaring("Qt:初始化Ole 失败(error %x)", (unsigned int)r); //} QString filename = "e:/123.xlsx"; //具体路径 QFile file(filename); bool isExit = file.exists(); if(!isExit) return false; qDebug()<<"isExit"<<isExit; qDebug()<<filename; QAxObject *excel = new QAxObject("Excel.Application"); excel->dynamicCall("SetVisible(bool Visble)", "false"); excel->setProperty("DisplayAlerts", false); QAxObject *workbooks = excel->querySubObject("WorkBooks"); QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filename); QAxObject *worksheets = workbook->querySubObject("Sheets"); QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1); //写入到指定位置 QAxObject *workrang = worksheet->querySubObject("Cells(int, int)", 5, 1); //不能这么存 workrang->dynamicCall("SetValue(const QString&)", QString("1ssssssfffssssssssssssssssssssssssssssss10987654321")); //读取出来并打印 QAxObject *workrang1 = worksheet->querySubObject("Cells(int,int)", 3, 5); QVariant var = workrang1->dynamicCall("Value"); qDebug()<<var; qDebug()<<var.toDouble(); //另存保存 //workbook->dynamicCall("SaveAs(const QString&)", // QDir::toNativeSeparators(filename)); workbook->dynamicCall("Save()", true); //关闭文件 workbook->dynamicCall("Close(Boolean)", true); excel->dynamicCall("Quit()"); delete excel; excel = NULL; // OleUninitialize();