我是python的新手。最近我尝试在Windows 7中使用openpyxl处理excel文件。我试图在excel文件'Sample.xlsx'中打印每个单元格的值。这是我的代码:
import openpyxl
workbook = openpyxl.load_workbook('Sample.xlsx')
worksheet = workbook.active
for row in worksheet.rows:
for col in worksheet.columns:
cell = worksheet.cell(row = row, column = col)
print(cell.value)
运行脚本时出现以下错误:
追踪(最近一次通话): 文件“excel.py”,第6行,in cell = worksheet.cell(row = row,column = col) 文件“C:\ Python34 \ lib \ site-packages \ openpyxl \ worksheet \ worksheet.py”,第306行,在单元格中 如果行< 1或列< 1: TypeError:unorderable类型:tuple()< INT()
我无法理解错误。任何人都请解释我做错了什么。
答案 0 :(得分:1)
worksheet.cell
期望其row
和column
参数的基于1的索引,但是你传递了一个元组(worksheet.rows
和worksheet.columns
,每个都返回一个元组(元组)。
你几乎没有选择:
利用workbook.rows
逐行迭代工作表并返回每行的单元格元组的事实。这也可以节省您对worksheet.cell
的调用:
for row in worksheet.rows:
for cell in row:
print(cell.value)
同样的,但是按柱式:
worksheet = workbook.active
for column in worksheet.columns:
for cell in column:
print(cell.value)
使用max_row
和max_column
获取此工作表中使用的最大行和列的索引(从1开始),然后使用{{1}进行迭代(同时请记住,默认情况下range
是从零开始的并且是独占的:
range
使用for row in range(1, worksheet.max_row + 1):
for col in range(1, worksheet.max_column + 1):
cell = worksheet.cell(row = row, column = col)
print(cell.value)
获取所有已使用单元格的可迭代内容,从而节省了显式调用worksheet.get_cell_collection
的需要。
这种方法的问题在于返回的可迭代的顺序是任意的:
worksheet.cell
答案 1 :(得分:0)
尝试将worksheet.rows
替换为worksheet.iter_rows(min_row, max_row)
并将worksheet.columns
替换为worksheet.iter_cols(min_col, max_col)
,其中min和maxes是循环范围。我认为worksheet.rows
正在给出一个元组,你不能将它用于for
循环。 iter_rows()
和iter_cols()
会返回生成器,因此它应该可以正常工作。
答案 2 :(得分:0)
我尝试了各种方法来打印Excel工作表中的单元格值。以下是我尝试的代码:
import openpyxl
workbook = openpyxl.load_workbook('Sample.xlsx')
worksheet = workbook.active
for row in range(1,worksheet.max_row+1):
for col in range(1,worksheet.max_column+1):
print(worksheet.cell(row=row, column=col).value)
import openpyxl
workbook = openpyxl.load_workbook('Sample.xlsx')
worksheet = workbook.active
for row in worksheet.rows:
for cell in row:
print(cell.value)
import openpyxl
workbook = openpyxl.load_workbook('Sample.xlsx')
worksheet = workbook.active
for row in worksheet.iter_rows(worksheet.min_row, worksheet.max_row):
for cell in row:
print(cell.value)