使用 python openpyxl 写入 excel 电子表格(字符串搜索)

using python openpyxl to write to an excel spreadsheet (string searches)

以下是我的代码。我希望它读取 excel 电子表格并使用 Warehouse 列中的数据(即在该列的单元格中搜索子字符串)将特定字符串映射并写入下一列 GeneralDescription 中的相应单元格。我的电子表格有超过 50000 行。这段代码适用于此时对两个 GeneralDescription 进行分类。最终我希望能够轻松扩展它以覆盖所有可能的仓库。唯一不起作用且我需要具体帮助的是,当字符串 "WORLD WIDE DATA" 出现在 Warehouse 列中时,代码无法识别它。我假设是因为全部大写。但是,如果字符串 "HUMANRESOURCES Toronto" 出现在 Warehouse 列中,则此代码可以正常工作并将 "HumanResources" 写入 GeneralDescription 列。它还可以识别 "WWD" 和 "wwd" 并将 "World Wide Data" 正确写入 GeneralDescription 列。我不明白为什么只有一个特定的字符串没有被识别,除非它与空格有关。同样在原始电子表格中,有一些标识仓库的整数。如果我不删除这些,我将无法遍历这些行。我需要将这些数字保存在那里。关于如何完成这项工作的任何想法。非常感谢任何帮助。

import openpyxl
import re

wb = openpyxl.load_workbook(filename="Trial_python.xlsx")

ws= wb.worksheets[0]

sheet = wb.active

for i in range(2, 94000):
    if(sheet.cell(row=i, column=6).value !=None):
        if(sheet.cell(row=i, column=6).value.lower()=="world wide data"):
            sheet.cell(row=i, column=7).value="World Wide Data"
        for j in re.findall(r"[\w']+", sheet.cell(row=i, column=6).value
            if(j.lower()=="wwd" or j.lower()=="world wide data"):
                sheet.cell(row=i, column=7).value="World Wide Data"
            if(j.lower()=="humanresources"):
                sheet.cell(row=i,column=7).value="HumanResources"

wb.save(filename="Trial_python.xlsx")

我建议创建一个空列表,当您使用 .append() 遍历存储其中每个值的列时,这应该有助于您的代码更好地扩展,尽管我确信将是其他更有效的解决方案。

我还建议不要使用 == 来检查相等性并尝试使用 is,这个 link 详细介绍了差异:https://dbader.org/blog/difference-between-is-and-equals-in-python

因此您的代码应如下所示:

...
business_list = ['world wide data', 'other_businesses', 'etc']
for i in range(2, 94000):
    if(sheet.cell(row=i, column=6).value is not None):
        if(sheet.cell(row=i, column=6).value.lower() in business_list:
            sheet.cell(row=i, column=7).value = "World Wide Data"
...

希望对您有所帮助

编辑以回答下面的评论

因此,为了回答您在评论 2 中的问题,我们创建的 business_list = [...] 将存储您要检查的 任何内容。 IE。如果出现 WWD、World Wide Data、2467 等,那么您可以检查此列表,如果找到匹配项 - 使用 in 函数 - 然后您可以将任何您喜欢的内容写入第 7 列。(最终代码行)。

如果您希望机器操作或 HumanResources 或任何其他字符串出现,您可以通过多种方法完成此操作。一个简单的方法是像这样为他们写一张支票:

...
business_list = ['world wide data', 'other_businesses', '2467',
                 'central operations', 'humanresources']
for i in range(2, 50000):
    if(sheet.cell(row=i, column=6).value is not None):
        if(sheet.cell(row=i, column=6).value.lower() in business_list:
            if business_list[i].lower() == "humanresources":
                sheet.cell(row = i, column = 7).value = "HumanResources"
            if business_list[i].lower() == "machine operations":
                sheet.cell(row = i, column = 7).value = "Machine Operations"
            else:
                 sheet.cell(row = i, column = 7).value = "World Wide Data"
...

因此,为了解释此处发生的情况,创建了一个包含您要检查的值的列表,称为 business_list。然后您将遍历您的列并使用 not None: 检查单元格是否为空。从这里开始,您将进行初步检查,看看单元格的值是否是您想要检查的值 - in business_list: 如果是 - 您使用它找到的索引来识别和更新单元格值.

这可确保您不会先检查列表来检查可能不存在的内容。由于您建议的值是一对一的,即。 HumanResources 用于 humanresources,Machine Operations 用于机器操作。

至于缩放,通过将新公司名称添加到列表中,然后是 if this then cell = this.

的 2 行语句,应该很容易添加新检查

我对大约 120 万个条目的 sheet 使用了类似的系统,并且性能仍然足够快以用于生产,尽管我不知道您的系统有多复杂。可能还有其他更有效的方法,但这个系统在未来也很容易维护,希望这对你来说更有意义。如果没有请告诉我,如果可能我会提供帮助

编辑:至于你最后的评论,我不会在不做检查的情况下假设这样的事情,因为它可能会导致误报!