如何使用Python和openpyxl复制Excel行,过滤值?

时间:2018-03-27 10:19:03

标签: python excel filtering openpyxl autofilter

我有一个包含大量个人数据的巨型excel工作簿。每个人都有一个唯一的数字标识符,但有多行信息。

我想通过该标识符过滤所有内容,然后将结果行复制到模板excel工作簿并保存结果。我试图用Python和openpyxl来做这件事。

我认为应用AutoFilter然后复制结果可以解决问题。但似乎openpyxl只能应用AutoFilter和not do the actual filtering?

我试图按照this question的答案,但它不会做任何事情。我想过滤D(4)列中的数字。

import openpyxl, os
from openpyxl.utils import range_boundaries

#Intitializes workbooks
print('Opening data file...')
min_col, min_row, max_col, max_row = range_boundaries("A:AG")
wb = openpyxl.load_workbook('Data.xlsx')
ws = wb.active
template = openpyxl.load_workbook('Template.xlsx')
templatews = template.active

#Asks for numeric identifier
print('Done! Now introduce identifier:')
filterNumber = input()

#Does the actual thing
for row in ws.iter_rows():
    if row[3].value == str(filterNumber):
        templatews.append((cell.value for cell in row[min_col-1:max_col]))

#Saves the results
template.save('templatesave.xlsx')
print('All done! Have fun!')

对此有任何见解将不胜感激。谢谢!

编辑:根据@alexis建议修正了列号,尽管它没有解决问题。

已解决:事实证明,IF语句要求输入整数,而不是字符串。使用 int()解决了这个问题。

for row in ws.iter_rows():
    if row[3].value == int(filterNumber):
        templatews.append((cell.value for cell in row[min_col-1:max_col]))

2 个答案:

答案 0 :(得分:0)

iter_rows()方法返回一系列元组,因此它们从零开始索引:列D位于索引3.换句话说,请尝试这样:

for row in ws.iter_rows():
    if row[3].value == str(filterNumber):
        ...

如果它不起作用,请让脚本打印一些列的值并从那里取出。也许这个单元格的格式不是你所期望的等等。

答案 1 :(得分:0)

我终于解决了! 事实证明,

["1", "2", "3"].forEach((query) => {
                await driver.findElement(By.css(Input)).sendKeys(query);
                await driver.findElement(By.css(save)).click();
            });

请求IF语句中的整数而不是字符串。使用int()方法解决了这个问题。