摘要:特別注意當用模式載入時,跟都是對象。可以使用載入已經(jīng)存在的表。我們的目的是從源表中提取信息并批量復制到目標表中,所以我們首先定義一些變量。最后保存目標就可以了。
現(xiàn)代生活中,我們很難不與excel表打交道,excel表有著易學易用的優(yōu)點,只是當表中數(shù)據(jù)量很大,我們又需要從其他表冊中復制粘貼一些數(shù)據(jù)(比如身份證號)的時候,我們會越來越倦怠,畢竟我們不是機器,沒法長時間做某種重復性的枯燥操作。想象這樣一個場景,我們有個幾千行的表要填,需要根據(jù)姓名輸入其對應的身份證號,但之前我們已經(jīng)做過一個類似的表,同樣的一些人的姓名跟身份證號是完整的,那么我們就需要通過一個個查找姓名,然后把身份證號碼復制到我們當前要做的表里去。
當我日復一日重復著這些操作的時候,我都很想有一個自動化工具來完成這種操作,把做為人的我從這種非人的折磨里解脫出來,最后還是想到了python,因為這樣我能很少的關(guān)注語言內(nèi)部的一些細節(jié),從而專注于解決這個問題。
python有很多專門處理excel的第三方庫,我選擇了openpyxl,因為支持微軟最新excel的格式xlsx,其官網(wǎng)地址為https://openpyxl.readthedocs.io/en/latest/index.html,官網(wǎng)上的教程很全面,有其他需求的可以好好研究一番。
其安裝命令為 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ù)量很大的時候,這里我們可以使用openpyxl的read_only模式 載入源表,這樣做的好處是不用把整個表都載入內(nèi)存 """ wb1=load_workbook(filename="lalala.xlsx",read_only=True) #創(chuàng)建workbook wb2 = Workbook()
第二步就是操作excel表中的sheet了,通過Workbook()創(chuàng)建的workbook默認活動的sheet名稱為Sheet,可以通過python交互命令行進行驗證。
#獲取活動的sheet ws = wb.active #設置sheet的標題 ws.title = "range names" #創(chuàng)建以Pi為標題的sheet ws = wb.create_sheet(title="Pi") #獲取標題為Sheet1的sheet ws=wb["Sheet1"]
第三步就是操作sheet中的cell了。需要注意的是,一個cell的位置由它所在的列跟行共同決定,比如一個cell,它在A列,并在第三行,就可以通過ws["A3"] 來訪問。cell還具有row跟column屬性,cell.row跟cell.column的數(shù)據(jù)類型如下圖所示。
特別注意當用read_only模式載入workbook時,cell.row跟cell.column都是int對象。cell.column記錄的是cell所在列離第一列的偏移數(shù),并非workbook中真正代表列數(shù)的大寫字母,比如“A”。
#獲取第一行,數(shù)據(jù)類型為tuple row=ws[1] #獲取A列,數(shù)據(jù)類型為tuple column=ws["A"] #設置F5的值 ws["F5"]="sfs" #設置cell的值 ws["F5"].value="hello" #獲得cell的行數(shù) m=ws["F5"].row #獲得cell的列數(shù) n=ws["F5"].column #獲得特定區(qū)域的值,比如從F5到F30,數(shù)據(jù)類型為tuple k=ws["F5":"F30"] #獲得特定區(qū)域的值,比如從F5到G30,數(shù)據(jù)類型為tuple j=ws["F5":"G30"] #獲取sheet的最大行數(shù) row_count=ws.max_row #獲取sheet的最大列數(shù) column_count=ws.max_column
最后一步把更改保存,這里要注意,當要保存的表在別的軟件(microsoft office或者wps)中打開時,保存操作會報錯。
wb1.save("empty_book.xlsx") wb2.save(filename="other_book.xlsx")實現(xiàn)需求
新建一個get_info_from_excel.py文件,用你習慣的編輯器來編輯,首先需要引入openpyxl庫中的load_workbook模塊。可以使用load_workbook載入已經(jīng)存在的excel表。
from openpyxl import load_workbook
我們的目的是從源excel表中提取信息并批量復制到目標excel表中,所以我們首先定義一些變量。
#源表名稱 source_file_name="lalala.xlsx" #目標表名稱 target_file_name="lelele.xlsx" #源表中要提取信息的sheet source_sheet_name="Sheet2" #目標表中要批量復制信息的sheet target_sheet_name="Sheet2" #源表中的標題行在哪一行 source_header_row=3 #目標表中的標題行在哪一行 target_header_row=2 #源表中要根據(jù)哪一列數(shù)據(jù)提取信息,根據(jù)源表標題行 source_cell_condition="姓名" #目標表中要根據(jù)哪一列數(shù)據(jù)復制信息,根據(jù)目標表標題行 target_cell_condition="姓名" #源表中要提取信息的列 source_cell_filled="身份證號" #目標表中要復制信息的列 target_cell_filling="身份證號"
將源表跟目標表載入內(nèi)存,方便下一步操作這兩個表。
#在源表數(shù)據(jù)量很大的時候,這里我們可以使用openpyxl的read_only模式載入源表,這樣做的好處是不用把整個表都載入內(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名稱跟標題行數(shù)獲取源表跟目標表的標題行:
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]
操作源表標題行,獲取我們想要的信息:
""" openpyxl用read_only模式載入workbook時,獲取到的cell不是一般的cell, 經(jīng)過測試cell.column變成偏移了幾列的整數(shù),所以這里我們定義一個函數(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 #初始化兩個變量,分別是源表的條件列,要復制的列 source_condition_column="" source_filled_column="" """ 循環(huán)源表的標題列,得到條件列的位置以及要復制列的位置, 再通過內(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)
操作目標表標題行,獲取我們想要的信息:
#初始化兩個變量,分別是目標表的條件列,要粘貼的列 target_condition_column="" target_filling_column="" """ 循環(huán)目標表的標題列,得到條件列的位置以及要粘貼列的位置, 再通過內(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ù)據(jù)的時候了。
""" 循環(huán)目標表的條件列,內(nèi)部嵌套循環(huán)源表的條件列,一旦目標表條件列的某個cell 與源表條件列某個cell的值相同,我們就把源表要復制列的同一行的cell的值 賦予目標表要粘貼列的同一行的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
最后保存目標workbook就可以了。
wb_w.save(target_file_name)
注意:如果excel中標題行有合并居中的話,腳本會報錯,一種辦法就是去掉合并居中;另一種就是在原標題行下再插入一行新的行再把原標題行的內(nèi)容粘貼進去,用插入的這一行作為標題行。
[歡迎瀏覽我的個人博客,https://diwugebingren.github.io
](https://diwugebingren.github.io)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43549.html
摘要:對象也有和屬性提供該單元格的位置信息。讀取對象的屬性一個完整的案例代碼如下讀取文檔返回一個對象,有點類似于文件對象在工作薄中取得工作表返回一個列表,存儲表中所有的工作表返回一個對象,返回當前的活動表獲取工作表中,單元格的信息的屬性 Excel 是 Windows 環(huán)境下流行的、強大的電子表格應用。openpyxl 模塊讓 Python 程序能讀取和修改 Excel 電子表格文件。例如,...
摘要:目錄和基本操作用模塊打開文檔,查看所有表通過名稱獲取表格獲取活動表獲取表格的尺寸獲取單元格中的數(shù)據(jù)獲取單元格的行列坐標獲取區(qū)間內(nèi)的數(shù)據(jù)獲取指定區(qū)間的數(shù)據(jù)獲取指定行列的數(shù)據(jù)按行列獲取值獲取活動表的行列數(shù)操作創(chuàng)建新的修改單 ...
摘要:總結(jié)整個過程的難點在于獲取文件對象,從數(shù)據(jù)中取值然后在按取出,這樣我們就可以從后臺上傳文件,然后進行批量導入數(shù)據(jù)庫,其他數(shù)據(jù)格式只需要改和中的數(shù)據(jù)字段就可以 第一篇(從django后臺解析excel數(shù)據(jù)批量導入數(shù)據(jù)庫) 文章會在github中持續(xù)更新 作者: knthony github 聯(lián)系我 1.django 如何從后臺上傳excel中批量解析數(shù)據(jù) 要從django后臺導入...
摘要:爬取的數(shù)據(jù)存入表格分析要爬取的內(nèi)容的網(wǎng)頁結(jié)構(gòu)是庫寫入表所用讀取表所用通過解析文檔為用戶提供需要抓取的數(shù)據(jù)改變標準輸出的默認編碼我們開始利用來獲取網(wǎng)頁并利用解析網(wǎng)頁返回的是狀態(tài)碼,加上以字節(jié)形式二進制返回數(shù)據(jù)。 爬取的數(shù)據(jù)存入Excel表格 分析要爬取的內(nèi)容的網(wǎng)頁結(jié)構(gòu): showImg(https://segmentfault.com/img/bVbsFt6?w=1644&h=1012)...
摘要:新型數(shù)據(jù)類型中存儲系列數(shù)據(jù),比較常見的數(shù)據(jù)類型有,除此之外,還有數(shù)據(jù)類型元組的只能通過訪問,模塊的子類不僅可以使用的訪問,還可以通過的進行訪問。可以將理解為中的結(jié)構(gòu),其首先將各個命名,然后對每個賦予數(shù)據(jù)。 namedtuple新型數(shù)據(jù)類型 Python中存儲系列數(shù)據(jù),比較常見的數(shù)據(jù)類型有l(wèi)ist,除此之外,還有tuple數(shù)據(jù)類型.tuple元組的item只能通過index訪問,coll...
閱讀 1435·2021-11-25 09:43
閱讀 2041·2021-07-26 23:38
閱讀 748·2019-08-30 15:53
閱讀 2286·2019-08-30 15:43
閱讀 1176·2019-08-29 18:40
閱讀 1975·2019-08-26 13:28
閱讀 1982·2019-08-23 18:20
閱讀 550·2019-08-23 15:07