1. 程式人生 > >QT快速讀取資料量很大的Excel檔案

QT快速讀取資料量很大的Excel檔案

     最近寫的一個專案中,有需要讀取資料量很大(有10個sheet,每個sheet有65535行11列的資料)的Excel檔案,用了COM和QODBC兩種方法讀取,速度很慢。

你可能會問,為啥不把資料放在資料庫裡,那樣讀取的速度更快?當然,需求要求是可以從資料庫或者從Excel中讀取資料這兩種方式,所以沒辦法還是要操作Excel。

迴歸正題,在操作Excel上,QT有兩種方式,一是通過COM元件,二是通過QODBC(資料庫的方式)。

QODBC讀取100MB的Excel檔案的時候需要十幾分鍾,因為太慢,這種方法捨棄。

網上找了通過COM元件讀取,使用QAxObject的方法,但是網上找到的都是一個單元格一個單元格的讀取,對於資料量很大的檔案時,效率極其的低。後來經過各種方法摸索,找到了兩種方法(還是使用COM元件),一個是直接讀一個整個sheet,一個是直接讀sheet中的一個範圍(範圍可以自己定義)。兩種方法可以按照自己的實際需要使用。下面貼出方法。

一、讀取整個sheet:

QAxObject *usedRange = worksheet->querySubObject("UsedRange"); 
QVariant cell = usedRange->dynamicCall("Value");
這就可以讀取整個sheet的資料了,只要將cell裡的資料取出來轉換你需要的格式就行。

二、讀取sheet中的一個範圍:

QVariantList params;
params << "A1" << "A5";  //A1至A5的資料

QAxObject *cell = worksheet->querySubObject("Range(QVariant,QVariant)",params);
QVariant excel_data = cell->dynamicCall("Value2()");
這就可以讀取這個sheet的A1至A5的資料了。

PS:資料量大,能用資料庫就用資料庫儲存。

再PS:因為COM元件在主執行緒中會自動初始化,所以就不需要管,但是在子執行緒中使用,會導致程式錯誤,原因是COM元件未初始化,所以在子執行緒中使用要自己手動初始化,方法參考:http://blog.csdn.net/a1069962325/article/details/48975179

相關推薦

QT快速讀取料量Excel檔案

     最近寫的一個專案中,有需要讀取資料量很大(有10個sheet,每個sheet有65535行11列的資料)的Excel檔案,用了COM和QODBC兩種方法讀取,速度很慢。 你可能會問,為啥不把資料放在資料庫裡,那樣讀取的速度更快?當然,需求要求是可以從資料庫或者從E

資料庫匯入資料時,料量導致報錯問題

當資料庫匯入資料時,資料量很大容易導致一些問題 在mysql安裝目錄下,找到my.ini檔案,開啟此檔案在最下面加入以下一段程式碼: wait_timeout=2880000 interactive_timeout =2880000 max_allowed_packet=1

java使用多執行緒及分頁查詢料量的資料

主要的思路就是: 先通過count查出結果集的總條數,設定每個執行緒分頁查詢的條數,通過總條數和單次條數得到執行緒數量,通過改變limit的下標實現分批查詢。 呼叫方法: import org.springframework.beans.factory.annota

es 在料量的情況下(數十億級別)如何提高查詢效率啊?

開發十年,就只剩下這套架構體系了! >>>   

利用poi將excel表中資料讀取存入mysql資料庫(料量比較

最近被老大安排了一個任務,利用程式將excle表中的資料讀取到,做處理,然後存進資料庫。接到任務的時候人是懵逼的。但是安排的任務也得硬著頭皮完成。現將做的東西記錄如下,方便以後查詢。 這個小demo的原型是在網上找的,demo連結如下 http://www.cnblogs.

使用流讀取料量檔案並存到mysql資料庫中

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import jav

QT快速讀取Excel

  1 //QT+=axcontainer 2 3 #include <QFileDialog> 4 #include <QAxObject> 5 #include <QVariant> 6 #include <QList> 7

java匯出excel料量解決方案

@RequestMapping("/export") public void export(HttpServletRequest request, HttpServletResponse response, FullProcess fullProcess) { /

mysql查詢哪個表料量

use information_schema;select table_name,table_rows from tables where table_schema='cargo_new' order by table_rows desc limit 3 -- cargo_new (選擇資料庫)

MySQL Insert料量導致報錯 MySQL server has gone away

接手了同事的專案,其中有一個功能是儲存郵件模板(包含圖片),同事之前的做法是把圖片進行base64編碼然後存在mysql資料庫中(欄位型別為mediumtext)然後儲存三張圖片(大概400k)的時候報錯MySQL server has gone away 然後檢視官方文件https://dev.mysql

介面料量,導致記憶體溢位,解決辦法

通常我們使用介面呼叫資料總是返回一段我們需要的資訊,或者是json 格式資訊,通過接收將資料儲存到程式當中,再對接收到的資料進行轉換成對應的模型格式 。目前遇到的問題是接收的資料量過於巨大,導致完整接收將導致記憶體溢位,無法進行接下去的工作 。 解決辦法: 我們將資料儲存到本地檔案 ,再通過

Mybatis中使用流式查詢避免料量導致OOM

一、前言 前面介紹了裸露JDBC 方式使用流式程式設計,下面介紹下MYbatis中兩種使用流式查詢方法 二、Mybaits中MyBatisCursorItemReader的使用 2.1 配置 MyBatisCursorItemReader的注入 <bean id="myMyBa

Mysql中使用JDBC流式查詢避免料量導致OOM

一、前言 java 中MySQL JDBC 封裝了流式查詢操作,通過設定幾個引數,就可以避免一次返回資料過大導致 OOM。 二、如何使用 2.1 之前查詢 public void selectData(String sqlCmd) throws SQLException {    v

記kafka partition料量導致不能正確重啟

某臺kafka伺服器負載過高,機器掛掉一段是時間後,kill掉佔用記憶體的程序,然後重啟kafka服務,但是一直不能完成啟動和資料同步,日誌如下fset 0 to broker BrokerEndPoint(11,192.168.207.79,9092)] ) (kafka

WCF入門(一)--Request Entity Too large 傳輸的料量

      通過WCF進行資料的查詢或者新增的時候,如果資料量過大,一般會報出如下的錯誤:      1、已超過傳入訊息(65536)的最大訊息大小配額。若要增加配額,請使用相應繫結元素上的MaxRe

Hibernate在處理料量比較的時候記憶體不釋放的解決方案

                    隨著資訊化的推進,系統的依賴性也變的越來越強,所以各種資料不斷積累,資料開發率並不高,所以資料還不能準確高效的使用,這個時候我們就需要將資料匯出到Excel然後

webservice傳輸料量的情況的解決方案

class CompressSoapExtension : SoapExtension     {         ///<summary>/// 舊流         ///</summary>private Stream _originStream =null;         /

struts2 資料傳輸問題---“POST方式提交料量,在後臺接收不到資料”問題的解決

最近做用struts2做專案的時候,發現一個問題,就是當通過POST方式提交資料量過大,在後臺接收不到資料,後來通過檢視資料,發現tomcat預設傳輸最大的資料限制為2M,最後的解決辦法是設大tomcat的conf下的server.xml中8080Connector的max

如果料量特別的時候應該如何優化sql語句

1.你所有的關聯欄位,應該在相應表中有唯一索引,最好是主鍵 2.資料量過大,如果你cdb_members的記錄很多,遠遠大於500條,可以考慮改變程式,先從此表裡面獲取500條資料,然後在迴圈裡面每條資料庫關聯獲取其它表的資訊,這樣就不需要先對五個表做連結。儘量不適用聯合

Mysql匯入料量的SQL檔案

問題描述:Navicat for Mysql 匯入資料量較大的sql檔案時,會提示操作失敗,如圖, 解決方法: 採用mysql source命令匯入; 操作步驟: 1. 開啟cmd,輸入命令: