zoukankan      html  css  js  c++  java
  • Qt excel 操作使用说明

    学习背景:

        适合熟悉些qt开发,但是不是深入了解的开发者学习。具体实现(qt 5.1版本),office2007 Excel做验证,Win 7(64位),如有讲解有误,欢迎斧正!

    一.简单介绍

        QAxObject是Qt提供的包装COM组件的类,通过COM通过COM操作使用QAxObject类,使用此类,需要在pro文件中添加

    QT  +=  axcontainer

    二.与excel com连接的方法

    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基本操作

      只介绍简单的读写操作,需要修改单元格格式等操作,请"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);

      保存工作簿

    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.其他(没有实践操作)

      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<QList<QVariant>>

    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<QList<QVariant>>存储,需要限定范围

    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();
  • 相关阅读:
    [PHP] PHP 7.4.4错误修复版本的更改日志
    [Linux] 协程是不是我想的这样
    [前端] 代码中执行绑定元素的指定事件trigger方法
    [PHP] 中英双语网站的设计思路
    [网络] 使用wireshark抓包数据
    [MySQL] 有没有解决幻读问题
    [PHP] PDO 提供了三种不同的错误处理模式
    [Linux] 使用vmstat查看系统的负载情况
    [MySQL] innoDB引擎的主键与聚簇索引
    [PHP] 检测文件是否有病毒的实现逻辑
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13864716.html
Copyright © 2011-2022 走看看