网站首页 > 技术教程 正文
网上很多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:" <<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("表格导入成功!"));
}
猜你喜欢
- 2024-10-18 SOLIDWORKS PDM客户端安装问题总结
- 2024-10-18 2021届中考总复习,圆的知识重难点综合和中考考点归纳总结
- 2024-10-18 SQL Server错误18456:解决方案(sql2008r2错误18456)
- 2024-10-18 老董精心编写-WINCC组态软件生成EXCEL报表详细脚本
- 2024-10-18 一步一步教你,在iFix中如何将数据记录通过ODBC保存到SQL SERVER
- 2024-10-18 SQL学习篇 | 对比Excel Power Query学习SQL
- 2024-10-18 条码软件如何通过ODBC数据源访问SQLServer(二)
- 2024-10-18 Access配置odbc数据源连接ORACLE数据库
- 2024-10-18 GBASE南大通用GBase 8a ODBC的安装文件
- 2024-10-18 oracle怎么通过odbc进行异构库跨连SQL server
你 发表评论:
欢迎- 最近发表
-
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
- linux移植(Linux移植freemodbus)
- 独家解读:Win10预览版9879为何无法识别硬盘
- 基于Linux系统的本地Yum源搭建与配置(ISO方式、RPM方式)
- Docker镜像瘦身(docker 减小镜像大小)
- 在linux上安装ollama(linux安装locale)
- 渗透测试系统Kali推出Docker镜像(kali linux渗透测试技术详解pdf)
- Linux环境中部署Harbor私有镜像仓库
- linux之间传文件命令之Rsync傻瓜式教程
- 解决ollama在linux中安装或升级时,通过国内镜像缩短安装时长
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)