zoukankan      html  css  js  c++  java
  • QT界面开发-QAxObject 读写excel(COM组件)-常用功能封装代码

    我的测试版本Qt 5.6.2    QtCreator4.0.3    VS2013

    qtExcelApi.h

      1 #pragma once
      2 
      3 #include <ActiveQt/QAxObject>
      4 #include <QDir>
      5 
      6 using namespace std;
      7 
      8 class qtExcelApi
      9 {
     10 public:
     11     qtExcelApi(void);
     12     ~qtExcelApi(void);
     13 
     14 
     15     /**
     16     * @brief 新建Excel
     17     */
     18     void CreateExcel();
     19 
     20 
     21     /**
     22     * @brief 打开Excel
     23     * @param[in] filePath  路径
     24     * @param[in] type  打开时是否显示EXCEL
     25     * @return BOOL 打开成功&失败
     26     */
     27     bool OpenFile(const char* filePath, bool type);
     28 
     29 
     30     /**
     31     * @brief 关闭Excel
     32     */
     33     void CloseExcel();
     34 
     35 
     36     /**
     37     * @brief 保存Excel
     38     */
     39     void Save(const char* savePath);
     40 
     41 
     42     /**
     43     * @brief 获取所有的工作表数量
     44     * @return int 数量
     45     */
     46     int GetSheetCount();
     47 
     48 
     49     /**
     50     * @brief 获取单元格数据
     51     * @param[in] row  行
     52     * @param[in] column  列
     53     * @return string 内容
     54     */
     55     string GetRangeData(const int row, const int column);
     56 
     57 
     58     /**
     59     * @brief 读取整个sheet
     60     * @return string 内容
     61     */
     62     vector<string> GetUsedRange();
     63 
     64 
     65     /**
     66     * @brief 读取sheet中的一个范围
     67     * @return string 内容
     68     */
     69     vector<string> GetScopeRange(const char* A1, const char* A5);
     70     
     71 
     72     /**
     73     * @brief 当前sheet单元格写入内容
     74     * @param[in] row  行
     75     * @param[in] column  列
     76     * @param[in] Data  内容
     77     */
     78     void SetRangeData(const int row, const int column, const char* Data);
     79 
     80 
     81     /**
     82     * @brief 获得当前sheet使用的行数
     83     * @return int 数量
     84     */
     85     int GetRowNum();
     86 
     87 
     88     /**
     89     * @brief 获得当前sheet使用的列数
     90     * @return int 数量
     91     */
     92     int GetColumnNum();
     93 
     94 
     95     /**
     96     * @brief 设置当前工作表
     97     * @param[in] id  第几个sheet,从1开始
     98     * @return BOOL 设置成功&失败
     99     */
    100     bool SetCurrentSheetByNum(const int& id);
    101 
    102 
    103 
    104 private:
    105 
    106     //Excel应用程序
    107     QAxObject *ExcelApp;
    108     //Excel工作簿
    109     QAxObject *ExcelBooks;
    110     QAxObject *ExcelBook;
    111     //Excel工作表
    112     QAxObject *ExcelSheets;
    113     QAxObject *ExcelSheet;
    114     //Excel单元格
    115     QAxObject *ExcelRange;
    116 
    117 };
    View Code

    qtExcelApi.cpp

      1 #include "qtExcelApi.h"
      2 
      3 
      4 qtExcelApi::qtExcelApi(void)
      5 {
      6 
      7 }
      8 
      9 qtExcelApi::~qtExcelApi()
     10 {
     11 }
     12 
     13 
     14 //打开Excel
     15 void qtExcelApi::CreateExcel()
     16 {
     17     //连接excel
     18     ExcelApp = new QAxObject("Excel.Application");
     19     //是否可视化excel
     20     ExcelApp->dynamicCall("SetVisible(bool Visible)", true);
     21     //是否弹出警告窗口
     22     ExcelApp->setProperty("DisplayAlerts", false);
     23     //获取工作簿集合
     24     ExcelBooks = ExcelApp->querySubObject("WorkBooks");
     25     //新建一个工作簿
     26     ExcelBooks->dynamicCall("Add");
     27     //获取当前工作簿
     28     ExcelBook = ExcelApp->querySubObject("ActiveWorkBook");
     29     //获取工作表格集合
     30     ExcelSheets = ExcelBook->querySubObject("Sheets");
     31     //获取当前工作表格1,即sheet1
     32     ExcelSheet = ExcelSheets->querySubObject("Item(int)", 1);
     33 }
     34 
     35 
     36 //打开Excel
     37 bool qtExcelApi::OpenFile(const char* filePath, bool type)
     38 {
     39     //连接excel
     40     ExcelApp = new QAxObject("Excel.Application");
     41     //是否可视化excel
     42     ExcelApp->dynamicCall("SetVisible(bool Visible)", type);
     43     //是否弹出警告窗口
     44     ExcelApp->setProperty("DisplayAlerts", false);
     45     //获取工作簿集合
     46     ExcelBooks = ExcelApp->querySubObject("WorkBooks");
     47     //打开一个工作簿
     48     ExcelBooks->dynamicCall("Open(const QString&)", QDir::toNativeSeparators(filePath));
     49     //获取当前工作簿
     50     ExcelBook = ExcelApp->querySubObject("ActiveWorkBook");
     51     //获取工作表格集合
     52     ExcelSheets = ExcelBook->querySubObject("Sheets");
     53     //获取当前工作表格1,即sheet1
     54     ExcelSheet = ExcelSheets->querySubObject("Item(int)", 1);
     55     return true;
     56 }
     57 
     58 
     59 //关闭Excel
     60 void qtExcelApi::CloseExcel()
     61 {
     62     if (ExcelApp != NULL)
     63     {
     64         ExcelApp->dynamicCall("Quit()");
     65         delete ExcelApp;
     66         ExcelApp = NULL;
     67     }
     68 }
     69 
     70 
     71 //保存Excel
     72 void qtExcelApi::Save(const char* savePath)
     73 {
     74     ExcelBook->dynamicCall("SaveAs(const QString &)", QDir::toNativeSeparators(savePath));
     75 }
     76 
     77 
     78 //获取单元格数据
     79 string qtExcelApi::GetRangeData(const int row, const int column)
     80 {
     81     QVariant ret;
     82     QByteArray cdata;
     83     if (this->ExcelSheet != NULL && !this->ExcelSheet->isNull())
     84     {
     85         QAxObject* range = this->ExcelSheet->querySubObject("Cells(int, int)", row, column);
     86         ret = range->dynamicCall("Value()");
     87         QString qs = ret.toString();
     88         cdata = qs.toLocal8Bit();
     89         delete range;
     90     }    
     91     return string(cdata);;
     92 }
     93 
     94 
     95 //读取整个sheet
     96 vector<string> qtExcelApi::GetUsedRange()
     97 {    
     98     //读取当前工作表所有数据
     99     QAxObject *usedRange = ExcelSheet->querySubObject("UsedRange");
    100     QVariant var = usedRange->dynamicCall("Value()");
    101     QVariantList varRows = var.toList();
    102     const int rowCount = varRows.size();
    103     QVariantList rowData;
    104     QByteArray cdata;
    105     vector<string> vecUsedRange;
    106     for (int i = 0; i < rowCount; ++i)
    107     {
    108         rowData = varRows[i].toList();
    109         QString qs = rowData[0].toString();
    110         cdata = qs.toLocal8Bit();
    111         vecUsedRange.push_back(string(cdata));
    112     }
    113     delete usedRange;
    114     return vecUsedRange;
    115 }
    116 
    117 
    118 //读取sheet中的一个范围
    119 vector<string> qtExcelApi::GetScopeRange(const char* A1, const char* A5)
    120 {
    121     QVariantList params;
    122     params << A1 << A5;  //A1至A5的数据    
    123     //读取当前工作表所有数据
    124     QAxObject *cell = ExcelSheet->querySubObject("Range(QVariant,QVariant)", params);
    125     QVariant var = cell->dynamicCall("Value2()");
    126     QVariantList varRows = var.toList();
    127     const int rowCount = varRows.size();
    128     QVariantList rowData;
    129     QByteArray cdata;
    130     vector<string> vecUsedRange;
    131     for (int i = 0; i < rowCount; ++i)
    132     {
    133         rowData = varRows[i].toList();
    134         QString qs = rowData[0].toString();
    135         cdata = qs.toLocal8Bit();
    136         vecUsedRange.push_back(string(cdata));
    137     }
    138     delete cell;
    139     return vecUsedRange;
    140 }
    141 
    142 
    143 //当前sheet单元格写入内容
    144 void qtExcelApi::SetRangeData(const int row, const int column, const char* Data)
    145 {
    146     QAxObject *cell = ExcelSheet->querySubObject("Cells(int,int)", row, column);
    147     cell->setProperty("Value", Data);
    148 }
    149 
    150 
    151 //获取所有的工作表数量
    152 int qtExcelApi::GetSheetCount()
    153 {
    154     int intCount = ExcelSheets->property("Count").toInt();
    155     return intCount;
    156 }
    157 
    158 
    159 //获得当前sheet使用的行数
    160 int qtExcelApi::GetRowNum()
    161 {
    162     QAxObject *usedRange = ExcelSheet->querySubObject("UsedRange");
    163     QAxObject *rows = usedRange->querySubObject("Rows");
    164     int nRows = rows->property("Count").toInt();
    165     return nRows;
    166 }
    167 
    168 
    169 //获得当前sheet使用的列数
    170 int qtExcelApi::GetColumnNum()
    171 {
    172     QAxObject *usedRange = ExcelSheet->querySubObject("UsedRange");
    173     QAxObject *columns = usedRange->querySubObject("Columns");
    174     int nCols = columns->property("Count").toInt();
    175     return nCols;
    176 }
    177 
    178 
    179 //设置当前工作表
    180 bool qtExcelApi::SetCurrentSheetByNum(const int& id)
    181 {
    182     ExcelSheet = ExcelBook->querySubObject("Worksheets(int)", 2);
    183     return true;
    184 }
    View Code
  • 相关阅读:
    MotionEvent的getX(),getY()与getRawX(),getRawY()区别
    ProgressBar
    Android UI-SlidingMenu侧滑菜单效果
    CentOS采用grub进 single状态
    C++外观设计模式模式(三)
    01背包和背包完全
    Android开展Exception:ActivityNotFoundException: Unable to find explicit activity class
    圆通数据库泄露
    学生有自己的, 其他生活
    串行卧重建14:我们是等自己测试的主动性
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/12197604.html
Copyright © 2011-2022 走看看