Python – 取得Excel Cell 顏色

簡介

我們在使用python應用處理Excel套件時,其實不僅可以取得cell中的值,也可以取得cell的顏色、字體、Style等等等,而這篇我們就實作透過程式來取得。本篇會介紹兩個相對常用的套件,openpyxl 與 xlrd。這邊要額外說明一下,xlrd算是讀取excel的功能,他的搭配套件是xlwt,照字面上來看就是xl-excel,rd-read,wt-write,那我們就直接看看要怎樣來取得儲存格中的顏色吧。

xlrd套件使用方法

首先我們先來介紹一下透過xlrd套件來讀取的方式,大家可以先安裝此套件,並且新增一個Excel檔案在儲存格中填上顏色,如上圖。

pip install xlrd
import xlrd

#讀取本地Excel檔案
data = xlrd.open_workbook("Excel/man.xlsx",formatting_info = True)
sheet = data.sheet_by_name("Sheet")

#特殊讀取儲存格顏色
xfx = sheet.cell_xf_index(0,0)
xf = data.xf_list[xfx]
bgx = xf.background.pattern_colour_index
pattern_colour = data.colour_map[bgx]

print(pattern_colour)

有關xlrd讀取儲存格顏色的方式如上述程式碼,可以跟網路上大家分享透過xlwt基本讀取方式比較一下,發現在

『 open_workbook(“Excel/man.xlsx”,formatting_info = True) 』這行中

多出來了第二個引數『formatting_info = True』,沒有這個可能就無法讀取到顏色了。

我們複製上方程式碼貼上去執行一下,發現怎麼會出現錯誤,就是剛剛新增的那行formatting出錯,上網找了一下解法發現是,xlrd的formatting引數不支援『.xlsx』檔案,所以可能要把檔案手動另存新檔成『.xls』。

#修改路徑
data = xlrd.open_workbook("Excel/man2.xls",formatting_info = True)
#讀取儲存格
sheet.cell_xf_index(0,0)

接著我們修改一下讀取路徑與你要讀取對應的儲存格,就可以得到儲存格的rgb顏色。大家都可以多加測試一下透過xlrd套件來取得顏色的方法。

Openpyxl套件使用方法

在使用openpyxl套件前我想要先提示一下,該套件不可以讀取『.xls』檔案,但是程式碼的部分就相較xlrd單純許多。

import openpyxl
#讀取檔案
fn = 'Excel/man.xlsx'
wb = openpyxl.load_workbook(fn)
#讀取分頁
wb.active = 0
ws = wb.active
#取得儲存格顏色
print(str(ws['A1'].fill.start_color))

在openpyxl取得顏色的函示為『fill』,而不僅僅可以取得背景顏色,還可以去得文字顏色等等的資訊。

可以看到『fill.start_color』中也富含著取多的子參數,而我們要單純取得顏色的話就輸入『fill.start_color.rgb』,就可以得到rgb數值,我們可以再另外使用轉換函式轉換rgb數值變顏色名稱。

這邊再額外多介紹一個轉換套件『 webcolor 』,大家可以看到下方程式碼,跟這個轉換顏色套件融合運用。

import openpyxl
from webcolors import rgb_to_name
from webcolors import hex_to_name

fn = 'Excel/man.xlsx'
wb = openpyxl.load_workbook(fn)

wb.active = 0
ws = wb.active

print(str(ws['A1'].fill.start_color.rgb))

a = str(ws['A1'].fill.start_color.rgb)
s = a[:2] + a[4:]
hexColor = '#'+ s

print(hex_to_name(hexColor))

融合的結果我們可以看到套件直接將數值轉換成文字型態。在使用套件前都要記得先安裝。

小結

很弔詭的xlrd不能讀取『.xlsx』但可以讀取『.xls』,反倒是openpyxl是可以讀取『.xlsx』但不可以讀取『.xls』,所以假如要做防呆機制的話,我們在一開始要判斷讀取的檔案副檔名格式,再去選擇要用哪個套件來取得儲存格中的顏色。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *