網(wǎng)站首頁 編程語言 正文
一、讀取excel文件
我們先來看看如何讀取excel文件,讀取excel文件的方式很多。這里選擇openpyxl模塊,安裝語句如下:
pip install openpyxl
我們還需要用到一些其它模塊,具體如下:
pip install pyzbar pip install pillow pip install numpy
下面我們就可以開始操作了。
在Excel中,有工作簿、表、單元等。這里簡單說一下,工作簿就是一個excel文件,表的話就是我們excel左下角切換的sheet1、sheet2,單元就是一個格子。下面我們來讀取一個excel文件:
from openpyxl import load_workbook # 加載excel wb = load_workbook("111.xlsx") # 切換到第一張表 ws = wb[wb.sheetnames[0]] # 獲取A3單元 cell = ws['A3'] # 輸出A3單元的值 print(cell.value)
openpyxl的更多操作可以看看官方的文檔https://openpyxl.readthedocs.io/en/stable/tutorial.html。
二、讀取excel中的圖片
讀取excel中的圖片有多種方式,本文會分享兩種方式。
(1)使用zipfile模塊
excel本身是一個壓縮文件,我們把excel的后綴改成zip后,手動解壓就會看到在xl/media目錄下有一些圖片文件,這些圖片就是excel種插入的圖片。因此我們就可以通過解壓的方式讀取excel種的圖片,具體代碼如下:
import os from zipfile import ZipFile # 解壓目錄 unzip_path = "./unzip" if not os.path.exists(unzip_path): os.mkdir(unzip_path) with ZipFile("111.xlsx") as f: for file in f.namelist(): # 解壓圖片部分的文件 if file.startswith("xl/media"): f.extract(file, path=unzip_path)
詳細(xì)講解可以參考這篇文章
(2)使用openpyxl讀取
上面的操作可以獲取excel中的圖片,但是有個缺點。就是我們不知道哪個圖片來自哪個單元,在有些情況下知道圖片來自哪個單元是很有比較的。下面我們就來解決這個問題:
from openpyxl import load_workbook wb = load_workbook("111.xlsx") ws = wb[wb.sheetnames[0]] # 遍歷表中所有托 for image in ws._images: print(image)
我們先讀取了一個表,然后調(diào)用_images獲取表中的所有圖片。但是這個圖片我們還不能操作,具體對圖片的操作我們下一節(jié)再看。我們先看看怎么知道圖片來自哪個單元,我們可以輸出圖片的anchor._from:
from openpyxl import load_workbook wb = load_workbook("111.xlsx") ws = wb[wb.sheetnames[0]] for image in ws._images: # 輸出圖片的位置信息 print(image.anchor._from)
具體輸入內(nèi)容如下:
<openpyxl.drawing.spreadsheet_drawing.AnchorMarker object> Parameters: col=0, colOff=1, row=0, rowOff=1
其中col表示行號,row表示列號。根據(jù)這些信息,我們就可以知道圖片的單元了。比如col=0,row=0,表示的應(yīng)該是A1單元。如果col=1,row=1,表示的應(yīng)該是B2單元。
三、對讀取的圖片進(jìn)行處理
對圖片處理的操作有很多,這里要看具體需要。這里我分享一下把excel中圖片轉(zhuǎn)換成pillow圖片和ndarray對象的操作。轉(zhuǎn)換后,我們就可以用numpy和pillow對圖片進(jìn)行各種操作。
import numpy as np from PIL import Image from openpyxl import load_workbook wb = load_workbook("111.xlsx") ws = wb[wb.sheetnames[0]] for image in ws._images: # 將圖片轉(zhuǎn)換成Pillow中的圖片對象 img = Image.open(image.ref).convert("RGB") # 將Pillow中的圖片對象轉(zhuǎn)換成ndarray數(shù)組 img = np.array(img)
如果我們excel中的圖片是二維碼,我們就可以進(jìn)行下面的操作:
import numpy as np from PIL import Image from pyzbar import pyzbar from openpyxl import load_workbook wb = load_workbook("111.xlsx") ws = wb[wb.sheetnames[0]] for image in ws._images: # 轉(zhuǎn)換成容易操作的圖片對象 img = Image.open(image.ref).convert("RGB") img = np.array(img) # 解析二維碼 data = pyzbar.decode(img) if data: text = data[0].data.decode('utf-8') print(text) else: print("未識別到內(nèi)容")
補(bǔ)充
除了以上的方法,還可以通過以下操作實現(xiàn):
1、將待讀取的excel文件后綴名改成zip,變成壓縮文件。
2、再解壓這個文件。
3、在解壓后的文件夾中,就有excel中的圖片。
4、這樣讀excel中的圖片,就變成了讀文件夾中的圖片了,和普通文件一樣,可以做各種處理。
具體實現(xiàn)代碼
''' File Name: readexcelimg Author: tim Date: 2018/7/26 19:52 Description: 讀取excel中的圖片,打印圖片路徑 先將excel轉(zhuǎn)換成zip包,解壓zip包,包下面有文件夾存放了圖片,讀取這個圖片 ''' import os import zipfile # 判斷是否是文件和判斷文件是否存在 def isfile_exist(file_path): if not os.path.isfile(file_path): print("It's not a file or no such file exist ! %s" % file_path) return False else: return True # 修改指定目錄下的文件類型名,將excel后綴名修改為.zip def change_file_name(file_path, new_type='.zip'): if not isfile_exist(file_path): return '' extend = os.path.splitext(file_path)[1] # 獲取文件拓展名 if extend != '.xlsx' and extend != '.xls': print("It's not a excel file! %s" % file_path) return False file_name = os.path.basename(file_path) # 獲取文件名 new_name = str(file_name.split('.')[0]) + new_type # 新的文件名,命名為:xxx.zip dir_path = os.path.dirname(file_path) # 獲取文件所在目錄 new_path = os.path.join(dir_path, new_name) # 新的文件路徑 if os.path.exists(new_path): os.remove(new_path) os.rename(file_path, new_path) # 保存新文件,舊文件會替換掉 return new_path # 返回新的文件路徑,壓縮包 # 解壓文件 def unzip_file(zipfile_path): if not isfile_exist(zipfile_path): return False if os.path.splitext(zipfile_path)[1] != '.zip': print("It's not a zip file! %s" % zipfile_path) return False file_zip = zipfile.ZipFile(zipfile_path, 'r') file_name = os.path.basename(zipfile_path) # 獲取文件名 zipdir = os.path.join(os.path.dirname(zipfile_path), str(file_name.split('.')[0])) # 獲取文件所在目錄 for files in file_zip.namelist(): file_zip.extract(files, os.path.join(zipfile_path, zipdir)) # 解壓到指定文件目錄 file_zip.close() return True # 讀取解壓后的文件夾,打印圖片路徑 def read_img(zipfile_path): if not isfile_exist(zipfile_path): return False dir_path = os.path.dirname(zipfile_path) # 獲取文件所在目錄 file_name = os.path.basename(zipfile_path) # 獲取文件名 pic_dir = 'xl' + os.sep + 'media' # excel變成壓縮包后,再解壓,圖片在media目錄 pic_path = os.path.join(dir_path, str(file_name.split('.')[0]), pic_dir) file_list = os.listdir(pic_path) for file in file_list: filepath = os.path.join(pic_path, file) print(filepath) # 組合各個函數(shù) def compenent(excel_file_path): zip_file_path = change_file_name(excel_file_path) if zip_file_path != '': if unzip_file(zip_file_path): read_img(zip_file_path) # main if __name__ == '__main__': compenent('/Users/Desktop/test/people.xlsx')
原文鏈接:https://blog.csdn.net/ZackSock/article/details/122222765
相關(guān)推薦
- 2022-10-25 在IIS上部署Go?API項目_win服務(wù)器
- 2022-09-13 C#?wpf使用ListBox實現(xiàn)尺子控件的示例代碼_C#教程
- 2022-09-15 教你如何將應(yīng)用從docker-compose遷移到k8s中_docker
- 2022-05-28 基于ASP.NET實現(xiàn)驗證碼生成詳解_實用技巧
- 2022-05-31 ASP.NET?Core使用NLog記錄日志_實用技巧
- 2022-08-19 Python數(shù)據(jù)處理pandas讀寫操作IO工具CSV解析_python
- 2022-02-18 解決上傳apk文件后為vnd.android.package-archive格式的問題
- 2022-07-22 Mybatis為實體類自定義別名的兩種方式
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支