前言
? ? ? ? 讀取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上下載新的代碼,發現是有的(如下圖所示),如果下載下來測試是可行的,代碼參見資源附件。