資源簡介
#Qt Windows 下快速讀寫Excel指南
很多人搜如何讀寫excel都會看到用`QAxObject`來進行操作,很多人試了之后都會發現一個問題,就是慢,非常緩慢!因此很多人得出結論是`QAxObject`讀寫excel方法不可取,效率低。
后來我曾試過用ODBC等數據庫類型的接口進行讀寫,遇到中文嗝屁不說,超大的excel還是會讀取速度慢。
最后,看了一些開源的代碼后發現,Windows下讀取excel,還是用`QAxObject`最快!沒錯,就是用`QAxObject`讀寫最快!!!
大家以后讀取excel時(win下),不用考慮別的方法,用`QAxObject`就行,速度杠杠的,慢是你操作有誤!下面就說說咋能提高其讀取效率。
#讀取excel慢的原因
這里不說如何打開或生成excel,著重說說如何快速讀取excel。
網上搜到用Qt操作excel的方法,讀取都是使用類似下面這種方法進行:
```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個單元就得調用10000次`querySubObject`,網絡上90%的教程都沒說這個`querySubObject`產生的`QAxObject*`最好進行手動刪除,雖然在它的父級`QAxObject`會管理它的內存,但父級不析構,子對象也不會析構,若調用10000次,就會產生10000個`QAxObject`對象
得益于[QT快速讀取數據量很大的Excel文件](http://blog.csdn.net/a1069962325/article/details/49514377)此文,下面總結如何快速讀寫excel
#快速讀取excel文件
原則是一次調用`querySubObject`把所有數據讀取到內存中
VBA中可以使用`UsedRange`把所有用到的單元格范圍返回,并使用屬性`Value`把這些單元格的所有值獲取。
這時,獲取到的值是一個table,但Qt把它變為一個變量QVariant來儲存,其實實際是一個`QList<QList<QVariant> >`,此時要操作里面的內容,需要把這個`QVariant`轉換為`QList<QList<QVariant> >`
先看看獲取整個單元格的函數示意(這里ExcelBase是一個讀寫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
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????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\Excelba
?????文件???????3649??2018-01-14?19:43??快速讀取excel\src\fastReadExcelInWindows\Excelba
?????文件?????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
評論
共有 條評論