龙空技术网

Qt毫秒级读取Excel文件

音视频开发老舅 2536

前言:

今天我们对“netexcel读取文件”大约比较看重,兄弟们都需要知道一些“netexcel读取文件”的相关文章。那么小编在网络上收集了一些对于“netexcel读取文件””的相关知识,希望我们能喜欢,姐妹们快快来了解一下吧!

网上很多QT读取Excel文件方式都是如下形式,太慢了,打开文件+读取文件要6s以上,实在是太慢了!

    QAxObject excel("Excel.Application");    excel.setProperty("Visible", false);    QAxObject *work_books = excel.querySubObject("WorkBooks");    work_books->dynamicCall("Open (const QString&)", filePath);    QAxObject *work_book = excel.querySubObject("ActiveWorkBook");    QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可换用WorkSheets    int sheet_count = work_sheets->property("Count").toInt();  //获取工作表数目    if(sheet_count > 0)    {        QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);        QAxObject *used_range = work_sheet->querySubObject("UsedRange");        QAxObject *rows = used_range->querySubObject("Rows");        int row_count = rows->property("Count").toInt();  //获取行数        //QString txt = work_sheet->querySubObject("Cells(int,int)", i, 1)->property("Value").toString(); //获取单元格内容        work_book->dynamicCall("Close(Boolean)", false);  //关闭文件        excel.dynamicCall("Quit(void)");  //退出    }

后面在网上找到一种方法:libxl,大概字需要17ms,简直不是一个级别的

【领音视频+QT学习资料,点击下方链接免费领取↓↓,先码住不迷路~】

点击→Qt开发进阶技术栈学习路线和资料

下面说下libxl的使用方法:

(1)加载动态链接库libxl.lib,我上个博客有仔细讲怎么加载lib

(2)包含头文件

#include "libxl.h"using namespace libxl;

(3)使用头文件中的函数

(4)实际运用,将excel文件中的内容读取后,写到界面的tableWidget中

void InputName::readExcel(QString filePath){    Book *book = NULL;    if(filePath.endsWith("xls",Qt::CaseInsensitive))//判断是否是.xls文件,不区分大小写    {        //qDebug() << "xls";        book = xlCreateBook(); // xlCreateBook() for xls    }    else if(filePath.endsWith("xlsx",Qt::CaseInsensitive))//判断是否是.xlsx文件,不区分大小写    {        //qDebug() << "xlsx";        book = xlCreateXMLBook(); // xlCreateXMLBook() for xlsx    }    bool f=book->load(filePath.toLocal8Bit());//加载excel文件,toLocal8Bit是为了支持中文命名的文件    CellType ct;    if(book)    {        Sheet *sheet =book->getSheet(0);//表1        int  cellnum;        qDebug() << "row:" <<sheet->lastRow();//有多少行,注意:有些行是空行,没有数据但是也要计入        //写训练数据与label        for (int i=1;i<sheet->lastRow();i++)        {            for (int j=1;j<3;j++)            {                ct = sheet->cellType(i,j);//单元格的数据类型  1表示是数字  2表示是字符串                if(ct == 2)                {                    QTableWidgetItem *NameItem = new QTableWidgetItem(QString::fromLocal8Bit(sheet->readStr(i,j)));//读取字符串                    NameItem->setTextAlignment(Qt::AlignCenter);                    ui->tableWidget->setItem(i-1,j,NameItem);                }                else if(ct == 1)                {                    QTableWidgetItem *NameItem = new QTableWidgetItem(QString::number((int)sheet->readNum(i,j)));//读取数字                    NameItem->setTextAlignment(Qt::AlignCenter);                    ui->tableWidget->setItem(i-1,j,NameItem);                }            }        }     }    else    {        QMessageBox::information(this,tr("错误"),tr("文件打开失败!"));    }}

点击读取按钮选择excel文件

void InputName::on_importbut_clicked(){	QString strFile = QFileDialog::getOpenFileName(this,"选择文件","./","文本文件(*.xls;*.xlsx;)");   if (strFile.isEmpty())   {        return;   }   readExcel(strFile);    for(int i=0; i<TotalPlayerNumber; i++)    {        PlayerName[i] = ui->tableWidget->item(i,1)->text();        WorkSpaceName[i] = ui->tableWidget->item(i,2)->text();    }    QMessageBox::information(this,tr("提示"),tr("表格导入成功!"));}

标签: #netexcel读取文件