zoukankan      html  css  js  c++  java
  • Qtexcel文件操作方法

    博客地址已更改,文章数量较多不便批量修改,若想访问源文请到 coologic博客 查阅,网址:www.coologic.cn

    如本文记录地址为 techieliang.com/A/B/C/ 请改为 www.coologic.cn/A/B/C/ 即可查阅

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

    1. Qt-QAxObject

    QAxObject是Qt提供的包装COM组件的类,通过COM操作Excel需要使用QAxObject类,使用此类还需要在pro文件增加“QT += axcontainer”

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

    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 密码: dnik

    3.1. excel文件操作

    获取当前工作簿的集合

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

    新建一个工作簿

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

    打开一个已有的工作簿

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

    保存工作簿

    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;

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

     
  • 相关阅读:
    475. Heaters
    69. Sqrt(x)
    83. Remove Duplicates from Sorted List Java solutions
    206. Reverse Linked List java solutions
    100. Same Tree Java Solutions
    1. Two Sum Java Solutions
    9. Palindrome Number Java Solutions
    112. Path Sum Java Solutin
    190. Reverse Bits Java Solutin
    202. Happy Number Java Solutin
  • 原文地址:https://www.cnblogs.com/techiel/p/7932329.html
Copyright © 2011-2022 走看看