我們在實(shí)例9里面展示了如何批量填寫每日出貨清單,每一天的清單都是直接復(fù)制“出貨單模板”,然后在其中填入出貨產(chǎn)品信息的。openpyxl 有一個(gè)問題,就是在復(fù)制工作表的時(shí)候,無法跟著復(fù)制圖片。而我們的公司名一般比較個(gè)性化,在Excel中用文字很難達(dá)到那個(gè)效果,比如如下: 此時(shí),我們就需要使用到openpyxl 模塊的圖片插入功能。但這個(gè)功能有一個(gè)坑,我們下面來展開說明。 按照openpyxl 的官方文檔,添加圖片只需如下幾步:
from openpyxl.drawing.image import Image #導(dǎo)入圖片添加模塊 from openpyxl import load_workbook #導(dǎo)入Excel工作表操作模塊 img = Image('images\company.png') #需添加的圖片所在路徑 wb=load_workbook('data\出貨單.xlsx') #打開工作簿 ws=wb[sheet_name] #獲取工作表 ws.add_image(img,'A1') #添加圖片到指定的單元格 wb.save('data\出貨單_new.xlsx') #保存文件
下面我們就按照以上說明來操作,看看效果怎么樣。
from openpyxl.drawing.image import Image from openpyxl import load_workbook img = Image('images\company.png') #需添加的圖片所在路徑 wb = load_workbook('data\出貨單.xlsx') #打開工作簿 sheet_names=wb.get_sheet_names() #獲得工作簿的所有工作表名 for sheet_name in sheet_names: #遍歷每個(gè)工作表,并在每個(gè)工作表的A1單元格插入圖片 ws=wb[sheet_name] ws.add_image(img, 'A1')#添加圖片到指定的A1單元格,圖片左上角將與A1單元格左上角對齊 wb.save('data\出貨單—new.xlsx')
我們通過遍歷“出貨單.xlsx”文件中的所有工作表,然后每個(gè)工作表都在A1單元格插入我們設(shè)定好的圖片,最后保存。待程序執(zhí)行完成,打開保存的文件“出貨單—new.xlsx”,報(bào)出如下錯誤: 我們選擇“是”,繼續(xù)下一步,再報(bào)出錯誤: 點(diǎn)擊“關(guān)閉”,繼續(xù)下一步。我們發(fā)現(xiàn)除了最后一個(gè)工作表“12-23”,其他工作表圖片全部無法正常顯示,都帶有一個(gè)紅色的“X”,顯示為“無法顯示該圖片”。 我花了很多時(shí)間來研究到底怎么回事,然后也做了很多測試。最后發(fā)現(xiàn),每插入一張圖片就需要保存一下,才可保證圖片正常顯示。因此將程序稍作修改如下。即每給一個(gè)工作表插入圖片后,都保存一次,而不是給所有工作表插完圖片后,最后才來保存。相當(dāng)于我們不停地打開“出貨單.xlsx”,然后在其中的各個(gè)工作表依次插入圖片,每操作一次,保存一次。時(shí)間會比只保存一次更長,但畢竟比手動插入圖片快很多了。最終,每張工作表都插入圖片成功,呲牙... from openpyxl.drawing.image import Image img = Image('images\company.png') wb = load_workbook('data\出貨單.xlsx') sheet_names=wb.get_sheet_names() for sheet_name in sheet_names: wb = load_workbook('data\出貨單.xlsx') ws=wb[sheet_name] ws.add_image(img, 'A1') wb.save('data\出貨單.xlsx')
所有源代碼和說明都在Jupyter notebook上完成,所用到的Excel 資料已上傳GitHub, 歡迎Fork或下載到本地隨意玩。。。轉(zhuǎn)載請注明出處,謝謝。 GitHub鏈接: https://github.com/weidylan/Office_Automation_by_Using_Python
|