Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中打印excel单元格值时出错_Python_Excel_Openpyxl - Fatal编程技术网

在python中打印excel单元格值时出错

在python中打印excel单元格值时出错,python,excel,openpyxl,Python,Excel,Openpyxl,我是python新手。最近我尝试在Windows7中使用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:

我是python新手。最近我尝试在Windows7中使用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行,在 单元格=工作表。单元格(行=行,列=列) 文件“C:\Python34\lib\site packages\openpyxl\worksheet\worksheet.py”,第306行,在单元格中 如果行<1或列<1: TypeError:无序类型:tuple()
我不能理解这个错误。任何人请解释我做错了什么。

尝试用
工作表替换
工作表。行
。iter\u行(最小行,最大行)
并用
工作表替换
工作表。列
。iter\u列(最小列,最大列)
其中最小和最大列是循环范围。我认为
worksheet.rows
给出了一个元组,您不能将其用于
for
循环
iter\u rows()
iter\u cols()
返回生成器,因此它应该可以工作。

工作表。cell
行和
列的
参数需要基于1的索引,但您同时传递一个元组(
工作表.行和
工作表.列
每个都返回一个元组)

您几乎没有选择:

  • 利用
    workbook.rows
    逐行迭代工作表并为每行返回一个单元格元组这一事实。这样还可以节省对工作表单元格的调用:

    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
    获取此工作表中使用的max row和max 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)
    
  • 使用
    worksheet.get\u cell\u collection
    获取包含所有已使用单元格的iterable,从而省去了显式调用
    worksheet.cell
    的需要。
    这种方法的问题是返回的iterable的顺序是任意的

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

  • 我尝试了各种方法在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)
    

    你认为你创建的循环中有什么
    呢?我使用行和列迭代工作表的每一行和每一列。外部循环指的是工作表的每一行,内部循环指的是工作表的每一列。那么,为什么你认为可以将它们传递到
    单元格
    方法中呢?我误解了d工作表.rows和工作表.columns的真正含义。现在我了解了如何使用
    工作表。行
    工作表。列
    是各自生成器的包装。工作表.iter_rows()和工作表.iter_cols()也可以在没有参数的情况下工作。默认情况下,它们将worksheet.min_row/worksheet.min_column和worksheet.max_row/worksheet.max_column作为参数。非常感谢您的深入空间。我在发布问题后使用了您的选项2。现在我可以打印每个单元格的值了。