网上很多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学习资料,点击下方链接免费领取↓↓,先码住不迷路~】
下面说下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:" <lastRow();//有多少行,注意:有些行是空行,没有数据但是也要计入
//写训练数据与label
for (int i=1;ilastRow();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; itableWidget->item(i,1)->text();
WorkSpaceName[i] = ui->tableWidget->item(i,2)->text();
}
QMessageBox::information(this,tr("提示"),tr("表格导入成功!"));
}