簡體   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