您好,登錄后才能下訂單哦!
了解怎么用python庫openpyxl操作excel,從源excel表中提取信息復(fù)制到目標(biāo)excel表中?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
現(xiàn)代生活中,我們很難不與excel表打交道,excel表有著易學(xué)易用的優(yōu)點(diǎn),只是當(dāng)表中數(shù)據(jù)量很大,我們又需要從其他表冊中復(fù)制粘貼一些數(shù)據(jù)(比如身份證號)的時(shí)候,我們會越來越倦怠,畢竟我們不是機(jī)器,沒法長時(shí)間做某種重復(fù)性的枯燥操作。想象這樣一個(gè)場景,我們有個(gè)幾千行的表要填,需要根據(jù)姓名輸入其對應(yīng)的身份證號,但之前我們已經(jīng)做過一個(gè)類似的表,同樣的一些人的姓名跟身份證號是完整的,那么我們就需要通過一個(gè)個(gè)查找姓名,然后把身份證號碼復(fù)制到我們當(dāng)前要做的表里去。
當(dāng)我日復(fù)一日重復(fù)著這些操作的時(shí)候,我都很想有一個(gè)自動化工具來完成這種操作,把做為人的我從這種非人的折磨里解脫出來,最后還是想到了python,因?yàn)檫@樣我能很少的關(guān)注語言內(nèi)部的一些細(xì)節(jié),從而專注于解決這個(gè)問題。
其安裝命令為 pip install openpyxl(在線安裝)或者 easy_install openpyxl。
openpyxl的操作可以分四步,第一步載入現(xiàn)有workbook或者創(chuàng)建workbook到內(nèi)存,分別使用
from openpyxl import load_workbook from openpyxl import Workbook #載入現(xiàn)有workbook中 wb1=load_workbook('lalala.xlsx') """ 在源表數(shù)據(jù)量很大的時(shí)候,這里我們可以使用openpyxl的read_only模式 載入源表,這樣做的好處是不用把整個(gè)表都載入內(nèi)存 """ wb1=load_workbook(filename='lalala.xlsx',read_only=True) #創(chuàng)建workbook wb2 = Workbook()
第二步就是操作excel表中的sheet了,通過Workbook()創(chuàng)建的workbook默認(rèn)活動的sheet名稱為Sheet,可以通過python交互命令行進(jìn)行驗(yàn)證。
#獲取活動的sheet ws = wb.active #設(shè)置sheet的標(biāo)題 ws.title = "range names" #創(chuàng)建以Pi為標(biāo)題的sheet ws = wb.create_sheet(title="Pi") #獲取標(biāo)題為Sheet1的sheet ws=wb['Sheet1']
第三步就是操作sheet中的cell了。需要注意的是,一個(gè)cell的位置由它所在的列跟行共同決定,比如一個(gè)cell,它在A列,并在第三行,就可以通過ws['A3']來訪問。cell還具有row跟column屬性,cell.row跟cell.column的數(shù)據(jù)類型如下圖所示。
特別注意當(dāng)用read_only模式載入workbook時(shí),cell.row跟cell.column都是int對象。cell.column記錄的是cell所在列離第一列的偏移數(shù),并非workbook中真正代表列數(shù)的大寫字母,比如“A”。
#獲取第一行,數(shù)據(jù)類型為tuplerow=ws[1]#獲取A列,數(shù)據(jù)類型為tuplecolumn=ws['A']#設(shè)置F5的值ws['F5']='sfs'#設(shè)置cell的值ws['F5'].value='hello'#獲得cell的行數(shù)m=ws['F5'].row#獲得cell的列數(shù)n=ws['F5'].column#獲得特定區(qū)域的值,比如從F5到F30,數(shù)據(jù)類型為tuplek=ws['F5':'F30']#獲得特定區(qū)域的值,比如從F5到G30,數(shù)據(jù)類型為tuplej=ws['F5':'G30']#獲取sheet的最大行數(shù)row_count=ws.max_row#獲取sheet的最大列數(shù)column_count=ws.max_column
最后一步把更改保存,這里要注意,當(dāng)要保存的表在別的軟件(microsoft office或者wps)中打開時(shí),保存操作會報(bào)錯(cuò)
wb1.save('empty_book.xlsx') wb2.save(filename='other_book.xlsx')
實(shí)現(xiàn)需求
新建一個(gè)get_info_from_excel.py文件,用你習(xí)慣的編輯器來編輯,首先需要引入openpyxl庫中的load_workbook模塊。可以使用load_workbook載入已經(jīng)存在的excel表。
from openpyxl import load_workbook
我們的目的是從源excel表中提取信息并批量復(fù)制到目標(biāo)excel表中,所以我們首先定義一些變量。
#源表名稱 source_file_name='lalala.xlsx' #目標(biāo)表名稱 target_file_name='lelele.xlsx' #源表中要提取信息的sheet source_sheet_name='Sheet2' #目標(biāo)表中要批量復(fù)制信息的sheet target_sheet_name='Sheet2' #源表中的標(biāo)題行在哪一行 source_header_row=3 #目標(biāo)表中的標(biāo)題行在哪一行 target_header_row=2 #源表中要根據(jù)哪一列數(shù)據(jù)提取信息,根據(jù)源表標(biāo)題行 source_cell_condition='姓名' #目標(biāo)表中要根據(jù)哪一列數(shù)據(jù)復(fù)制信息,根據(jù)目標(biāo)表標(biāo)題行 target_cell_condition='姓名' #源表中要提取信息的列 source_cell_filled='身份證號' #目標(biāo)表中要復(fù)制信息的列 target_cell_filling='身份證號'
將源表跟目標(biāo)表載入內(nèi)存,方便下一步操作這兩個(gè)表。
#在源表數(shù)據(jù)量很大的時(shí)候,這里我們可以使用openpyxl的read_only模式載入源表,這樣做的好處是不用把整個(gè)表都載入內(nèi)存 #wb_w=load_workbook(source_file_name) wb_r=load_workbook(filename=source_file_name,read_only=True) wb_w=load_workbook(target_file_name)
從前面已經(jīng)定義的sheet名稱跟標(biāo)題行數(shù)獲取源表跟目標(biāo)表的標(biāo)題行:
ws_r=wb_r[source_sheet_name] ws_w=wb_w[target_sheet_name] header_row_r=ws_r[source_header_row] header_row_w=ws_w[target_header_row]
操作源表標(biāo)題行,獲取我們想要的信息:
""" openpyxl用read_only模式載入workbook時(shí),獲取到的cell不是一般的cell, 經(jīng)過測試cell.column變成偏移了幾列的整數(shù),所以這里我們定義一個(gè)函數(shù)來處理, 把整數(shù)轉(zhuǎn)換成excel真正的列數(shù),比如“A”、“BB”等。 """ def readOnly_offsetColunmNumber_toRealColumn(number): column='' if number<=26: column=chr(number+ord('A')-1) else: number1=number//26 column1=chr(number1+ord('A')-1) number2=number%26 column2=chr(number2+ord('A')-1) column=column1+column2 return column #初始化兩個(gè)變量,分別是源表的條件列,要復(fù)制的列 source_condition_column='' source_filled_column='' """ 循環(huán)源表的標(biāo)題列,得到條件列的位置以及要復(fù)制列的位置, 再通過內(nèi)嵌的循環(huán)得到條件列的最大行數(shù) """ for cell in header_row_r: if cell.value==source_cell_condition: source_condition_column=readOnly_offsetColunmNumber_toRealColumn(cell.column) elif cell.value==source_cell_filled: source_filled_column=readOnly_offsetColunmNumber_toRealColumn(cell.column)
操作目標(biāo)表標(biāo)題行,獲取我們想要的信息:
#初始化兩個(gè)變量,分別是目標(biāo)表的條件列,要粘貼的列target_condition_column=''target_filling_column=''""" 循環(huán)目標(biāo)表的標(biāo)題列,得到條件列的位置以及要粘貼列的位置, 再通過內(nèi)嵌的循環(huán)得到條件列的最大行數(shù) """for cell_j in header_row_w: if cell_j.value==target_cell_condition: target_condition_column=cell_j.column elif cell_j.value==target_cell_filling: target_filling_column=cell_j.column
現(xiàn)在我們已經(jīng)得到所有需要的信息,該到實(shí)際粘貼數(shù)據(jù)的時(shí)候了。
""" 循環(huán)目標(biāo)表的條件列,內(nèi)部嵌套循環(huán)源表的條件列,一旦目標(biāo)表?xiàng)l件列的某個(gè)cell 與源表?xiàng)l件列某個(gè)cell的值相同,我們就把源表要復(fù)制列的同一行的cell的值 賦予目標(biāo)表要粘貼列的同一行的cell。 """ for cell_m in ws_w[target_condition_column+str(target_header_row+1):target_condition_column+str(ws_w.max_row)]: for cell_n in ws_r[source_condition_column+str(source_header_row+1):source_condition_column+str(ws_r.max_row)]: if cell_m[0].value==cell_n[0].value: ws_w[target_filling_column+str(cell_m[0].row)].value=ws_r[source_filled_column+str(cell_n[0].row)].value
最后保存目標(biāo)workbook就可以了。
wb_w.save(target_file_name)
感謝各位的閱讀!看完上述內(nèi)容,你們對怎么用python庫openpyxl操作excel,從源excel表中提取信息復(fù)制到目標(biāo)excel表中大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。