好好填一張圖看看效果:
哇的天,太棒了吧
【其實,這是用Python寫腳本弄得,不是一格一格填的】
&開始分析
調整格子長寬 | openpyxl庫可以 |
---|---|
格子填色 | openpyxl庫可以 |
讀取圖片並獲取像素 | pillow庫可以(PIL) |
例:
1. 更改行高,列寬
ws.column_dimensions['A'].width = 10 # 更改第A列列寬爲10
ws.row_dimensions[1].height = 13.5 # 更改第1行行高爲 13.5
------ps:ws爲一個可操作的表格對象
2. 填充顏色
wk = openpyxl.load_workbook(r"E:\lala.xlsx")
wk_name = wk.sheetnames
wk_sheet = wk[wk_name[0]]
fille = PatternFill('solid',fgColor='FFBB00') #設置填充顏色【16進制
wk_sheet['C2'].fill = fille # 應用填充樣式在C2單元格
3. 獲取圖片座標爲x,y處的rgb值
rgb = img.getpixel((x, y))
&發現了兩個問題
def rgb_to_hex(rgb):
rb = list(rgb)
st = ''
for cl in rb:
st += hex(cl)[2:].rjust(2, '0')# 去掉16進制開頭的0x,並保證轉換後位數爲2
if st.count('0')==6: # 不知爲何,發現不識別16進制顏色 000000,所以換成000001 影響不大
st = st[:-1] + '1'
return st
這個轉換,可以把表格橫座標理解爲一種“字符26進制”,具體解釋參考這篇文章【點擊這裏】
具體解釋看那篇文章,這裏直接上代碼
【實現了把十進制數轉換爲對應的Excel列座標A,B,C,D…AA,AB…】
def ch26(x):
chr26 = [chr(65 + i) for i in range(26)]
zh = ''
while x!=-1:
zh = chr26[x%26] + zh
x = x//26-1
return zh
& 解決了主要的技術問題,那麼只需要遍歷讀圖獲取像素,轉換像素,遍歷填圖並設置格子長寬。
from PIL import Image
from openpyxl.styles import PatternFill
from openpyxl import Workbook
img_path = r'c:\lala\hello.png'
out_path = r'c:\lala\hello.xlsx'
img = Image.open(img_path)
wb = Workbook()
sheet = wb.worksheets[0]#獲取初始工作表
for y in range(img.size[1]):
for x in range(img.size[0]):
if not y:# 如果是第一行,修改每一格列寬
sheet.column_dimensions[ch26(x)].width = 2.6
rgb = img.getpixel((x, y))
c_hex = rgb_to_hex(rgb)
fills = PatternFill('solid', fgColor=c_hex)
sheet[f'{ch26(x)}{y}'].fill = fills
print('\r Get {}-[{}]//{}-[{}]'.format(x+1, img.size[0], y+1, img.size[1]+1), end='')
wb.save(out_path)
wb.close()
這幾步驟有不明白的片段,可以翻一翻前面的分析看。
至此,就完成了,那麼稍微加點UI,然後打個包,豈不是更方便食用。肝!肝!肝!
成功