• Qt Excel进行新增、删除、修改读取从入门到精通


    配置xxx.pro
    引入Active Qt库

    QT += axcontainer

    引入objbase.h,解决返回QAxObject为空的问题

    1 #include <objbase.h>
    2 
    3 //在需要创建QAxObject()上方调用如下代码
    4 CoInitializeEx(NULL, COINIT_MULTITHREADED);
    5 m_pExcel = new(std::nothrow) QAxObject();

    因为QAxObject默认是在单线程下使用的,因此如果不用上门代码申明多线程, 会导致获取的excel的QAxObject都是NULL

    保存或者打开excel的路径需要统一用""
    QDir::toNativeSeparators(m_strPath)进行转换
    m_pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_strPath));

    SaveAs必须在所有操作结束后调用,否则不会保存到excel中
    可以放到close前调用即可

    1 m_pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_strPath));
    2 m_pWorkbook->dynamicCall("Close()");
    3 m_pExcel->dynamicCall("Quit()");
    4 delete m_pExcel;
    5 m_pExcel = NULL;

    Demo

     1 #ifndef EXCELOPERATOR_H
     2 #define EXCELOPERATOR_H
     3 
     4 #include <QObject>
     5 #include <ActiveQt/QAxObject>
     6 #include <QDebug>
     7 #include <QDir>
     8 
     9 class ExcelOperator : public QObject
    10 {
    11     Q_OBJECT
    12 public:
    13     explicit ExcelOperator(QObject *parent = nullptr);
    14     ~ExcelOperator();
    15     //打开文件
    16     bool open(QString path);
    17     //关闭文件
    18     bool close();
    19     //获取工作表数量
    20     int getSheetsCount();
    21     //根据名称创建工作表
    22     QAxObject* addSheet(QString name);
    23     //根据名称删除工作表
    24     bool delSheet(QString name);
    25     //根据编号删除工作表
    26     bool delSheet(int index);
    27     //根据名称获取工作表
    28     QAxObject* getSheet(QString name);
    29     //根据编号获取工作表
    30     QAxObject* getSheet(int index);
    31     //获取行对象
    32     QAxObject* getRows(QAxObject* pSheet);
    33     //获取行数
    34     int getRowsCount(QAxObject* pSheet);
    35     //获取列对象
    36     QAxObject* getColumns(QAxObject* pSheet);
    37     //获取列数
    38     int getColumnsCount(QAxObject* pSheet);
    39     //根据行列值获取单元格值, 如: 3行,5列
    40     QString getCell(QAxObject* pSheet, int row, int column);
    41     //根据行列编号获取单元格值, 如: "F6"
    42     QString getCell(QAxObject* pSheet, QString number);
    43     //根据行列值设置单元格值
    44     bool setCell(QAxObject* pSheet, int row, int column, QString value);
    45     //根据行列编号设置单元格值
    46     bool setCell(QAxObject* pSheet, QString number, QString value);
    47 
    48 
    49 signals:
    50 
    51 public slots:
    52 private:
    53     QAxObject*      m_pExcel;
    54     QAxObject*      m_pWorksheets;
    55     QAxObject*      m_pWorkbook;
    56     QString         m_strPath;
    57 };
    58 
    59 #endif // EXCELOPERATOR_H
      1 #include "exceloperator.h"
      2 #include <objbase.h>
      3 
      4 ExcelOperator::ExcelOperator(QObject *parent) : QObject(parent)
      5   , m_pExcel(NULL)
      6   , m_pWorksheets(NULL)
      7   , m_pWorkbook(NULL)
      8 {
      9 
     10 }
     11 
     12 ExcelOperator::~ExcelOperator()
     13 {
     14     close();
     15 }
     16 
     17 bool ExcelOperator::open(QString path)
     18 {
     19     m_strPath = path;
     20     QAxObject *pWorkbooks = NULL;
     21     CoInitializeEx(NULL, COINIT_MULTITHREADED);
     22     m_pExcel = new(std::nothrow) QAxObject();
     23     if (NULL == m_pExcel) {
     24         qCritical()<<"创建Excel对象失败...";
     25         return false;
     26     }
     27     try {
     28         m_pExcel->setControl("Excel.Application");
     29         m_pExcel->dynamicCall("SetVisible(bool)", false); //true 表示操作文件时可见,false表示为不可见
     30         m_pExcel->setProperty("DisplayAlerts", false);
     31         pWorkbooks = m_pExcel->querySubObject("WorkBooks");
     32         pWorkbooks->dynamicCall("Add");
     33         m_pWorkbook = m_pExcel->querySubObject("ActiveWorkBook");
     34         qDebug()<<"excel path: "<<m_strPath;
     35 
     36         // 获取打开的excel文件中所有的工作sheet
     37         m_pWorksheets = m_pWorkbook->querySubObject("WorkSheets");
     38     } catch (...) {
     39         qCritical()<<"打开文件失败...";
     40         return false;
     41     }
     42 
     43     return true;
     44 }
     45 
     46 bool ExcelOperator::close()
     47 {
     48     qDebug()<<"excel close...";
     49     if (m_pExcel)
     50     {
     51         qDebug()<<"closing...";
     52         m_pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_strPath));
     53         m_pWorkbook->dynamicCall("Close()");
     54         m_pExcel->dynamicCall("Quit()");
     55         delete m_pExcel;
     56         m_pExcel = NULL;
     57     }
     58     return true;
     59 }
     60 
     61 int ExcelOperator::getSheetsCount()
     62 {
     63     int count =  0;
     64     count = m_pWorksheets->property("Count").toInt();
     65     return count;
     66 }
     67 
     68 
     69 QAxObject* ExcelOperator::addSheet(QString name)
     70 {
     71     QAxObject *pWorkSheet = NULL;
     72     try {
     73         int count = m_pWorksheets->property("Count").toInt();  //获取工作表数目
     74         QAxObject *pLastSheet = m_pWorksheets->querySubObject("Item(int)", count);
     75         pWorkSheet = m_pWorksheets->querySubObject("Add(QVariant)", pLastSheet->asVariant());
     76         pLastSheet->dynamicCall("Move(QVariant)", pWorkSheet->asVariant());
     77         pWorkSheet->setProperty("Name", name);  //设置工作表名称
     78     } catch (...) {
     79         qCritical()<<"创建sheet失败...";
     80     }
     81     return pWorkSheet;
     82 }
     83 
     84 bool ExcelOperator::delSheet(QString name)
     85 {
     86     try {
     87         QAxObject *pFirstSheet = m_pWorksheets->querySubObject("Item(QString)", name);
     88         pFirstSheet->dynamicCall("delete");
     89     } catch (...) {
     90         qCritical()<<"删除sheet失败...";
     91         return false;
     92     }
     93     return true;
     94 }
     95 
     96 bool ExcelOperator::delSheet(int index)
     97 {
     98     try {
     99         QAxObject *pFirstSheet = m_pWorksheets->querySubObject("Item(int)", index);
    100         pFirstSheet->dynamicCall("delete");
    101     } catch (...) {
    102         qCritical()<<"删除sheet失败...";
    103         return false;
    104     }
    105     return true;
    106 }
    107 
    108 QAxObject* ExcelOperator::getSheet(QString name)
    109 {
    110     QAxObject* pWorkSheet = NULL;
    111     try {
    112         pWorkSheet = m_pWorksheets->querySubObject("Item(QString)", name);
    113     } catch (...) {
    114         qCritical()<<"获取sheet失败...";
    115     }
    116     return pWorkSheet;
    117 }
    118 
    119 QAxObject* ExcelOperator::getSheet(int index)
    120 {
    121     QAxObject* pWorkSheet = NULL;
    122     try {
    123         pWorkSheet = m_pWorksheets->querySubObject("Item(int)", index);
    124     } catch (...) {
    125         qCritical()<<"获取sheet失败...";
    126     }
    127     return pWorkSheet;
    128 }
    129 
    130 QAxObject* ExcelOperator::getRows(QAxObject* pSheet)
    131 {
    132     QAxObject* pRows = NULL;
    133     try {
    134         pRows = pSheet->querySubObject("Rows");
    135     } catch (...) {
    136         qCritical()<<"获取行失败...";
    137     }
    138     return pRows;
    139 }
    140 
    141 int ExcelOperator::getRowsCount(QAxObject* pSheet)
    142 {
    143     int rows = 0;
    144     try {
    145         QAxObject* pRows = getRows(pSheet);
    146         rows = pRows->property("Count").toInt();
    147     } catch (...) {
    148         qCritical()<<"获取行数失败...";
    149     }
    150     return rows;
    151 }
    152 
    153 QAxObject* ExcelOperator::getColumns(QAxObject* pSheet)
    154 {
    155     QAxObject* pColumns = NULL;
    156     try {
    157         pColumns = pSheet->querySubObject("Columns");
    158     } catch (...) {
    159         qCritical()<<"获取列失败...";
    160     }
    161     return pColumns;
    162 }
    163 
    164 int ExcelOperator::getColumnsCount(QAxObject* pSheet)
    165 {
    166     int columns = 0;
    167     try {
    168         QAxObject* pColumns = getColumns(pSheet);
    169         columns = pColumns->property("Count").toInt();
    170     } catch (...) {
    171         qCritical()<<"获取列数失败...";
    172     }
    173     return columns;
    174 }
    175 
    176 QString ExcelOperator::getCell(QAxObject* pSheet, int row, int column)
    177 {
    178     QString strCell = "";
    179     try {
    180         QAxObject* pCell = pSheet->querySubObject("Cells(int, int)", row, column);
    181         strCell = pCell->property("Value").toString();
    182     } catch (...) {
    183         qCritical()<<"获取单元格信息失败...";
    184     }
    185 
    186     return strCell;
    187 }
    188 
    189 QString ExcelOperator::getCell(QAxObject* pSheet, QString number)
    190 {
    191     QString strCell = "";
    192     try {
    193         QAxObject* pCell = pSheet->querySubObject("Range(QString)", number);
    194         strCell = pCell->property("Value").toString();
    195     } catch (...) {
    196         qCritical()<<"获取单元格信息失败...";
    197     }
    198 
    199     return strCell;
    200 }
    201 
    202 bool ExcelOperator::setCell(QAxObject* pSheet, int row, int column, QString value)
    203 {
    204     try {
    205         QAxObject* pCell = pSheet->querySubObject("Cells(int, int)", row, column);
    206         pCell->setProperty("Value", value);
    207     } catch (...) {
    208         qCritical()<<"写入单元格信息失败...";
    209         return false;
    210     }
    211     return true;
    212 }
    213 
    214 bool ExcelOperator::setCell(QAxObject* pSheet, QString number, QString value)
    215 {
    216     try {
    217         QAxObject* pCell = pSheet->querySubObject("Range(QString)", number);
    218         pCell->setProperty("Value", value);
    219     } catch (...) {
    220         qCritical()<<"写入单元格信息失败...";
    221         return false;
    222     }
    223     return true;
    224 }
  • 相关阅读:
    数据结构13——博弈论SG函数
    数据结构12——最近公共祖先
    数据结构11——双联通
    mui
    rem
    关于apicloud图片缓存
    apicloud代码压缩和全局加密
    数据库设计
    common常用到的类
    RSA生成、加密、解密、签名。
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14681058.html
Copyright © 2020-2023  润新知