如何使用openpyxl

时间:2019-06-26 14:13:18

标签: python openpyxl

我对openpyxl和python完全陌生,我在解决此问题上遇到了困难,需要您的帮助。

JAN FEB MAR MAR YTD 2019 YTD
25   9  57     23           7
61  41  29     5           57
54  34  58    10            7
13  13  63    26           45
31  71  40    40           40
24  38  63    63           47
31  50  43    2            61
68  33  13    9            63
28  1   30    39           71

我有一个包含上述数据的Excel报告。我想搜索包含特定字符串(即YTD)的单元格,并获取YTD列的列号。我想使用列号为该列提取数据。我不想使用行和单元格引用,因为excel文件会定期更新,因此d列将始终移动。

def t_PM(ff_sheet1,start_row):
    wb = openpyxl.load_workbook(filename='report')  # open report
    report_sheet1 = wb.get_sheet_by_name('sheet 1')

    col = -1
    for j, keyword in enumerate(report_sheet1.values(0)):
        if keyword=='YTD':
            col = j
            break      
    ff_sheet1.cell(row=insert_col + start_row, column= header['YTD_OT'], value=report_sheet1.cell(row=i + 7, column=col).value) 

但是,我收到一个“'发电机'对象不可调用”错误。我该如何解决?

1 个答案:

答案 0 :(得分:1)

您的问题是report_sheet1.values是生成器,因此您不能(0)调用它。我假设您的代码不希望“ YTD”出现在第一行,因此您可以迭代所有单元格。通过以下方式进行操作:

def find_YTD():
    wb = openpyxl.load_workbook(filename='report')  # open report
    report_sheet1 = wb.get_sheet_by_name('sheet 1')

    for col in report_sheet1.iter_cols(values_only=True):
        for value in col:
            if isinstance(value, str) and 'YTD' in value:
                return col

如果您正在假设此数据位于第一行,只需执行以下操作:

for cell in report_sheet1[1]:
    if isinstance(value, str) and 'YTD' in cell.value:
        return cell.column
  • openpyxl使用基于“ 1”的行索引

阅读文档-access many cells