繁体   English   中英

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

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

以下是我的代码。 我希望它读取Excel电子表格并使用Warehouse列中的数据(即在该列的单元格中搜索子字符串)来映射特定字符串并将其写入下一列称为GeneralDescription的相应单元格中。 我的电子表格有5万多行。 此代码段目前可用于对两个GeneralDescription进行分类。 最终,我希望能够轻松进行扩展以覆盖所有可能的仓库。 唯一无法正常工作并且需要具体帮助的是,当在仓库列中出现字符串“ WORLD WIDE DATA”时,代码无法识别它。 我假设是因为全部大写。 但是,如果在“仓库”列中出现字符串“ HUMANRESOURCES Toronto”,则此代码将正常工作,并将“ 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 ,此链接将详细介绍差异: https : //dbader.org/blog/difference-between-is-and-equals-in -蟒蛇

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

...
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 = [...]将存储您要检查的任何内容 即。 如果出现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:检查单元格的值in business_list:如果是,则使用找到的值的索引来识别和更新单元格值。

这样可以确保您不会通过先检查列表来检查可能不存在的东西。 由于您建议的值是一对一的,即。 人力资源用于人力资源,机器操作用于机器操作。

至于扩展,应该很容易地添加新的检查,方法是将新的公司名称添加到列表中,然后用两行语句来表示if this then cell = this。

我为大约120万张纸使用了类似的系统,尽管我不知道您的纸有多复杂,但性能仍然足够快地用于生产。 可能还有其他更有效的方法,但是此系统将来也很容易维护,希望这对您来说更有意义。 让我知道是否可以,如果可能,我会帮助

编辑:至于您的最后评论,我不会做这样的事情而不做检查,因为它可能导致误报!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM