您的位置:首页 > 编程语言 > Qt开发

Qt操作Excel文件知识总结

2011-12-15 14:40 447 查看
Qt在windows平台下封装了Activex,可以同VAB中操作Excel一样读取xls文件,因此不支持linux平台。现在这个功能在Qt4.7中也不需要额外的商业许可了。这种方法比较通用,是常规方法,缺点是速度太慢了,如果数据量大,要想提高速度,可以考虑把excel文件另存为csv格式,用逗号分割个单元格的文本方式,直接操作文本文件,速度很快

2011年12月16日,在开源网站搜到一个跨平台的直接操作excel原生格式的C++类库xlslib,http://sourceforge.net/projects/xlslib/正在研究,估计这才是我想要的

如何在Qt中使用xlslib,http://developer.qt.nokia.com/forums/viewthread/747,关键是没有msvc2005/2008如何才能编译得到需要的dll或者.a库,这是问题

//////////////////////////////////////////////////////////////////////////

下面是QAxObject方法的代码备忘记录

在pro文件中增加

CONFIG+=axcontainer

LIBS+=-lqaxserver\

-lqaxcontainer


在cpp文件中

#include<QAxObject>

QAxObject*excel=NULL;

QAxObject*workbooks=NULL;

QAxObject*workbook=NULL;

QAxObject*cell=NULL;

excel=newQAxObject("Excel.Application");

if(excel->isNull()){//网络中很多使用excel==NULL判断,是错误的

QMessageBox::critical(0,"错误信息","没有找到EXCEL应用程序");

return;

}

excel->dynamicCall("SetVisible(bool)",false);

workbooks=excel->querySubObject("WorkBooks");

workbook=workbooks->querySubObject("Open(QString,QVariant,QVariant)",fileName,3,true);//两个参数时,三个参数true和false都很正常,false锁定excel文件,其它程序只能只读方式打开,否则程序正在处理excel文件时,在外面打开excel,程序异常退出

if(!workbook){

QMessageBox::critical(0,"错误信息","excel文件不存在");

return;

}

QAxObject*worksheet=workbook->querySubObject("WorkSheets(int)",1);//打开第一个sheet

QAxObject*usedrange=worksheet->querySubObject("UsedRange");//获取该sheet的使用范围对象

QAxObject*rows=usedrange->querySubObject("Rows");

QAxObject*columns=usedrange->querySubObject("Columns");



intintRowStart=usedrange->property("Row").toInt();

intintColStart=usedrange->property("Column").toInt();

intintCols=columns->property("Count").toInt();

intintRows=rows->property("Count").toInt();


for(inti=intRowstsrt;i<intRowStart+intRows;i++){

	for(j=intColStart;j<intColStrt+intCols;j++){


cell=worksheet->querySubObject("Cells(int,int)",i,j);//获取单元格

if(cell->property("Value").type()==QVariant::Double){

qDebug()<<QString::number(cell->property("Value").toDouble(),'f',0);


}elseif(cell->property("Value").type()==QVariant::QString){

qDebug()<<cell->property("Value").toString();

}



}

workbook->dynamicCall("Close(Boolean)",false);

excel->dynamicCall("Quit(void)");

deleteworkbook;

deleteworkbooks;

deleteexcel;


使用Activex读取excel速度不快,上千行的记录需要考虑用别的方法了,网上有直接读取excel格式文件的c++封装类,据说很快,没有下载测试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: