QAxObject是Qt提供的包装COM组件的类,通过COM通过COM操作使用QAxObject类,使用此类,需要在pro文件中添加
QT += axcontainer
- 1 #include <ActiveQt/QAxObject>
- 2 QAxObject *excel = new QAxObject("Excel.Application"); //!建立excel操作对象,并连接Excel控件
- 3 excel->dynamicCall("SetVisible (bool Visible)", "false"); //! 设置为不显示窗体
- 4 excel->setProperty("DisplayAlerts", false); //! 不显示任何警告信息, 如关闭时的是否保存提示
- 5 excel->dynamicCall("Quit(void)"); //! 关闭excel程序,操作完后记着关闭,由于是隐藏在后台进程中,不关闭进程会有很多excel.exe。
- 6 workbook->dynamicCall("Close(Boolean)", false); //! 关闭exce程序先关闭.xls文件
只介绍简单的读写操作,需要修改单元格格式等操作,请"Excel VBA参考手册.chm"
3.1 excel文件操作
获取当前工作簿的集合
QAxObject *workbooks = excel->querySubObject("Workbooks"); //! 获取工作簿(excel文件)集合
新建一个工作簿
- 1 workbooks->synamicCall("Add"); //新建一个工作簿
- 2 QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); //! 获取当前工作簿
打开一个已有的工作簿
- 1 QString filename = "e:/123.xlsx";
- 2 QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filename);
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
CSDN QT大纲:Qt开发必备技术栈学习路线和资料
保存工作簿
- 1 workbook->dynamicCall("Save()"); //!保存文件
- 2 workbook->dynamicCall("Close(Boolean)", false); //! 关闭文件
- 3 excel->dynamicCall("Quit()"); //! 关闭excel
另存为工作簿
- 1 QDir::toNativeSeparators,将路径中的"/"转换为"\",否则无法保存,"/"只是qt中可以识别
- 2 workbook->dynamiCall("SaveAs(const QString&)", QDit::toNativeSeparators(filename));
- 3 workbook->synamicCall("Close(Boolean)", false); //! 关闭文件
- 4 excel->dynamicCall("Quit()"); //! 关闭excel
3.2 Sheet工作表操作
获取所有工作表
QAxObject *worksheets = workbook->querySubObject("Sheets"):
根据序号获取某个工作表,序号顺序就是excel 打开后下方的排序
QAxObject *worksheet = worksheets->querySubObejct("Item(int)", 1);
获取表中的行数列数
- 1 QAxObject* usedrange = worksheet->querySubObject("UsedRange"); //! sheet 范围
- 2 int intRowStart = usedrange->property("Row").toInt(); //! 起始行数
- 3 int intColStart = usedrange->property("Column").toInt(); //! 起始列数
- 4 QAxObject *rows, *columns;
- 5 rows = usedrange->querySubObject("Rows"): //! 行
- 6 columns = usedrange->querySubObject("Columns"); //! 列
- 7 int intRow = rows->property("Count").toInt(); //! 行数
- 8 int intCol = columns->property("Count").toInt(); //! 列数
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.1 大数据量读取
读取所有单元格内容-数据量大,只需要进行一次操作即可读取所有内容,避免重复对每个单元格进行QAxObect操作
- 1 QVariant var;
- 2 QAxObject * usedRange = sheet->querySubObject("UseRange"); //! 获取用户区域范围
- 3 if(NULL == usedRange || usedRange->isNull())
- 4 {
- 5 return var;
- 6 }
- 7 var = usedRange->dynamicCall("Value"); // 读取区域内所有值
- 8 delete usedRange;
此时结果以QVariant保存,需要自行转化为QList
- 1 QList<QList<QVariant>> excel_list;
- 2 auto rows = var.toList();
- 3
- 4 for(auto row:rows)
- 5 {
- 6 excel_list.append(row.toList());
- 7 }
4.2 大数据写入
以QList
QAxObject *user_rang = this->sheet->querySubObject("Rang(const QString&)", "A1:D100");
写入数据
rang->setProperty("Value", var);
4.3 简单的范例
- 1 // HRESULT r = OleInitialize(0);
- 2 // if(r != S_OK && r != S_FALSE)
- 3 // {
- 4 //qWaring("Qt:初始化Ole 失败(error %x)", (unsigned int)r);
- 5 //}
- 6 QString filename = "e:/123.xlsx"; //具体路径
- 7 QFile file(filename);
- 8 bool isExit = file.exists();
- 9 if(!isExit)
- 10 return false;
- 11 qDebug()<<"isExit"<<isExit;
- 12 qDebug()<<filename;
- 13 QAxObject *excel = new QAxObject("Excel.Application");
- 14 excel->dynamicCall("SetVisible(bool Visble)", "false");
- 15 excel->setProperty("DisplayAlerts", false);
- 16 QAxObject *workbooks = excel->querySubObject("WorkBooks");
- 17 QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filename);
- 18 QAxObject *worksheets = workbook->querySubObject("Sheets");
- 19 QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);
- 20
- 21 //写入到指定位置
- 22 QAxObject *workrang = worksheet->querySubObject("Cells(int, int)", 5, 1);
- 23 //不能这么存
- 24 workrang->dynamicCall("SetValue(const QString&)", QString("1ssssssfffssssssssssssssssssssssssssssss10987654321"));
- 25
- 26
- 27 //读取出来并打印
- 28 QAxObject *workrang1 = worksheet->querySubObject("Cells(int,int)", 3, 5);
- 29
- 30 QVariant var = workrang1->dynamicCall("Value");
- 31 qDebug()<<var;
- 32 qDebug()<<var.toDouble();
- 33
- 34 //另存保存
- 35 //workbook->dynamicCall("SaveAs(const QString&)",
- 36 // QDir::toNativeSeparators(filename));
- 37
- 38 workbook->dynamicCall("Save()", true);
- 39 //关闭文件
- 40 workbook->dynamicCall("Close(Boolean)", true);
- 41 excel->dynamicCall("Quit()");
- 42 delete excel;
- 43 excel = NULL;
- 44 // OleUninitialize();
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓