在使用python的excel中,如何从包含多个单词的单元格的整列中find单词?

我有一个excel文件,列A中的关键字列表。

eg. Bob Dan Brian 

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

 B1= Bob, Grant, James, Dave B2= Dean, Dan, Brian 

我怎么输出到列C和列A和单元格B中的名称。即我想输出是:

 C1= Bob C2= Dan, Brian 

有任何想法吗? 我曾尝试使用Python,但不知道如何开始。

帮助将不胜感激

它首先取决于您用来访问Excel的Python模块。 如果您使用Windows,我会build议使用Win32Com,可以在这里find。 这个模块给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的variables,它代表了活动的Excel工作表的名称。 您只需点击任何单元格即可激活工作表。 现在我们要从列A中获取所有名称并将其存储到列表中。 我们有两个select:

  1. 我们可以迭代列A中的所有单元格,并将存储的名称作为string提取出来,并将其附加到使用sheet.Cells(row,col).Value的所有名称的列表中 这种方法在较小范围内工作得很好,但如果处理500行以上,速度可能会变慢。
  2. 我们可以使用sheet.Range(“A1”,“A3”),提取列A中包含名称的整个单元格的 ,并将值添加到列表中。 如果你有一个大范围的单元格,这可以更快。 对于这个例子,我们将使用Range。

示例续:

 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列中的所有名称。为此,我们将使用sheet.Cells.Value函数来获取Col B中每个单元格的名称列表。我们也将使用该string。 split(“,”)函数将逗号分隔的名称拆分为名称列表和string.strip()以删除任何不必要的空格。 如果这个名单中的任何名字都没有名字,我们知道我们有一个匹配,并将它放在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 

这将把string“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只是将每个单元格作为自己的列表添加到主列表中。

在那里你有它。