Qt excel 操作使用说明

转载来自:https://www.cnblogs.com/ybqjymy/p/13864716.html

学习背景:

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

一.简单介绍

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

QT  +=  axcontainer

二.与excel com连接的方法

#include <ActiveQt/QAxObject>
QAxObject *excel = new QAxObject("Excel.Application"); //!建立excel操作对象,并连接Excel控件
excel->dynamicCall("SetVisible (bool Visible)", "false"); //! 设置为不显示窗体
excel->setProperty("DisplayAlerts", false); //! 不显示任何警告信息, 如关闭时的是否保存提示
excel->dynamicCall("Quit(void)"); //! 关闭excel程序,操作完后记着关闭,由于是隐藏在后台进程中,不关闭进程会有很多excel.exe。
workbook->dynamicCall("Close(Boolean)", false); //! 关闭exce程序先关闭.xls文件

三.Excel基本操作

  只介绍简单的读写操作,需要修改单元格格式等操作,请"Excel VBA参考手册.chm"

  3.1  excel文件操作

   获取当前工作簿的集合

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

  新建一个工作簿

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

  打开一个已有的工作簿

QString filename = "e:/123.xlsx";
QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filename);

  保存工作簿

workbook->dynamicCall("Save()");   //!保存文件
workbook->dynamicCall("Close(Boolean)", false);  //! 关闭文件 
excel->dynamicCall("Quit()"); //! 关闭excel

  另存为工作簿

QDir::toNativeSeparators,将路径中的"/"转换为"\",否则无法保存,"/"只是qt中可以识别
workbook->dynamiCall("SaveAs(const QString&)",  QDit::toNativeSeparators(filename));
workbook->synamicCall("Close(Boolean)", false); //! 关闭文件
excel->dynamicCall("Quit()"); //! 关闭excel

  3.2 Sheet工作表操作

  获取所有工作表

QAxObject *worksheets = workbook->querySubObject("Sheets"):

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

QAxObject *worksheet = worksheets->querySubObejct("Item(int)", 1);

  获取表中的行数列数 

QAxObject* usedrange = worksheet->querySubObject("UsedRange"); //! sheet 范围
int intRowStart = usedrange->property("Row").toInt(); //! 起始行数
int intColStart = usedrange->property("Column").toInt(); //! 起始列数
QAxObject *rows, *columns;
rows = usedrange->querySubObject("Rows"): //! 行
columns = usedrange->querySubObject("Columns"); //! 列
int intRow = rows->property("Count").toInt(); //! 行数
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操作

QVariant var;
QAxObject * usedRange = sheet->querySubObject("UseRange"); //! 获取用户区域范围
if(NULL == usedRange || usedRange->isNull())
{
    return var;
}
var = usedRange->dynamicCall("Value"); // 读取区域内所有值
delete usedRange;

 

  此时结果以QVariant保存,需要自行转化为QList<QList<QVariant>>

QList<QList<QVariant>> excel_list;
auto rows = var.toList();

for(auto row:rows)
{
  excel_list.append(row.toList());
}

 

  4.2 大数据写入

  以QList<QList<QVariant>>存储,需要限定范围

QAxObject *user_rang = this->sheet->querySubObject("Rang(const QString&)", "A1:D100");

   写入数据

rang->setProperty("Value", var); 

  4.3 简单的范例

//  HRESULT r = OleInitialize(0);
   // if(r != S_OK && r != S_FALSE)
   // {
        //qWaring("Qt:初始化Ole 失败(error %x)", (unsigned int)r);
    //}
    QString filename = "e:/123.xlsx"; //具体路径
    QFile  file(filename);
    bool isExit = file.exists();
    if(!isExit)
        return false;
    qDebug()<<"isExit"<<isExit;
    qDebug()<<filename;
    QAxObject *excel = new QAxObject("Excel.Application");
    excel->dynamicCall("SetVisible(bool Visble)", "false");
    excel->setProperty("DisplayAlerts", false);
    QAxObject *workbooks = excel->querySubObject("WorkBooks");
    QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filename);
    QAxObject *worksheets = workbook->querySubObject("Sheets");
    QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);

    //写入到指定位置
    QAxObject *workrang = worksheet->querySubObject("Cells(int, int)", 5, 1);
    //不能这么存
    workrang->dynamicCall("SetValue(const QString&)", QString("1ssssssfffssssssssssssssssssssssssssssss10987654321"));


    //读取出来并打印
    QAxObject *workrang1 = worksheet->querySubObject("Cells(int,int)", 3, 5);

    QVariant var = workrang1->dynamicCall("Value");
    qDebug()<<var;
    qDebug()<<var.toDouble();

    //另存保存
    //workbook->dynamicCall("SaveAs(const QString&)",
             //             QDir::toNativeSeparators(filename));

    workbook->dynamicCall("Save()", true);
    //关闭文件
    workbook->dynamicCall("Close(Boolean)", true);
    excel->dynamicCall("Quit()");
    delete excel;
    excel = NULL;
   // OleUninitialize();

 

posted @ 2022-04-04 10:49  冰糖葫芦很乖  阅读(1363)  评论(0编辑  收藏  举报