国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用python庫(kù)openpyxl操作excel,從源excel表中提取信息復(fù)制到目標(biāo)excel表中

gaosboy / 4358人閱讀

摘要:特別注意當(dāng)用模式載入時(shí),跟都是對(duì)象??梢允褂幂d入已經(jīng)存在的表。我們的目的是從源表中提取信息并批量復(fù)制到目標(biāo)表中,所以我們首先定義一些變量。最后保存目標(biāo)就可以了。

現(xiàn)代生活中,我們很難不與excel表打交道,excel表有著易學(xué)易用的優(yōu)點(diǎn),只是當(dāng)表中數(shù)據(jù)量很大,我們又需要從其他表冊(cè)中復(fù)制粘貼一些數(shù)據(jù)(比如身份證號(hào))的時(shí)候,我們會(huì)越來(lái)越倦怠,畢竟我們不是機(jī)器,沒(méi)法長(zhǎng)時(shí)間做某種重復(fù)性的枯燥操作。想象這樣一個(gè)場(chǎng)景,我們有個(gè)幾千行的表要填,需要根據(jù)姓名輸入其對(duì)應(yīng)的身份證號(hào),但之前我們已經(jīng)做過(guò)一個(gè)類似的表,同樣的一些人的姓名跟身份證號(hào)是完整的,那么我們就需要通過(guò)一個(gè)個(gè)查找姓名,然后把身份證號(hào)碼復(fù)制到我們當(dāng)前要做的表里去。

當(dāng)我日復(fù)一日重復(fù)著這些操作的時(shí)候,我都很想有一個(gè)自動(dòng)化工具來(lái)完成這種操作,把做為人的我從這種非人的折磨里解脫出來(lái),最后還是想到了python,因?yàn)檫@樣我能很少的關(guān)注語(yǔ)言內(nèi)部的一些細(xì)節(jié),從而專注于解決這個(gè)問(wèn)題。

python有很多專門處理excel的第三方庫(kù),我選擇了openpyxl,因?yàn)橹С治④涀钚耬xcel的格式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ù)量很大的時(shí)候,這里我們可以使用openpyxl的read_only模式
載入源表,這樣做的好處是不用把整個(gè)表都載入內(nèi)存
"""
wb1=load_workbook(filename="lalala.xlsx",read_only=True)
#創(chuàng)建workbook
wb2 = Workbook()

第二步就是操作excel表中的sheet了,通過(guò)Workbook()創(chuàng)建的workbook默認(rèn)活動(dòng)的sheet名稱為Sheet,可以通過(guò)python交互命令行進(jìn)行驗(yàn)證。

#獲取活動(dòng)的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列,并在第三行,就可以通過(guò)ws["A3"] 來(lái)訪問(wèn)。cell還具有row跟column屬性,cell.row跟cell.column的數(shù)據(jù)類型如下圖所示。

特別注意當(dāng)用read_only模式載入workbook時(shí),cell.row跟cell.column都是int對(duì)象。cell.column記錄的是cell所在列離第一列的偏移數(shù),并非workbook中真正代表列數(shù)的大寫字母,比如“A”。

#獲取第一行,數(shù)據(jù)類型為tuple
row=ws[1]
#獲取A列,數(shù)據(jù)類型為tuple
column=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ù)類型為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

最后一步把更改保存,這里要注意,當(dāng)要保存的表在別的軟件(microsoft office或者wps)中打開時(shí),保存操作會(huì)報(bào)錯(cuò)。

wb1.save("empty_book.xlsx")
wb2.save(filename="other_book.xlsx")
實(shí)現(xiàn)需求

新建一個(gè)get_info_from_excel.py文件,用你習(xí)慣的編輯器來(lái)編輯,首先需要引入openpyxl庫(kù)中的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="身份證號(hào)"
#目標(biāo)表中要復(fù)制信息的列
target_cell_filling="身份證號(hào)"

將源表跟目標(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)過(guò)測(cè)試cell.column變成偏移了幾列的整數(shù),所以這里我們定義一個(gè)函數(shù)來(lái)處理,
把整數(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ù)制列的位置,
再通過(guò)內(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)題列,得到條件列的位置以及要粘貼列的位置,
再通過(guò)內(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)

注意:如果excel中標(biāo)題行有合并居中的話,腳本會(huì)報(bào)錯(cuò),一種辦法就是去掉合并居中;另一種就是在原標(biāo)題行下再插入一行新的行再把原標(biāo)題行的內(nèi)容粘貼進(jìn)去,用插入的這一行作為標(biāo)題行。

[歡迎瀏覽我的個(gè)人博客,https://diwugebingren.github.io
](https://diwugebingren.github.io)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43549.html

相關(guān)文章

  • python3與Excel的完美結(jié)合

    摘要:對(duì)象也有和屬性提供該單元格的位置信息。讀取對(duì)象的屬性一個(gè)完整的案例代碼如下讀取文檔返回一個(gè)對(duì)象,有點(diǎn)類似于文件對(duì)象在工作薄中取得工作表返回一個(gè)列表,存儲(chǔ)表中所有的工作表返回一個(gè)對(duì)象,返回當(dāng)前的活動(dòng)表獲取工作表中,單元格的信息的屬性 Excel 是 Windows 環(huán)境下流行的、強(qiáng)大的電子表格應(yīng)用。openpyxl 模塊讓 Python 程序能讀取和修改 Excel 電子表格文件。例如,...

    enrecul101 評(píng)論0 收藏0
  • python實(shí)現(xiàn)——處理Excel表格(超詳細(xì))

    摘要:目錄和基本操作用模塊打開文檔,查看所有表通過(guò)名稱獲取表格獲取活動(dòng)表獲取表格的尺寸獲取單元格中的數(shù)據(jù)獲取單元格的行列坐標(biāo)獲取區(qū)間內(nèi)的數(shù)據(jù)獲取指定區(qū)間的數(shù)據(jù)獲取指定行列的數(shù)據(jù)按行列獲取值獲取活動(dòng)表的行列數(shù)操作創(chuàng)建新的修改單 ...

    Richard_Gao 評(píng)論0 收藏0
  • 第一篇(從django后臺(tái)解析excel數(shù)據(jù)批量導(dǎo)入數(shù)據(jù)庫(kù))

    摘要:總結(jié)整個(gè)過(guò)程的難點(diǎn)在于獲取文件對(duì)象,從數(shù)據(jù)中取值然后在按取出,這樣我們就可以從后臺(tái)上傳文件,然后進(jìn)行批量導(dǎo)入數(shù)據(jù)庫(kù),其他數(shù)據(jù)格式只需要改和中的數(shù)據(jù)字段就可以 第一篇(從django后臺(tái)解析excel數(shù)據(jù)批量導(dǎo)入數(shù)據(jù)庫(kù)) 文章會(huì)在github中持續(xù)更新 作者: knthony github 聯(lián)系我 1.django 如何從后臺(tái)上傳excel中批量解析數(shù)據(jù) 要從django后臺(tái)導(dǎo)入...

    2i18ns 評(píng)論0 收藏0
  • 爬蟲小demo

    摘要:爬取的數(shù)據(jù)存入表格分析要爬取的內(nèi)容的網(wǎng)頁(yè)結(jié)構(gòu)是庫(kù)寫入表所用讀取表所用通過(guò)解析文檔為用戶提供需要抓取的數(shù)據(jù)改變標(biāo)準(zhǔn)輸出的默認(rèn)編碼我們開始利用來(lái)獲取網(wǎng)頁(yè)并利用解析網(wǎng)頁(yè)返回的是狀態(tài)碼,加上以字節(jié)形式二進(jìn)制返回?cái)?shù)據(jù)。 爬取的數(shù)據(jù)存入Excel表格 分析要爬取的內(nèi)容的網(wǎng)頁(yè)結(jié)構(gòu): showImg(https://segmentfault.com/img/bVbsFt6?w=1644&h=1012)...

    pf_miles 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃----excel操作

    摘要:新型數(shù)據(jù)類型中存儲(chǔ)系列數(shù)據(jù),比較常見(jiàn)的數(shù)據(jù)類型有,除此之外,還有數(shù)據(jù)類型元組的只能通過(guò)訪問(wèn),模塊的子類不僅可以使用的訪問(wèn),還可以通過(guò)的進(jìn)行訪問(wèn)??梢詫⒗斫鉃橹械慕Y(jié)構(gòu),其首先將各個(gè)命名,然后對(duì)每個(gè)賦予數(shù)據(jù)。 namedtuple新型數(shù)據(jù)類型 Python中存儲(chǔ)系列數(shù)據(jù),比較常見(jiàn)的數(shù)據(jù)類型有l(wèi)ist,除此之外,還有tuple數(shù)據(jù)類型.tuple元組的item只能通過(guò)index訪問(wèn),coll...

    cpupro 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<