2016-09-27 154 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