zoukankan      html  css  js  c++  java
  • Qt+excel

    前言:

    对于excel来说,每个区域都是QAxObject 对象,包括单元格、边框、字体、颜色等等

    1、初始化插件

    CoInitialize(NULL);//#include <windows.h>

    //注意:如果是在线程里操作excel,需要在对应的线程里加这句话初始化

    2、初始化对象,记住在后面按从小到大delete

    QAxObject * excel = new QAxObject("Excel.Application");//选择excel软件

    excel->dynamicCall("Setvisible (bool Visible)","false");//不显示主窗体,后面打开excel的时候不显示

    excel->setProperty("DisplayAlerts",false);//不显示excel的警告信息,如果打开失败,不弹出框

    QAxObject *work_books = excel->querySubObject("WorkBooks");//选择work_books

    work_books->dynamicCall("Open(const QString&)", fileNameStr);//设置excel存在路径

    QAxObject *work_book = excel->querySubObject("ActiveWorkBook");//选择work_book

    QAxObject *work_sheet = work_book->querySubObject("Sheets(int)",1); //Sheets也可换用WorkSheets,打开第一个sheet

    3、选择某个区域对象

    QAxObject *range_title = work_sheet->querySubObject("Range(const QString&)","A1:L1");//返回A1到L1的区域对象

    QAxObject *range_data = work_sheet->querySubObject("UsedRange");//返回用户使用了的区域对象

    QAxObject *cell_title = work_sheet->querySubObject("Cells(int,int)",1,1);//返回1行1列的单元格对象

    QAxObject *range_font = range_title->querySubObject("Font");//获取内容格式对象,用于设置颜色、字号、粗体等等

    QAxObject *range_A2L2Border = range_A2L2->querySubObject("Borders");//获取边框对象

    4、细节操作

    4.1、获取单元格内容

    cell_title->property("Value")).toString();//property是返回QVariant结构体

    4.2、合并单元格

    range_title->setProperty("MergeCells",true);//合并单元格

    4.3、设置字符

    range_title->dynamicCall("SetValue(const QString&)","测试部财产统计表");

    4.4、设置字号、加粗

    range_font ->setProperty("Size",20);//字号

    range_font ->setProperty("Bold",true);//加粗

    4.5、添加下拉筛选

    range_A2L2->dynamicCall("AutoFilter");//下拉筛选

    4.6、边框加粗

    range_A2L2Border->setProperty("Weight",-4138);//边框加粗,不加粗填2

    4.7、文字水平居中

    range_data->setProperty("HorizontalAlignment",-4108);//文字水平居中
    4.8、文字垂直居中

    range_data->setProperty("VerticallAlignment",-4108);//垂直居中
    4.9、自动换行

    range_data->setProperty("WrapText", true);//自动换行

    4.10、获取sheet数

    QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可换用WorkSheets 
    int sheet_count = work_sheets->property("Count").toInt();  //获取工作表数目
    4.11、获取sheet名字
    QString work_sheet_name = work_sheet->property("Name").toString();

    5、大数据操作

    5.1、读取整个表

      QVariant var;

      QAxObject *range_data = work_sheet->querySubObject("UsedRange");

      var = range_data->dynamicCall("Value");//将所有数据存在QVariant结构体里面

      QList<QList <QVariant>> list;//结果

      castVariant2ListListVariant(var,list);//自定义函数

      for(int i=2;i<list.size();i++)

      {

        QList<QVariant> tempRow;

        tempRow = list.at(i);

        QStringList tempStrList;

        for(int j=1;j<12;j++)//12是excel列数

        {

          tempStrList.append(tempRow.at(j).toString());

        }

        //tempStrList是一行数据,在这里取出,tempStrList.at(n)...

      }

    ps:使用Excel录制宏来获取指令

    1、打开excel,选择文件-》选项-》自定义功能区-》把开发工具勾选上

    2、点击功能区开发工具,点击录制宏

    3、操作Excel,如合并单元格

    4、停止录制

    5、打开vb代码,获取合并单元格的公式,把公式使用QAxObject 来调用

    void castVariant2ListListVariant(const QVariant &var, QList<QList<QVariant> > &res)//上面的自定义函数

    {

      QVariantList varRows = var.toList();

      if(varRows.isEmpty())

      {

        qDebug()<<"varRows isEmpty";

        return;

      }

      const int rowCount = varRows.size();

      QVariantList rowData;

      for(int i=0;i<rowCount;++i)

      {

        rowData = varRows[i].toList();

        res.push_back(rowData);

      }

    }

    5.2、写入整个表

    QList< QList<QVariant> > m_datas;

    while(n--)//声明定义一个双重QList变量

    {

    QList<QVariant> rows;

    for(int i=0;i<column+1;i++)

      rows.append(query.value(i).toString());

    m_datas.append(rows);

    }

    QVariant var;

    castListListVariant2Variant(var,m_datas);//自定义函数,双重QList转QVariant

    range_data->dynamicCall("SetValue(const QVariant&)",var);//写入数据

    void castListListVariant2Variant(QVariant &var, const QList<QList<QVariant> > &res)

    {

    QVariant temp = QVariant(QVariantList());

    QVariantList record;

    int listSize = res.size();

    for (int i = 0; i < listSize;++i)

    {

      temp = res.at(i);

      record << temp;

    }

    temp = record;

    var = temp;

    }

    PS:保存及内存回收

    work_book->dynamicCall("Save()");

    work_book->dynamicCall("Close(Boolean)",false);

    excel->dynamicCall("Quit(void)");

    delete range_data;

    delete work_sheet;

    delete work_book;

    delete work_books;

    delete excel;

  • 相关阅读:
    开启MySQL远程访问权限 允许远程连接
    [SCOI2005]互不侵犯
    树的数据生成器
    博客园优化
    图的随机数据生成器
    CF 983B 序列函数
    [HNOI2010]弹飞绵羊
    luogu P3393 逃离僵尸岛
    LCT解读(1)
    [APIO2010]特别行动队
  • 原文地址:https://www.cnblogs.com/judes/p/7306331.html
Copyright © 2011-2022 走看看