1.数据库快速读取
QAxObject *excel = NULL;
QAxObject *workbooks = NULL;
QAxObject *workbook = NULL;
excel = new QAxObject("Excel.Application");
if (!excel) { qDebug() << "EXCEL对象丢失!"; }
excel->dynamicCall("SetVisible(bool)", false);
workbooks = excel->querySubObject("WorkBooks");
workbook = workbooks->querySubObject("Open(QString, QVariant)", FileName); QAxObject * worksheet = workbook->querySubObject("WorkSheets(int)", 1);
QAxObject * usedrange = worksheet->querySubObject("UsedRange");
QAxObject * rows = usedrange->querySubObject("Rows");
QAxObject * columns = usedrange->querySubObject("Columns"); int intRows = rows->property("Count").toInt();
int intCols = columns->property("Count").toInt();
qDebug() << "xls行数:"<<intRows;
qDebug() << "xls列数:"<<intCols;
QString Range;
covertToColName(intCols,Range);
Range+=QString::number(intRows);
Range = "A1:"+Range;
QAxObject *allEnvData = worksheet->querySubObject("Range(QString)", Range); QVariant allEnvDataQVariant = allEnvData->property("Value");
QVariantList allEnvDataList = allEnvDataQVariant.toList();//allEnvDataList 为空
排查过程
该数据库读取采用了某些网上大佬提供的Range方式,一次读入大量的数据,在设定搜索方区之后出现了取出来的value值Qvariant无法转换为QvariantList类型的情况,初步判断为数据读取失败。
补充
已经核对过数据的行号列号以及表的行数列数没什么问题,convertToColName功能主要是根据列数返回最后一个单元格的行号,比如列号超过26则改变为AA,AB等,该函数完成此功能,不具体写出来了,这个没什么问题。
经过各种方法的测试,可谓是经历了千辛万苦,发现是excel系统版本的问题,网上很多例子可能是在office03或者13下使用的,但现在主流的都到16了,导致原来的操作命令出现了变化,只需修改property("Value")为dynamicCall(“Value2()”)就好了。
请问,如果我excel A1--D1开始有30行,能划定这样的范围吗