2016-11-27 95 views
-1

我是python的新手。最近我尝试在windows 7中使用openpyxl来处理excel文件。我试图在excel文件'Sample.xlsx'中打印每个单元格的值。这里是我的代码:在python中打印excel单元格值时出错

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) 

当我运行该脚本,我有以下错误:

Traceback (most recent call last): File "excel.py", line 6, in cell = worksheet.cell(row = row, column = col) File "C:\Python34\lib\site-packages\openpyxl\worksheet\worksheet.py", line 306, in cell if row < 1 or column < 1: TypeError: unorderable types: tuple() < int()

我无法理解的错误。任何人都请解释我做错了什么。

+0

你认为'row'和'col'是在你创建的循环中? –

+0

我使用行和列遍历工作表的每一行和一列。外部循环用于表格的每一行,内部循环用于表格的每一列。 – balaji

+0

那么,你为什么认为你可以将它们传递给'cell'方法呢? –

回答

1

worksheet.cell预计1基于其rowcolumn参数指标,但你同时通过一个元组(worksheet.rowsworksheet.columns每个返回记录的元组)。

您有几种选择:

  1. 充分利用的事实,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) 
    
  2. 使用max_rowmax_column获得指数(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) 
    
  3. 使用worksheet.get_cell_collection可以获得所有已使用单元的迭代,从而使您无需明确调用worksheet.cell
    这种方法的问题是,返回的迭代的顺序是任意的

    for cell in worksheet.get_cell_collection(): 
        print(cell.value) 
    
+0

非常感谢DeepSpace。我在发布问题后使用了您的选项2。现在我可以打印每个单元格的值。 – balaji

0

尝试用worksheet.iter_rows(min_row, max_row)代替worksheet.rows并用worksheet.iter_cols(min_col, max_col)代替worksheet.columns其中min和max是环路范围。我认为worksheet.rows提供了一个元组,并且您不能将其用于for循环。 iter_rows()iter_cols()返回发电机,所以它应该工作。

+0

'worksheet.rows'和'worksheet.columns'是各自生成器的包装。 –

+0

worksheet.iter_rows()和worksheet.iter_cols()也可以在没有参数的情况下工作。默认情况下,他们采取工作表。min_row/worksheet.min_column和worksheet.max_row/worksheet.max_column作为参数 – balaji

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)