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上下载新的代码,发现是有的(如下图所示),如果下载下来测试是可行的,代码参见资源附件。

相关推荐
それども6 小时前
Apache POI XSSFWorkbook 和 SXSSFWorkbook 的区别
apache·excel
恋爱绝缘体17 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
Z1Jxxx8 小时前
加密算法加密算法
开发语言·c++·算法
乌萨奇也要立志学C++8 小时前
【洛谷】递归初阶 三道经典递归算法题(汉诺塔 / 占卜 DIY/FBI 树)详解
数据结构·c++·算法
️停云️9 小时前
【滑动窗口与双指针】不定长滑动窗口
c++·算法·leetcode·剪枝·哈希
charlie1145141919 小时前
嵌入式现代C++教程: 构造函数优化:初始化列表 vs 成员赋值
开发语言·c++·笔记·学习·嵌入式·现代c++
IT=>小脑虎9 小时前
C++零基础衔接进阶知识点【详解版】
开发语言·c++·学习
在路上看风景10 小时前
01. C++是如何工作的
开发语言·c++
码农小韩10 小时前
基于Linux的C++学习——指针
linux·开发语言·c++·学习·算法
小L~~~10 小时前
绿盟校招C++研发工程师一面复盘
c++·面试