QT使用QXlsx读取excel表格中的图片
前言
读取excel表格中的图片的需求比较小众,QXlsx可以操作excel文档,进行图片读取、插入操作,本文主要分享单独提取图片和遍历表格提取文字和图片。
源码下载
github
开发环境准备
把下载的代码中的QXlsx目录,整个拷贝到所创建的qt项目下与.pro文件同层的目录下。
然后在.pro文件中加入引入目录的代码:
INCLUDEPATH += $$PWD/QXlsx
include($$PWD/QXlsx/QXlsx.pri)
功能讲解
在main.cpp中,引用头文件
#include "xlsxdocument.h"
#include "xlsxworksheet.h"
只获取excel的图片
主要用到两个关键功能:
uint Document::getImageCount()
- 功能说明: 获取当前活动工作表中图片的个数;
- 返回值: 工作表中图片个数;
bool Document::getImage(int imageIndex, QImage& img)
- 功能说明: 以【索引】方式获取当前活动工作表中索引为imageIndex的图片;
- 参数imageIndex:需要获取的图片的索引(从1开始);
- 参数img: 用于保存获取的图片;
- 返回值: true:获取图片成功,false:获取图片失败;
void getExcelImages(const QString& excelfilePath){QXlsx::Document xlsx(excelfilePath);//打开excel文件QXlsx::Worksheet* sheet = xlsx.currentWorksheet();if (!sheet) {qDebug() << "Failed to load sheet!";return;}uint count = xlsx.getImageCount();// 查询当前Sheet中图片数量qDebug() << "当前Sheet中图片数量:"<< count;//遍历图片,并保存QImage image;for (int num = 1; num <= count; ++num) {//索引是从1开始,而不是从0开始bool ret=xlsx.getImage(num, image);if(ret==true){QString fullPath=QString("./excelimage%1.png").arg(num);image.save(fullPath);}}
}
遍历表格提取文字和图片
主要用到1个关键功能:
bool Document::getImage(int row, int col, QImage &img)
功能说明: 以【行列号】方式获取当前活动工作表中位于row行、col列的图片;
参数row: 图像的左上角位于row行(从1开始,取值时,想要减去1);
参数col: 图像的左上角位于col行(从1开始,取值时,想要减去1);
参数img: 用于保存获取的图片;
返回值: true:获取图片成功,false:获取图片失败;
void getExcelcontentandImages(const QString& filePath) {QXlsx::Document xlsx(filePath);QXlsx::Worksheet* sheet = xlsx.currentWorksheet();if (!sheet) {qDebug() << "Failed to load sheet!";return;}QXlsx::CellRange range = sheet->dimension();int imagenum=1;for (int row = range.firstRow(); row <= range.lastRow(); ++row) {QString showmsg=QString("line %1:").arg(row);for (int col = range.firstColumn(); col <= range.lastColumn(); ++col) {QVariant cellValue = sheet->read(row, col);if (cellValue.canConvert<QString>()) {//判断是不是字符串类型//qDebug() << "Cell(" << row << "," << col << "):" << cellValue;showmsg += cellValue.toString();showmsg += " ";}else{//看看是不是图片,如果是就保存qDebug() << row << "==" << col;QImage image;bool ret=xlsx.getImage(row-1,col-1, image);//图片的行和列都要减去1才能获取到图片if(ret==true){showmsg += " 图片保存";QString fullPath=QString("./excelimage%1.png").arg(imagenum);image.save(fullPath);imagenum++;//累加}}}qDebug() << showmsg;}
}
结尾
本篇是一位读者在我的博文【QT常用技术讲解】excel表格处理两种方式:QAxObject和qtxlsx 中提问QXlsx怎么读取表格中图片?经过查看QXlsx的源码xlsxdocument.h中发现没有获取图片修改的函数,然后到github上下载新的代码,发现是有的(如下图所示),如果下载下来测试是可行的,代码参见资源附件。