我有一个 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,我建议您使用 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 列中的所有名称并将其存储到一个列表中。我们有两种选择:
示例继续:
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 函数来获取 B 列中每个单元格的名称列表。我们还将使用字符串。 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 列,只需将每个单元格作为自己的列表附加到主列表中。
你有它。