zoukankan      html  css  js  c++  java
  • QT 操作excel 类封装

     1 #    pro file
     2 [plain] view plaincopy
     3 CONFIG += qaxcontainer  
     4   
     5 QT       += core  
     6   
     7 QT       -= gui  
     8   
     9 TARGET = QExcel  
    10 CONFIG   += console  
    11 CONFIG   -= app_bundle  
    12   
    13 TEMPLATE = app  
    14   
    15   
    16 SOURCES += main.cpp   
    17     qexcel.cpp  
    18   
    19 HEADERS +=   
    20     qexcel.h  
     1 //     qexcel.h
     2 
     3 #ifndef QEXCEL_H  
     4 #define QEXCEL_H  
     5   
     6 #include <QString>  
     7 #include <QVariant>  
     8   
     9 class QAxObject;  
    10   
    11 class QExcel : public QObject  
    12 {  
    13 public:  
    14     QExcel(QString xlsFilePath, QObject *parent = 0);  
    15     ~QExcel();  
    16   
    17 public:  
    18     QAxObject * getWorkBooks();  
    19     QAxObject * getWorkBook();  
    20     QAxObject * getWorkSheets();  
    21     QAxObject * getWorkSheet();  
    22   
    23 public:  
    24     /**************************************************************************/  
    25     /* 工作表                                                                 */  
    26     /**************************************************************************/  
    27     void selectSheet(const QString& sheetName);  
    28     //sheetIndex 起始于 1  
    29     void selectSheet(int sheetIndex);  
    30     void deleteSheet(const QString& sheetName);  
    31     void deleteSheet(int sheetIndex);  
    32     void insertSheet(QString sheetName);  
    33     int getSheetsCount();  
    34     //在 selectSheet() 之后才可调用  
    35     QString getSheetName();  
    36     QString getSheetName(int sheetIndex);  
    37   
    38     /**************************************************************************/  
    39     /* 单元格                                                                 */  
    40     /**************************************************************************/  
    41     void setCellString(int row, int column, const QString& value);  
    42     //cell 例如 "A7"  
    43     void setCellString(const QString& cell, const QString& value);  
    44     //range 例如 "A5:C7"  
    45     void mergeCells(const QString& range);  
    46     void mergeCells(int topLeftRow, int topLeftColumn, int bottomRightRow, int bottomRightColumn);  
    47     QVariant getCellValue(int row, int column);  
    48     void clearCell(int row, int column);  
    49     void clearCell(const QString& cell);  
    50   
    51     /**************************************************************************/  
    52     /* 布局格式                                                               */  
    53     /**************************************************************************/  
    54     void getUsedRange(int *topLeftRow, int *topLeftColumn, int *bottomRightRow, int *bottomRightColumn);  
    55     void setColumnWidth(int column, int width);  
    56     void setRowHeight(int row, int height);  
    57     void setCellTextCenter(int row, int column);  
    58     void setCellTextCenter(const QString& cell);  
    59     void setCellTextWrap(int row, int column, bool isWrap);  
    60     void setCellTextWrap(const QString& cell, bool isWrap);  
    61     void setAutoFitRow(int row);  
    62     void mergeSerialSameCellsInAColumn(int column, int topRow);  
    63     int getUsedRowsCount();  
    64     void setCellFontBold(int row, int column, bool isBold);  
    65     void setCellFontBold(const QString& cell, bool isBold);  
    66     void setCellFontSize(int row, int column, int size);  
    67     void setCellFontSize(const QString& cell, int size);  
    68   
    69     /**************************************************************************/  
    70     /* 文件                                                                   */  
    71     /**************************************************************************/  
    72     void save();  
    73     void close();  
    74   
    75 private:  
    76     QAxObject * excel;  
    77     QAxObject * workBooks;  
    78     QAxObject * workBook;  
    79     QAxObject * sheets;  
    80     QAxObject * sheet;  
    81 };  
    82   
    83 #endif  
      1 //    qexcel.cpp
      2 
      3 #include <QAxObject>  
      4 #include <QFile>  
      5 #include <QStringList>  
      6 #include <QDebug>  
      7   
      8 #include "qexcel.h"  
      9   
     10 QExcel::QExcel(QString xlsFilePath, QObject *parent)  
     11 {  
     12     excel = 0;  
     13     workBooks = 0;  
     14     workBook = 0;  
     15     sheets = 0;  
     16     sheet = 0;  
     17   
     18     excel = new QAxObject("Excel.Application", parent);  
     19     workBooks = excel->querySubObject("Workbooks");  
     20     QFile file(xlsFilePath);  
     21     if (file.exists())  
     22     {  
     23         workBooks->dynamicCall("Open(const QString&)", xlsFilePath);  
     24         workBook = excel->querySubObject("ActiveWorkBook");  
     25         sheets = workBook->querySubObject("WorkSheets");  
     26     }  
     27 }  
     28   
     29 QExcel::~QExcel()  
     30 {  
     31     close();  
     32 }  
     33   
     34 void QExcel::close()  
     35 {  
     36     excel->dynamicCall("Quit()");  
     37   
     38     delete sheet;  
     39     delete sheets;  
     40     delete workBook;  
     41     delete workBooks;  
     42     delete excel;  
     43   
     44     excel = 0;  
     45     workBooks = 0;  
     46     workBook = 0;  
     47     sheets = 0;  
     48     sheet = 0;  
     49 }  
     50   
     51 QAxObject *QExcel::getWorkBooks()  
     52 {  
     53     return workBooks;  
     54 }  
     55   
     56 QAxObject *QExcel::getWorkBook()  
     57 {  
     58     return workBook;  
     59 }  
     60   
     61 QAxObject *QExcel::getWorkSheets()  
     62 {  
     63     return sheets;  
     64 }  
     65   
     66 QAxObject *QExcel::getWorkSheet()  
     67 {  
     68     return sheet;  
     69 }  
     70   
     71 void QExcel::selectSheet(const QString& sheetName)  
     72 {  
     73     sheet = sheets->querySubObject("Item(const QString&)", sheetName);  
     74 }  
     75   
     76 void QExcel::deleteSheet(const QString& sheetName)  
     77 {  
     78     QAxObject * a = sheets->querySubObject("Item(const QString&)", sheetName);  
     79     a->dynamicCall("delete");  
     80 }  
     81   
     82 void QExcel::deleteSheet(int sheetIndex)  
     83 {  
     84     QAxObject * a = sheets->querySubObject("Item(int)", sheetIndex);  
     85     a->dynamicCall("delete");  
     86 }  
     87   
     88 void QExcel::selectSheet(int sheetIndex)  
     89 {  
     90     sheet = sheets->querySubObject("Item(int)", sheetIndex);  
     91 }  
     92   
     93 void QExcel::setCellString(int row, int column, const QString& value)  
     94 {  
     95     QAxObject *range = sheet->querySubObject("Cells(int,int)", row, column);  
     96     range->dynamicCall("SetValue(const QString&)", value);  
     97 }  
     98   
     99 void QExcel::setCellFontBold(int row, int column, bool isBold)  
    100 {  
    101     QString cell;  
    102     cell.append(QChar(column - 1 + 'A'));  
    103     cell.append(QString::number(row));  
    104   
    105     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    106     range = range->querySubObject("Font");  
    107     range->setProperty("Bold", isBold);  
    108 }  
    109   
    110 void QExcel::setCellFontSize(int row, int column, int size)  
    111 {  
    112     QString cell;  
    113     cell.append(QChar(column - 1 + 'A'));  
    114     cell.append(QString::number(row));  
    115   
    116     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    117     range = range->querySubObject("Font");  
    118     range->setProperty("Size", size);  
    119 }  
    120   
    121 void QExcel::mergeCells(const QString& cell)  
    122 {  
    123     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    124     range->setProperty("VerticalAlignment", -4108);//xlCenter  
    125     range->setProperty("WrapText", true);  
    126     range->setProperty("MergeCells", true);  
    127 }  
    128   
    129 void QExcel::mergeCells(int topLeftRow, int topLeftColumn, int bottomRightRow, int bottomRightColumn)  
    130 {  
    131     QString cell;  
    132     cell.append(QChar(topLeftColumn - 1 + 'A'));  
    133     cell.append(QString::number(topLeftRow));  
    134     cell.append(":");  
    135     cell.append(QChar(bottomRightColumn - 1 + 'A'));  
    136     cell.append(QString::number(bottomRightRow));  
    137   
    138     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    139     range->setProperty("VerticalAlignment", -4108);//xlCenter  
    140     range->setProperty("WrapText", true);  
    141     range->setProperty("MergeCells", true);  
    142 }  
    143   
    144 QVariant QExcel::getCellValue(int row, int column)  
    145 {  
    146     QAxObject *range = sheet->querySubObject("Cells(int,int)", row, column);  
    147     return range->property("Value");  
    148 }  
    149   
    150 void QExcel::save()  
    151 {  
    152     workBook->dynamicCall("Save()");  
    153 }  
    154   
    155 int QExcel::getSheetsCount()  
    156 {  
    157     return sheets->property("Count").toInt();  
    158 }  
    159   
    160 QString QExcel::getSheetName()  
    161 {  
    162     return sheet->property("Name").toString();  
    163 }  
    164   
    165 QString QExcel::getSheetName(int sheetIndex)  
    166 {  
    167     QAxObject * a = sheets->querySubObject("Item(int)", sheetIndex);  
    168     return a->property("Name").toString();  
    169 }  
    170   
    171 void QExcel::getUsedRange(int *topLeftRow, int *topLeftColumn, int *bottomRightRow, int *bottomRightColumn)  
    172 {  
    173     QAxObject *usedRange = sheet->querySubObject("UsedRange");  
    174     *topLeftRow = usedRange->property("Row").toInt();  
    175     *topLeftColumn = usedRange->property("Column").toInt();  
    176   
    177     QAxObject *rows = usedRange->querySubObject("Rows");  
    178     *bottomRightRow = *topLeftRow + rows->property("Count").toInt() - 1;  
    179   
    180     QAxObject *columns = usedRange->querySubObject("Columns");  
    181     *bottomRightColumn = *topLeftColumn + columns->property("Count").toInt() - 1;  
    182 }  
    183   
    184 void QExcel::setColumnWidth(int column, int width)  
    185 {  
    186     QString columnName;  
    187     columnName.append(QChar(column - 1 + 'A'));  
    188     columnName.append(":");  
    189     columnName.append(QChar(column - 1 + 'A'));  
    190   
    191     QAxObject * col = sheet->querySubObject("Columns(const QString&)", columnName);  
    192     col->setProperty("ColumnWidth", width);  
    193 }  
    194   
    195 void QExcel::setCellTextCenter(int row, int column)  
    196 {  
    197     QString cell;  
    198     cell.append(QChar(column - 1 + 'A'));  
    199     cell.append(QString::number(row));  
    200   
    201     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    202     range->setProperty("HorizontalAlignment", -4108);//xlCenter  
    203 }  
    204   
    205 void QExcel::setCellTextWrap(int row, int column, bool isWrap)  
    206 {  
    207     QString cell;  
    208     cell.append(QChar(column - 1 + 'A'));  
    209     cell.append(QString::number(row));  
    210   
    211     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    212     range->setProperty("WrapText", isWrap);  
    213 }  
    214   
    215 void QExcel::setAutoFitRow(int row)  
    216 {  
    217     QString rowsName;  
    218     rowsName.append(QString::number(row));  
    219     rowsName.append(":");  
    220     rowsName.append(QString::number(row));  
    221   
    222     QAxObject * rows = sheet->querySubObject("Rows(const QString &)", rowsName);  
    223     rows->dynamicCall("AutoFit()");  
    224 }  
    225   
    226 void QExcel::insertSheet(QString sheetName)  
    227 {  
    228     sheets->querySubObject("Add()");  
    229     QAxObject * a = sheets->querySubObject("Item(int)", 1);  
    230     a->setProperty("Name", sheetName);  
    231 }  
    232   
    233 void QExcel::mergeSerialSameCellsInAColumn(int column, int topRow)  
    234 {  
    235     int a,b,c,rowsCount;  
    236     getUsedRange(&a, &b, &rowsCount, &c);  
    237   
    238     int aMergeStart = topRow, aMergeEnd = topRow + 1;  
    239   
    240     QString value;  
    241     while(aMergeEnd <= rowsCount)  
    242     {  
    243         value = getCellValue(aMergeStart, column).toString();  
    244         while(value == getCellValue(aMergeEnd, column).toString())  
    245         {  
    246             clearCell(aMergeEnd, column);  
    247             aMergeEnd++;  
    248         }  
    249         aMergeEnd--;  
    250         mergeCells(aMergeStart, column, aMergeEnd, column);  
    251   
    252         aMergeStart = aMergeEnd + 1;  
    253         aMergeEnd = aMergeStart + 1;  
    254     }  
    255 }  
    256   
    257 void QExcel::clearCell(int row, int column)  
    258 {  
    259     QString cell;  
    260     cell.append(QChar(column - 1 + 'A'));  
    261     cell.append(QString::number(row));  
    262   
    263     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    264     range->dynamicCall("ClearContents()");  
    265 }  
    266   
    267 void QExcel::clearCell(const QString& cell)  
    268 {  
    269     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    270     range->dynamicCall("ClearContents()");  
    271 }  
    272   
    273 int QExcel::getUsedRowsCount()  
    274 {  
    275     QAxObject *usedRange = sheet->querySubObject("UsedRange");  
    276     int topRow = usedRange->property("Row").toInt();  
    277     QAxObject *rows = usedRange->querySubObject("Rows");  
    278     int bottomRow = topRow + rows->property("Count").toInt() - 1;  
    279     return bottomRow;  
    280 }  
    281   
    282 void QExcel::setCellString(const QString& cell, const QString& value)  
    283 {  
    284     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    285     range->dynamicCall("SetValue(const QString&)", value);  
    286 }  
    287   
    288 void QExcel::setCellFontSize(const QString &cell, int size)  
    289 {  
    290     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    291     range = range->querySubObject("Font");  
    292     range->setProperty("Size", size);  
    293 }  
    294   
    295 void QExcel::setCellTextCenter(const QString &cell)  
    296 {  
    297     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    298     range->setProperty("HorizontalAlignment", -4108);//xlCenter  
    299 }  
    300   
    301 void QExcel::setCellFontBold(const QString &cell, bool isBold)  
    302 {  
    303     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    304     range = range->querySubObject("Font");  
    305     range->setProperty("Bold", isBold);  
    306 }  
    307   
    308 void QExcel::setCellTextWrap(const QString &cell, bool isWrap)  
    309 {  
    310     QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);  
    311     range->setProperty("WrapText", isWrap);  
    312 }  
    313   
    314 void QExcel::setRowHeight(int row, int height)  
    315 {  
    316     QString rowsName;  
    317     rowsName.append(QString::number(row));  
    318     rowsName.append(":");  
    319     rowsName.append(QString::number(row));  
    320   
    321     QAxObject * r = sheet->querySubObject("Rows(const QString &)", rowsName);  
    322     r->setProperty("RowHeight", height);  
    323 }  
     1 //    main.cpp
     2 
     3 #include <QtGui/QApplication>  
     4 #include <QDebug>  
     5   
     6 #include "qexcel.h"  
     7   
     8 int main(int argc, char *argv[])  
     9 {  
    10     QApplication a(argc, argv);  
    11   
    12     //打开文件,取得工作簿  
    13         QExcel j("D:/test.xls");  
    14     //取得工作表数量  
    15     //qDebug()<<"SheetCount"<<j.getSheetsCount();  
    16     //激活一张工作表  
    17     //j.selectSheet(1);  
    18     //j.selectSheet("JSheet2");  
    19     //取得工作表名称  
    20     //j.selectSheet(1);  
    21     //j.getSheetName();  
    22     //qDebug()<<"SheetName 1"<<j.getSheetName(1);  
    23     //取得工作表已使用范围  
    24     //int topLeftRow, topLeftColumn, bottomRightRow, bottomRightColumn;  
    25     //j.getUsedRange(&topLeftRow, &topLeftColumn, &bottomRightRow, &bottomRightColumn);  
    26     //读值  
    27     //j.getCellValue(2, 2).toString();  
    28     //删除工作表  
    29     //j.selectSheet("Sheet1");  
    30     //j.selectSheet(1);  
    31     //j.deleteSheet();  
    32     //j.save();  
    33     //插入数据  
    34         j.selectSheet("Sheet1");  
    35         j.setCellString(1, 7, "addString");  
    36         j.setCellString("A3", "abc");  
    37         j.save();  
    38     //合并单元格  
    39     //j.selectSheet(2);  
    40     //j.mergeCells("G1:H2");  
    41     //j.mergeCells(4, 7, 5 ,8);  
    42     //j.save();  
    43     //设置列宽  
    44     //j.selectSheet(1);  
    45     //j.setColumnWidth(1, 20);  
    46     //j.save();  
    47     //设置粗体  
    48     //j.selectSheet(1);  
    49     //j.setCellFontBold(2, 2, true);  
    50     //j.setCellFontBold("A2", true);  
    51     //j.save();  
    52     //设置文字大小  
    53     //j.selectSheet(1);  
    54     //j.setCellFontSize("B3", 20);  
    55     //j.setCellFontSize(1, 2, 20);  
    56     //j.save();  
    57     //设置单元格文字居中  
    58     //j.selectSheet(2);  
    59     //j.setCellTextCenter(1, 2);  
    60     //j.setCellTextCenter("A2");  
    61     //j.save();  
    62     //设置单元格文字自动折行  
    63     //j.selectSheet(1);  
    64     //j.setCellTextWrap(2,2,true);  
    65     //j.setCellTextWrap("A2", true);  
    66     //j.save();  
    67     //设置一行自适应行高  
    68     //j.selectSheet(1);  
    69     //j.setAutoFitRow(2);  
    70     //j.save();  
    71     //新建工作表  
    72     //j.insertSheet("abc");  
    73     //j.save();  
    74     //清除单元格内容  
    75     //j.selectSheet(4);  
    76     //j.clearCell(1,1);  
    77     //j.clearCell("A2");  
    78     //j.save();  
    79     //合并一列中相同连续的单元格  
    80     //j.selectSheet(1);  
    81     //j.mergeSerialSameCellsInColumn(1, 2);  
    82     //j.save();  
    83     //获取一张工作表已用行数  
    84     //j.selectSheet(1);  
    85     //qDebug()<<j.getUsedRowsCount();  
    86     //设置行高  
    87         //j.selectSheet(1);  
    88         //j.setRowHeight(2, 30);  
    89         //j.save();  
    90   
    91     j.close();  
    92     qDebug()<<"App End";  
    93     return a.exec();  
    94 }  
  • 相关阅读:
    数据结构与算法入门---基本概念
    java 的异常处理
    RESTful API
    数据结构
    错误代码 2003不能连接到MySQL服务器在*.*.*.*(10061)
    MySQL有四种BLOB类型
    如何彻底卸载MySQL
    Mysql 逗号分隔行列转换总结
    如何判断滚动条滚到页面底部并执行事件
    响应式布局之浮动圣杯布局(双飞翼布局)—-自适应宽度布局
  • 原文地址:https://www.cnblogs.com/onetaste/p/3819762.html
Copyright © 2011-2022 走看看