• 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、上述操作均为判断返回值,若文件不存在后续内容会报错

     
  • 相关阅读:
    Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享
    Shiro权限管理框架(一):Shiro的基本使用
    【自动化__持续集成】___java___finally
    【自动化__持续集成】___java___异常处理
    【自动化__持续集成】___java___static
    【自动化__持续集成】___java___对象
    【自动化__持续集成】___java___代码非空指针
    【自动化__持续集成】___java___代码空指针
    【自动化__持续集成】___java___失血模型
    【自动化__持续集成】___java___构造方法
  • 原文地址:https://www.cnblogs.com/techiel/p/7932329.html
Copyright © 2020-2023  润新知