Qt-excel文件操做方法

版权声明:若无来源注明, Techie亮博客文章均为原创。 转载请以连接形式标明本文标题和地址:
本文标题:Qt-excel文件操做方法     本文地址: http://techieliang.com/2017/11/464/

1. Qt-QAxObject

QAxObject是Qt提供的包装COM组件的类,经过COM操做Excel须要使用QAxObject类,使用此类还须要在pro文件增长“QT += axcontainer”html

QAxObject的具体说明请见帮助文档app

2. 与excel com链接的方法

  1. #include <QAxObject> //注意包含此头文件,同时在pro增长QT+= axcontainer
  2. QAxObject *excel = new QAxObject(this);//创建excel操做对象
  3. excel->setControl("Excel.Application");//链接Excel控件
  4. excel->dynamicCall("SetVisible (bool Visible)","false");//设置为不显示窗体
  5. excel->setProperty("DisplayAlerts", false);//不显示任何警告信息,如关闭时的是否保存提示
  6. excel->dynamicCall(?"Quit(void)"?);//关闭excel程序,操做完成后记着关闭,因为是隐藏的看不到,不关闭进程会有不少excel.exe
  7. //关闭excel程序以前记着先关闭.xls文件,具体见后续内容:workbook->dynamicCall("Close(Boolean)", false); //关闭文件

3. Excel基本操做

下面只介绍主要读写操做的方法,若须要修改单元格格式等操做,请看“Excel VBA参考手册.chm”或者其余相似资料大数据

手册分享地址: 连接: https://pan.baidu.com/s/1pLvC5nl 密码: dnikui

3.1. excel文件操做

获取当前工做簿的集合this

  1. QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工做簿(excel文件)集合

新建一个工做簿spa

  1. workbooks->dynamicCall("Add");//新建一个工做簿
  2. QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工做簿

打开一个已有的工做簿excel

  1. QString excel_file_path = "XXXX.xlsx";
  2. QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", excel_file_path);

保存工做簿htm

  1. workbook->dynamicCall("Save()"); //保存文件
  2. workbook->dynamicCall("Close(Boolean)", false); //关闭文件
  3. excel->dynamicCall(?"Quit(void)"?);//关闭excel

另存为工做簿对象

  1. //用QDir::toNativeSeparators, 将路径中的"/"转换为"\",不然没法保存,/只是qt中能够识别
  2. workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(excel_file_path));
  3. workbook->dynamicCall("Close (Boolean)", false); //关闭文件
  4. excel->dynamicCall(?"Quit(void)"?);//关闭excel

3.2. sheet工做表操做

下面的代码用到的workbook都是上面工做簿操做后获得的,也就是对某一个工做簿(excel文件)进行操做排序

获取全部工做表

  1. QAxObject *worksheets = workbook->querySubObject("Sheets");

根据序号获取某个工做表,序号顺序就是excel打开后下方的排序

  1. QAxObject *worksheet = worksheets->querySubObject("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. 内容操做

数据内容操做-获取单元格-基于坐标

  1. QAxObject* cell = worksheet->querySubObject("Cells(int, int)", i, j);

数据内容操做-获取单元格-基于行列名称

  1. QAxObject* cell = worksheet->querySubObject("Range(QVariant, QVariant)", "A1");

数据内容操做-读单元格内容

  1. QVariant cell_value = cell->property("Value");

数据内容操做-写单元格内容

  1. cell->setProperty("Value", "内容");

4. 其余

4.1. 大数据量读取

读取全部单元格内容-数据量大请使用此方式,只须要进行一次操做便可读取全部内容到内容,避免重复每一个单元格进行QAxObject操做

  1. QVariant var;
  2. QAxObject *usedRange = sheet->querySubObject("UsedRange");//获取用户区域范围
  3. if(NULL == usedRange || usedRange->isNull()) {
  4. return var;
  5. }
  6. var = usedRange->dynamicCall("Value");//读取区域内全部值
  7. delete usedRange;

此时结果以QVariant保存,须要自行转换成QList<QList<QVariant>>

  1. QList<QList<QVariant>> excel_list;
  2. auto rows = var.toList();
  3. for(auto row:rows) {
  4. excel_list.append(row.toList());
  5. }

4.2. 大数据量写入

大数据以QList<QList<QVariant>>存储,与读取相似,此处须要先指定区域范围

  1. QAxObject *user_range = this->sheet->querySubObject("Range(const QString&)","A1:D100");//范围

而后写入数据

  1. range->setProperty("Value", var);//须要将QList<QList<QVarient>>转换为QVarient

4.3. 范例:一个完整的打开-读取-关闭的操做

  1. QString excel_file_path = QDir::currentPath()+"/a.xlsx";
  2. excel_file_path = QDir::toNativeSeparators(excel_file_path);
  3. QAxObject *excel = new QAxObject(this);//创建excel操做对象
  4. excel->setControl("Excel.Application");//链接Excel控件
  5. excel->setProperty("Visible", true);//显示窗体看效果
  6. excel->setProperty("DisplayAlerts", true);//显示警告看效果
  7. QAxObject *workbooks = excel->querySubObject
  8. ("WorkBooks");//获取工做簿(excel文件)集合
  9. workbooks->dynamicCall("Open(const QString&)", excel_file_path);
  10. QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
  11. QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);
  12. QAxObject *usedRange = worksheet->querySubObject("UsedRange");
  13. QVariant var = usedRange->dynamicCall("Value");//这里是全部的内容
  14. workbook->dynamicCall( "Close(Boolean)", false );
  15. excel->dynamicCall( "Quit(void)" );
  16. delete excel;

注意: 一、此范例为了看到效果吧窗口和警告设置为了显示,请自行改成false 二、excel全部操做均是经过QAxObject 进行COM组件的操做,包括打开文件也是,因此路径必须传递完整路径,不能传递相对路径 三、QAxObject自身会维护new出的空间,直接delete第一个QAxObject 便可 四、全部内容保存在var的变量中 五、上述操做均为判断返回值,若文件不存在后续内容会报错

相关文章
相关标签/搜索