根据Qt读二进制文件进行改写
首先就是读取对应的文件,在后续如果需要更改为读取txt的时候,只需要将最后一行取消注释,将倒数第二行注释即可,如果打开的文件可能是Excel也可能是txt,用一个if语句判断读取的文件名是否包含txt即可。
void MainWindow::on_act_open_triggered()
{
QString curPath=QDir::currentPath();
QString dlgTitle="打开一个文件";
QString filter="文本文件(*.txt);;Excel文件(*.xlsx);;Excel文件(*.xls);;所有文件(*.*)";
QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
if(aFileName.isEmpty())
return;
openExcel(aFileName);
//openTextByStream(aFileName);
}
读取Excel文件
bool MainWindow::openExcel(const QString &aFileName)
{
QAxObject *excel = new QAxObject(this);
//连接Excel控件
excel->setControl("Excel.Application");
//不显示窗体
excel->dynamicCall("SetVisible (bool Visible)","false");
//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
excel->setProperty("DisplayAlerts", false);
//获取工作簿集合
QAxObject *workbooks = excel->querySubObject("WorkBooks");
//获取当前工作簿
QAxObject *workbook = workbooks->querySubObject("Open(QString&)",aFileName);
//获取工作表集合
QAxObject *worksheets = workbook->querySubObject("WorkSheets");
//获取工作表集合的工作表1,即sheet1
QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);
QAxObject * usedrange = worksheet->querySubObject("UsedRange");//有数据的矩形区域
//获取行数
QAxObject * rows = usedrange->querySubObject("Rows");
int nRows = rows->property("Count").toInt();
if(nRows <= 1){
qWarning()<<"无数据,跳过该文件";
return false;
}
x1.clear();
y1.clear();
QVariant var = usedrange->dynamicCall("Value");
QList<QVariant> varRows = var.toList();
for(int i=1;i<nRows;i++){
QList<QVariant> vars = varRows.at(i).toList();
x1.push_back(vars.at(0).toDouble());
y1.push_back(vars.at(0).toDouble());
}
timer->stop();
ShowCurve(cusplot1,x1,y1);
cnt=0;
flags=1;
workbook->dynamicCall("Close()");//关闭工作簿
excel->dynamicCall("Quit()");//关闭excel
delete excel;
excel=NULL;
qDebug() << "\n导入成功啦!!!";
return true;
}
在上面需要注意的第一点:由于读取的数据var是QVariant不能直接进行存放到我们需要的QVector<double>数组中,所以需要进行几次转换,第一次的varRows是将var按照行进行展开,每一个是一行的数据,第二个vars是将这一行的数据进行展开,每一个既是我们所需要的的数据。需要注意的是此时的数据依然是QVariant,我们还是需要使用toDouble进行转换,才能得到我们需要的数据。
注意:在我们读入数据之前,这个数组应该是被清空的,只有这样,数据才不会受到前面的影响。如果我们的数据前面是定时输出的,还需要将定时器关掉。