91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

資源簡(jiǎn)介

#Qt Windows 下快速讀寫(xiě)Excel指南
很多人搜如何讀寫(xiě)excel都會(huì)看到用`QAxObject`來(lái)進(jìn)行操作,很多人試了之后都會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,就是慢,非常緩慢!因此很多人得出結(jié)論是`QAxObject`讀寫(xiě)excel方法不可取,效率低。
后來(lái)我曾試過(guò)用ODBC等數(shù)據(jù)庫(kù)類型的接口進(jìn)行讀寫(xiě),遇到中文嗝屁不說(shuō),超大的excel還是會(huì)讀取速度慢。
最后,看了一些開(kāi)源的代碼后發(fā)現(xiàn),Windows下讀取excel,還是用`QAxObject`最快!沒(méi)錯(cuò),就是用`QAxObject`讀寫(xiě)最快!!!
大家以后讀取excel時(shí)(win下),不用考慮別的方法,用`QAxObject`就行,速度杠杠的,慢是你操作有誤!下面就說(shuō)說(shuō)咋能提高其讀取效率。

#讀取excel慢的原因
這里不說(shuō)如何打開(kāi)或生成excel,著重說(shuō)說(shuō)如何快速讀取excel。
網(wǎng)上搜到用Qt操作excel的方法,讀取都是使用類似下面這種方法進(jìn)行:

```C
QVariant ExcelBase::read(int row, int col)
{
    QVariant ret;
    if (this->sheet != NULL && ! this->sheet->isNull())
    {
        QAxObject* range = this->sheet->querySubObject("Cells(int, int)", row, col);
        //ret = range->property("Value");
        ret = range->dynamicCall("Value()");
        delete range;
    }
    return ret;
}
```

讀取慢的根源就在于`sheet->querySubObject("Cells(int, int)", row, col)`

試想有10000個(gè)單元就得調(diào)用10000次`querySubObject`,網(wǎng)絡(luò)上90%的教程都沒(méi)說(shuō)這個(gè)`querySubObject`產(chǎn)生的`QAxObject*`最好進(jìn)行手動(dòng)刪除,雖然在它的父級(jí)`QAxObject`會(huì)管理它的內(nèi)存,但父級(jí)不析構(gòu),子對(duì)象也不會(huì)析構(gòu),若調(diào)用10000次,就會(huì)產(chǎn)生10000個(gè)`QAxObject`對(duì)象
得益于[QT快速讀取數(shù)據(jù)量很大的Excel文件](http://blog.csdn.net/a1069962325/article/details/49514377)此文,下面總結(jié)如何快速讀寫(xiě)excel

#快速讀取excel文件

原則是一次調(diào)用`querySubObject`把所有數(shù)據(jù)讀取到內(nèi)存中
VBA中可以使用`UsedRange`把所有用到的單元格范圍返回,并使用屬性`Value`把這些單元格的所有值獲取。

這時(shí),獲取到的值是一個(gè)table,但Qt把它變?yōu)橐粋€(gè)變量QVariant來(lái)儲(chǔ)存,其實(shí)實(shí)際是一個(gè)`QList<QList<QVariant> >`,此時(shí)要操作里面的內(nèi)容,需要把這個(gè)`QVariant`轉(zhuǎn)換為`QList<QList<QVariant> >`

先看看獲取整個(gè)單元格的函數(shù)示意(這里ExcelBase是一個(gè)讀寫(xiě)excel的類封裝):

```C
QVariant ExcelBase::readAll()
{
    QVariant var;
    if (this->sheet != NULL && ! this->sheet->isNull())
    {
        QAxObject *usedRange = this->sheet->querySubObject("UsedRange");
        if(NULL == usedRange || usedRange->isNull())
        {
            return var;
        }
        var = usedRange->dynamicCall("Value");
        delete usedRange;
    }
    return var;
}
```

資源截圖

代碼片段和文件信息

#include?“Excelbase.h“
#include?

#include?
#include?
#if?defined(Q_OS_WIN)
#include?ject>
#endif?//?Q_OS_WIN



#define?TC_FREE(x)??{delete?x;?x=NULL;}

class?ExcelbasePrivate
{
????Q_DECLARE_PUBLIC(Excelbase)
public:
????explicit?ExcelbasePrivate(Excelbase*?qptr);
????~ExcelbasePrivate();

????void?construct();
????void?destory();

????Excelbase*?const?q_ptr;

#if?defined(Q_OS_WIN)
????QAxobject*??excel;
????QAxobject*??books;
????QAxobject*??book;
????QAxobject*??sheets;
????QAxobject*??sheet;
#endif
????QString?????filename;
????QString?????sheetName;
};

ExcelbasePrivate::ExcelbasePrivate(Excelbase?*qptr)
????:?q_ptr(qptr)
#if?defined(Q_OS_WIN)
?????excel(NULL)
?????books(NULL)
?????book(NULL)
?????sheets(NULL)
?????sheet(NULL)
#endif?//?Q_OS_WIN
{
}

ExcelbasePrivate::~ExcelbasePrivate()
{
#if?defined(Q_OS_WIN)
????if(excel)
????{
????????if?(!excel->isNull())
????????{
????????????excel->dynamicCall(“Quit()“);
????????}
????}
????TC_FREE

?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----

?????文件??????18972??2018-01-14?19:43??快速讀取excel\pic\01.png

?????文件???????2233??2018-01-14?19:43??快速讀取excel\pic\02.png

?????文件???????4298??2018-01-14?19:43??快速讀取excel\pic\02_0.png

?????文件??????13072??2018-01-14?19:43??快速讀取excel\pic\03.png

?????文件???????8904??2018-01-14?19:43??快速讀取excel\readme.md

?????文件???????8973??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\Book1.xlsx

?????文件??????12753??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\Excelbase.cpp

?????文件???????3649??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\Excelbase.h

?????文件?????654336??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\excelRWByCztr1988.xls

?????文件????????513??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\fastReadExcelInWindows.pro

?????文件????????171??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\main.cpp

?????文件???????2000??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\MainWindow.cpp

?????文件????????543??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\MainWindow.h

?????文件???????1821??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\MainWindow.ui

?????文件???????1850??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\QVariantListListModel.cpp

?????文件???????1111??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\QVariantListListModel.h

?????目錄??????????0??2018-02-06?10:59??快速讀取excel\src\fastReadExcelInWindows

?????目錄??????????0??2018-02-06?10:59??快速讀取excel\pic

?????目錄??????????0??2018-02-06?10:59??快速讀取excel\src

?????目錄??????????0??2018-02-06?10:59??快速讀取excel

-----------?---------??----------?-----??----

???????????????735199????????????????????20


評(píng)論

共有 條評(píng)論