在带有python的excel中,如何在包含多个单词的单元格中从整个列中查找单词



我有一个 excel 文件,在 A 列中列出了 KEY 单词。

eg. Bob
    Dan
    Brian

在 B 列中,我有几行,单元格中有多个条目:

B1= Bob, Grant, James, Dave
B2= Dean, Dan, Brian
我如何将 C 列和

A 列和单元格 B 中的名称放入 C 列。即我想要一个输出:

C1= Bob
C2= Dan, Brian

有什么想法吗?我尝试使用python,但不确定如何开始。

帮助将不胜感激

它首先取决于您用于访问 Excel 的 Python 模块。如果您使用的是Windows,我建议您使用Win32Com,可以在此处找到。此模块使Python能够以编程方式访问任何Microsoft的Office应用程序(包括Excel),并使用VBA中使用的许多相同方法。

以下是使用 Win32Com for Excel 的问题的解决方案。我假设您使用逗号 (',') 作为名称之间的分隔符,并且您对 A 列和 B 列之间名称的匹配区分大小写(请记住,在 Python 中"A"不等于"a")

首先,我们希望连接到Excel并使用您的名字访问工作表

#First we need to access the module that lets us connect to Excel
import win32com.client 
# Next we want to create a variable that represents Excel
app = win32com.client.Dispatch("Excel.Application")   
# Lastly we will assume that the sheet with the names is the active sheet
sheet = app.ActiveSheet

此时,我们有一个名为sheet的变量,它表示带有名称的活动Excel工作表。您只需单击任何单元格即可激活工作表。现在我们要首先获取 A 列中的所有名称并将其存储到列表中。我们有两种选择:

  1. 我们可以遍历 A 列中的所有单元格,并将存储为 a 的名称提取为字符串,并使用工作表将其附加到所有名称的列表中。单元格(行,列)。价值。这适用于较小的范围,但如果您处理 500+ 行,可能会很慢。
  2. 我们可以使用工作表提取包含名称的A列中的整个单元格范围。范围("A1","A3")。值并将值添加到列表中。如果您有大范围的单元格,这可能会快得多。在本例中,我们将使用范围。

示例继续:

import win32com.client
app = win32com.client.Dispatch("Excel.Application")   
sheet = app.ActiveSheet
# rang is an object representing the cells A1, A2, A3
rang = sheet.Range("A1","A3")
# names is a tuple of length 3 containing tuples of length 2
names = rang.Value
#nameLst is a list of all values in names
nameLst = [name[0] for name in names]

接下来,我们要遍历 B 列中的所有名称。为此,我们将使用工作表。Cells.Value 函数,用于获取 Col B 中每个单元格的名称列表。我们还将使用 string.split(",") 函数将逗号分隔的名称拆分为名称列表,并使用 string.strip() 删除任何不必要的空格。如果此列表中的任何名称都在 nameLst 中,我们知道我们有匹配项并将其放在 Col C 中。

import win32com.client
app = win32com.client.Dispatch("Excel.Application")   
sheet = app.ActiveSheet
rang = sheet.Range("A1","A3")
names = rang.Value
nameLst = [name[0] for name in names]
#Iterate over the rows ic ColB. Remember Excel uses base 1 not 0 for inexing
for rowI in range(1,3):
    cellNames = sheet.Cells(rowI,2).Value
    #split cellNames by "," and add all of the names to a list.
    cellNamesLst = [cellName.strip() for cellName in cellNames.split(",")]
    #Now we want a list of all names that are in cellNamesLst and in nameLst
    matchLst = [matchName for matchName in cellNamesLst if matchName in nameLst]
    #Create a string of all matches to go in Col C
    allMatches = ", ".join(matchLst)
    #Lastly put all matches in in Col C
    sheet.Cells(rowI,3).Value = allMatches

这会将字符串"Bob"放入单元格 C1,将"Dan, Brian"放入单元格 C2。win32com 的使用可能非常强大,可用于自动化您在所有 MS Office 应用程序中执行的大部分操作。

以下是没有注释的最终代码:

import win32com.client
app = win32com.client.Dispatch("Excel.Application")   
sheet = app.ActiveSheet
rang = sheet.Range("A1","A3")
names = rang.Value
nameLst = [name[0] for name in names]
for rowI in range(1,3):
    cellNames = sheet.Cells(rowI,2).Value
    cellNamesLst = [cellName.strip() for cellName in cellNames.split(",")]
    matchLst = [matchName for matchName in cellNamesLst if matchName in nameLst]
    allMatches = ", ".join(matchLst)
    sheet.Cells(rowI,3).Value = allMatches

希望这有帮助。

在我看来

,"列"及其"单元格"只是列表。

#the "columns"
A = ["Bob","Dan","Brian"]
B = [["Bob", "Grant", "James", "Dave"],
     ["Dean", "Dan", "Brian"]]
C = []

for b in B:
    c = []
    for name in b:
        if name in A:
            c.append(name)
    C.append(c)
for c in C:
    print c
>>> 
['Bob']
['Dan', 'Brian']

您需要做的就是将每一列读到一个列表中。 对于列 A,只需将项目追加为名称列表。 对于列 B,只需将每个单元格作为自己的列表附加到主列表中。

你有它。

最新更新