Python處理Excel的另一個(gè)庫(kù)-openpyxl
咪哥雜談

本篇閱讀時(shí)間約為 5 分鐘。
1
前言
上篇文章中,介紹了如何使用 Pandas 來(lái)操作處理 Excel 和 Csv 文件。其中留下了一個(gè)點(diǎn),即圖片頭像現(xiàn)在在 Excel 中依然是地址,現(xiàn)在需要將地址轉(zhuǎn)為圖片,寫入到 Excel。
今天來(lái)介紹另一個(gè)好用的庫(kù) openpyxl ,Python操作處理 Excel 的神庫(kù)。
回顧上篇文章詳見(jiàn):Python處理Excel&CSV文件
2
環(huán)境準(zhǔn)備
開(kāi)始之前,需要安裝的第三方庫(kù)有兩個(gè):
pip install openpyxlpip install pillow
3
代碼演示
下面來(lái)簡(jiǎn)單介紹下我完成這次圖片寫入用到的功能,完整代碼文末提供地址:
1. 初始化時(shí)加載,讀和寫的操作對(duì)象
class Excel(object):def __init__(self, file):self.file = fileself.wb = load_workbook(self.file) # 加載,可讀sheets = self.wb.sheetnames # 獲取所有sheet頁(yè)self.sheet = sheets[0] # 默認(rèn)第一sheet頁(yè)self.ws = self.wb[self.sheet] # 切換到sheet頁(yè)
self.wb 是讀 Excel 時(shí)用到的,self.ws 則是寫入時(shí)用到的。
2. 獲取某列的所有值
由于我需要讀取頭像圖片地址,所以就得需要這一列的地址:

class Excel(object):# 獲取某列的所有值def get_col_values(self, column):rows = self.ws.max_rowcolumn_data = []for i in range(1, rows + 1):cell_value = self.ws.cell(row=i, column=column).valuecolumn_data.append(cell_value)return column_data
注意,這里的 column 是從 1?開(kāi)始的,Excel 中 A 列意味著 column 等于 1,所以傳值的時(shí)候注意列數(shù)的數(shù)字。
3. 重塑圖片大小,重新寫入文件,設(shè)置行高列高。
重新定義圖片大小是為了整齊,從網(wǎng)站下載下來(lái)的圖片大小不一。
from PIL import Image as PILImageimg= PILImage.open(img_path)image = img.resize((75, 75), PILImage.ANTIALIAS) # 重構(gòu)圖片大小,設(shè)置為 75 像素image.save(img_path)
定義單元格行寬高:
class Excel(object):# 設(shè)置單元格寬度和高度def set_cell_height(self, row, col, row_height, column_weight):self.ws.row_dimensions[row].height = row_heightself.ws.column_dimensions[col].width = column_weight
4.?設(shè)置某列的值
通過(guò) requests 庫(kù)讀取到圖片,落地,再次設(shè)置圖片。

classExcel(object):# 設(shè)置某個(gè)單元格的值def set_cell_value(self, row, column, cell_value):try:if isinstance(cell_value, Image):self.ws.add_image(cell_value, f'{row}{column}')else:self.ws.cell(row=row, column=column).value = cell_valueexcept Exception as e:self.ws.cell(row=row, column=column).value = "None"
5. 保存文件
class?Excel(object):# 保存文件def save_file(self, file_name=None):if file_name:self.wb.save(file_name)else:self.wb.save(self.file)
可以看到這樣是不是就很整齊了呢?

4
使用對(duì)比pandas庫(kù)處理Excel
通過(guò)這兩篇文章比較,個(gè)人覺(jué)得還是 pandas 庫(kù)操作數(shù)據(jù)方便些。但不同場(chǎng)景下使用也不同。
比如我要寫入圖片,可能 pandas 支持就不那么好,但比如我想合并多個(gè) Excel ,那無(wú)疑使用 pandas 的?concat??函數(shù)要簡(jiǎn)單的多。
可以說(shuō),openpyxl 庫(kù)更多地是對(duì) Excel 細(xì)節(jié)操作的實(shí)現(xiàn),而 Pandas?多數(shù)注重于數(shù)據(jù)的處理,大家根據(jù)自己的場(chǎng)景需求選擇使用就好~
5
總結(jié)
有想看這章完整代碼的朋友,可以后臺(tái)回復(fù)?最終王者 即可獲得。
題圖 :
Tirachard Kumtanom -?pexels
pyspider爬取王者榮耀數(shù)據(jù)(下)
你點(diǎn)的每個(gè)在看,我都認(rèn)真當(dāng)成了喜歡