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,C++)