2012-08-13 75 views
1

我有一個的關鍵詞在列A在使用python的excel中,如何從包含多個單詞的單元格的整列中找到單詞?

eg. Bob 
    Dan 
    Brian 

在B列列表的Excel文件,我有在小區多個條目的幾行:

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

我怎麼了投入C列,並且是在A列名和細胞B. 即我想的輸出繼電器是:

C1= Bob 
C2= Dan, Brian 

任何想法?我曾嘗試使用Python,但不知道如何開始。

幫助將不勝感激

+2

你有什麼試過? 這可能是一個開始的地方:http://packages.python.org/openpyxl/ – deadly 2012-08-13 12:24:32

+0

@gene onyx:你沒有評論我的答案或在這裏,你找到了答案?如果是這樣,你可以關閉這個問題嗎? – 2012-08-13 13:56:36

+0

感謝上述鏈接致命。這麼多一次採取一切。 – Onyx 2012-08-14 09:20:38

回答

1

它首先取決於您用來訪問Excel的Python模塊。如果您使用的是Windows,我會推薦使用可以找到的Win32Com here.該模塊提供對任何Microsoft Office應用程序(包括Excel)的Python編程訪問,並使用許多與VBA中使用的方法相同的方法。

下面是使用Win32Com for Excel解決您的問題的方法。我假設您使用逗號(',')作爲名稱之間的分隔符,並且列A和列B之間的名稱匹配區分大小寫(請記住,在Python中,「A」不等於「a」)

開始,我們希望與你們的名字

#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 

連接到Excel和獲得訪問表在這一點上,我們有一個變量命名表示積極練成工作表與名稱。您只需點擊任何單元格即可激活工作表。現在我們首先獲得列A中的所有名稱並將其存儲到列表中。我們有這樣做的兩個選項:

  1. 我們可以遍歷所有單元格的列A,並提取名稱保存爲一個字符串,並將其追加到使用sheet.Cells所有名的列表(行,COL).value的。這適用於較小的範圍,但如果您處理的行數超過500行,則速度可能會變慢。
  2. 我們可以使用sheet.Range(「A1」,「A3」)。Value提取列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()來刪除任何不必要的空格。如果有任何此列表中的名字都是在nameLst,我們知道我們有一個比賽,並把它放在上校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 

這將將會把字符串「鮑勃」到單元格C1和「丹,布賴恩「進入單元格C2。 win32com的使用非常強大,可以用來自動執行你在所有MS Office應用程序中所做的大部分工作。

這裏是最後的代碼W/O評論:

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 

希望這有助於。

+0

謝謝邁克爾。這工作絕對好吃!?!最重要的是感謝新手指導通過一步一步的解釋。 – Onyx 2012-08-14 10:27:04

+0

Onyx沒問題。我記得當我開始使用Python for Excel,PowerPoint,Word和Access時,很難將所有信息放在一起。如果您有任何問題,請隨時向我發送消息,我可以看到我可以提供什麼幫助。 – 2012-08-14 18:25:42

0

我看到它時,「列」和他們的「細胞」,是簡單的羅列。

#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只是將每個單元格作爲自己的列表附加到主列表中。

那裏你有它。

+0

Doh,它看起來很簡單。當我走了那不是那樣的。 – Onyx 2012-08-14 09:10:45

+0

@Onyx多數民衆贊成python,它可以是非常簡單的,如果你想它。另外 - 你甚至不需要特殊的Excel讀取器,只需讀取文件並拆分行即可獲取每種列的類型。如果你想我可以添加到我的答案,如果你有麻煩。 – 2012-08-14 10:36:40

相關問題