2016-09-27 196 views
1

我想打開一個excel工作簿並遍歷循環中的每個工作表。這是第一個循環:在工作簿中迭代工作表 - Python嵌套For循環

wb = openpyxl.load_workbook('snakes.xlsx') 
for i in wb.worksheets: 
    i= 0 
    wb.get_sheet_names() 
    i = i + 1 

一旦我能成功的完成這些工作表中的每一個,我希望做一個嵌套循環這需要我的PNG文件各一個,並將其放置在工作表。值得注意的是,工作表名稱和png文件在名爲country_names的數據框中存儲了相同的名稱(國家名稱)。

第二環:

for ws in wb.worksheets: 
    img = openpyxl.drawing.image.Image(folder + str(var) + '.png') 
    ws.add_image(img, 'K1') 
    wb.save('snakes.xlsx') 

如何使代碼遍歷圖像並將其寫入工作表做嵌套的for循環的任何想法?

+0

你爲什麼woud想在這裏嵌套循環?你可以在單個循環中做2件事情。既然你可能有一個國名的名字列表,你可以使用'enumerate(wb.worksheets)'並用'names [i]'打開圖像。或者,如果你想讓它變得更加pythonic,請將它們壓縮。同樣在第一個循環中,您使用'i'作爲迭代器,然後在循環內重新分配'i'。你永遠不應該這樣做 –

回答

1

您的代碼片段似乎顯示了for循環在Python中的工作方式的根本性誤解。

要通過每個片材循環,則在正確的軌道上:

wb = openpyxl.load_workbook('test.xlsx') 
for sheet in wb.worksheets: 
    # do stuff with "sheet" 
    pass 

for環路(sheet在我的例子,i在你的)的變量是列表(wb.worksheets)的成員:它不是一個整數索引。在你的例子中,你在的每個循環中立即用0覆蓋i的值,因此沒有工作表。

還值得一提get_sheet_names()從工作簿對象調用,所以沒有必要內稱它爲循環:

>>> wb.worksheets 
[<Worksheet "Sheet1">, <Worksheet "Sheet2">, <Worksheet "Sheet3">] 

最後,你的第二個「嵌套的循環」(這ISN」 t甚至嵌套)是正確的,除了每個循環保存新的Excel文件,這是浪費。

由於您指出工作表名稱與PNG名稱相同,因此您可以在查找圖像時調用工作表的屬性title

下面應該是一個工作示例:

wb = openpyxl.load_workbook('snakes.xlsx') 
for ws in wb.worksheets: 
    img = openpyxl.drawing.image.Image(ws.title + '.png') 
    ws.add_image(img, 'K1') 
wb.save('new.xlsx') 
+0

真的很感謝你的幫助!對不起,我對Python很新。我已經使用了以下代碼:wb = openpyxl.load_workbook('snakes.xlsx') for ws in wb.worksheets: img = openpyxl.drawing.image.Image(ws.title +'.png') ws。 add_image(img,'K1') wb.save('snakes.xlsx')我收到如下錯誤信息「IOError:[Errno 2]沒有這樣的文件或目錄:u'sheet1.png'。爲什麼是有au出現在工作表標題前面嗎?png文件是表1. – spacedinosaur10

+0

@ spacedinosaur10讓我知道你是否有進一步的問題,否則upvote /接受讚賞! – brianpck

+0

看到我的問題上面?我也嘗試添加我的詞典+ png如下:img = openpyxl.drawing.image.Image(country +'.png')但我得到了另一個錯誤,如下所示:TypeError:不支持的操作數類型爲+:'dict'和'str'。今天不是一個快樂的Python – spacedinosaur10