樊潮 秦娥
摘? 要: 利用最新版Python實(shí)現(xiàn)對(duì)最新版本Excel中數(shù)據(jù)的存取,文章對(duì)該功能的編程及其應(yīng)用進(jìn)行了分析,解決了最新版的Python與最新版的Excel一起使用時(shí)出現(xiàn)的不兼容情況,實(shí)現(xiàn)了對(duì)Excel中的大批量數(shù)據(jù)的處理。對(duì)一些想利用Python來處理Excel數(shù)據(jù)的人,具有一定的幫助。
關(guān)鍵詞: Python; Openpyxl; Excel; Cell; Windows; Office; 數(shù)據(jù)
中圖分類號(hào):TP391? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ?文章編號(hào):1006-8228(2021)04-69-04
Abstract: Using the latest version of Python to access the data in the latest version of Excel, this paper analyzes the programming and application of this function, solves the incompatibility between the latest version of Python and the latest version of Excel, and realizes the processing of large amount of data in Excel. It is helpful for those who want to use Python to process Excel data.
Key words: Python; Openpyxl; Excel; Cell; Windwos; Office; data
0 引言
Python作為現(xiàn)代比較熱門的語言之一,其應(yīng)用在幾乎所有的領(lǐng)域。其處理能力是很強(qiáng)的。微軟出品的Office從推出到廣泛應(yīng)用,早已成為辦公軟件的必需品。Office家族中的Excel電子表格在各行各業(yè)的數(shù)據(jù)存儲(chǔ)和處理上占有重要的地位。對(duì)Excel電子表格數(shù)據(jù)的存取也成為了許多人的日常工作。
隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,各種軟件的更新周期越來越短,Python也如此。Python 1991年主要發(fā)行2.0版本,直到2008年12月才發(fā)行了以3.0為主的版本。而隨著Python的不斷更新,很多以Python2.0版本的庫慢慢遷移到以Python3.0為主的版本中,在以Python3.0為主的版本的更新過程中,如3.1版本中的電子表格處理命令,會(huì)在3.9版本中出錯(cuò)。而在3.9.0b4的版本中能使用的命令會(huì)出錯(cuò),但是沒有提示如何修改,可是在使用3.10.0a1版本時(shí),會(huì)提示警告或報(bào)錯(cuò),有時(shí)報(bào)錯(cuò)并提示如何修改。這說明Python確實(shí)在不斷的優(yōu)化和改進(jìn)。
Excel是很實(shí)用的軟件,它的功能和方便性在不斷地增強(qiáng),它的版本也在不斷地更新。在這個(gè)軟件不斷更新、功能越來越強(qiáng)大的前提下,我們來分析在最新Python環(huán)境中對(duì)最新版本的電子表格的應(yīng)用。
1 Excel數(shù)據(jù)分析
微軟的Office作為現(xiàn)代人們辦公的一種工具,其具有很大的市場,而在這個(gè)工具中有一個(gè)作為數(shù)據(jù)存儲(chǔ),而且方便人們來處理這種數(shù)據(jù)的就是Excel表格。Excel的功能越來越強(qiáng)大起來,其自帶的函數(shù),可以完成人們大部分的工作,其形成的圖表,也是能實(shí)現(xiàn)人們的大部分的要求。但是,Excel中的數(shù)據(jù)如果按自己的一些對(duì)Cell的要求來處理時(shí),就不是那么的得心應(yīng)手了,所以采用一些易用的編程方式來實(shí)現(xiàn)Cell數(shù)據(jù)的存取,是簡單可行的。VBA能夠處理Excel中的數(shù)據(jù),如Office2019版本,“省計(jì)算機(jī)等級(jí)考試上報(bào)數(shù)據(jù)的自動(dòng)生成系統(tǒng)實(shí)現(xiàn)”[1]中對(duì)數(shù)據(jù)的處理,程序運(yùn)行,出現(xiàn)了一些誤差,有一些數(shù)據(jù)處理了,有一些數(shù)據(jù)還保持原樣,沒有被處理,經(jīng)多次程序的修改和驗(yàn)證,不能完全滿足簡單的Cell數(shù)據(jù)處理要求。為了把Excel中的Cell數(shù)據(jù)取出來,我們可以嘗試采用現(xiàn)代最流行的編程工具之一Python來處理Excel中的數(shù)據(jù)。
2 Python分析
Python是“Python is powerful... and fast; plays well with others; runs everywhere; is friendly & easy to learn; is Open.”[2] 它是一個(gè)跨平臺(tái)的計(jì)算機(jī)語言,是一個(gè)高抽象的具有解釋性、編譯性、互動(dòng)性和面向?qū)ο蟮哪_本編程語言。它現(xiàn)在應(yīng)用的領(lǐng)域是越來越多,它可以應(yīng)用于:人工智能、桌面界面開發(fā)、軟件開發(fā)、后端開發(fā)、Web 和 Internet開發(fā)、科學(xué)計(jì)算和統(tǒng)計(jì)、網(wǎng)絡(luò)爬蟲等方面。但是在應(yīng)用于Excel表格處理方面,缺少具體實(shí)現(xiàn)的一些程序和應(yīng)用的分析,在查找了百度和Python網(wǎng)站后,結(jié)合一些Excel的數(shù)據(jù),進(jìn)行了編程和分析,嘗試發(fā)現(xiàn)了如何用Python程序來處理Excel中的數(shù)據(jù)。因?yàn)樵赑ython官方網(wǎng)站中聲明了Python2.7版本在2020年1月1日后不再提供支持和更新,所以就采用了Python-3.10.0a2-amd64最新的版本來進(jìn)行我們的應(yīng)用分析。
3 Python和EXCEL應(yīng)用淺析
Python做為編程語言,本文中采用了最新的版本3.10.0a2,這是一個(gè)測試的版本,也代表是最新的,而不是穩(wěn)定的版本,但是它代表了,以后的版本中會(huì)出現(xiàn)新的功能或新的特性。而采用這個(gè)版本時(shí),是來進(jìn)行對(duì)Excel中的數(shù)據(jù)進(jìn)行操作的,采用的操作環(huán)境是在Windwos10基礎(chǔ)上的PythonWindwos版。在Python中是不能直接對(duì)Excel中數(shù)據(jù)進(jìn)行直接操作的,所以采用了第三方模塊Openpyxl。Openpyxl模塊讓Python程序能讀取和修改Excel電子表格文件[3]。在Python編程環(huán)境中導(dǎo)入對(duì)Excel表格進(jìn)行操作的對(duì)應(yīng)的Openpyxl模塊,就可以利用這個(gè)庫對(duì)Excel表格進(jìn)行操作了。在導(dǎo)入Import Openpyxl模塊時(shí),如果提示“MoudleNotFoundError:No module named ‘openyxl”出錯(cuò),就表明你沒有把Openpyxl這個(gè)第三方模塊導(dǎo)入到當(dāng)前的編程環(huán)境中來,這時(shí)你就要以管理員的權(quán)限來運(yùn)行cmd命令,在打開的cmd窗口中輸入:pip install openpyxl,如果安裝成功,然后在Python的IDLE環(huán)境再次輸入命令:Import Openpyxl,沒有提示,那就表明你已經(jīng)成功安裝了Openpyxl這個(gè)模塊,接下來就你可以引用這個(gè)模塊中對(duì)應(yīng)于Excel操作的函數(shù)了。如圖1(導(dǎo)入需要的第三方模塊)所示。
圖1中所示的命令I(lǐng)mport os,是為了改變當(dāng)前的工作目錄為C盤根目錄,你可以把要處理的Excel文件放在C盤根目錄中,以避免和其他的Excel文件混淆。
接下來,打開要處理的Excel文件,命令格式為:wb=openpyxl.load_workbook('ww.xlsx'),如果你的Excel文件也為ww.xlsx,那么用openpyxl.load_workbook()函數(shù)就可以打開你的Excel文件,把打開的文件傳遞給變量wb。在這打開的過程中,由于測試是采用xls的文件格式,這是早期Excel文件格式,所以打開這個(gè)Excel文件時(shí)會(huì)提示錯(cuò)誤,Openpyxl庫只能打開新版本的Excel,并會(huì)提示你用Xlrd模塊來打開舊版本xls格式的文件,這是要注意的。而在采用Python3.9.0b4版本中,并不會(huì)提示可以采用Xlrd模塊來操作,只會(huì)報(bào)錯(cuò)。所以我們采用最新的Python編程環(huán)境,以及最新的Office2019,并采用Openpyxl模塊來進(jìn)行操作。
打開Excel工作薄,訪問這個(gè)工作薄內(nèi)的工作表。如圖2(Excel中數(shù)據(jù)的表結(jié)構(gòu))所示。
定義一個(gè)變量如:shet1=wb['Sheet1']的形式,就可以訪問ww工作薄中的以Sheet1為表名的工作表了,如果你有二個(gè)以上工作表中的數(shù)據(jù)要處理,你可以命名多個(gè)變更來進(jìn)行,如:shet3=wb['Sheet3']等等,把這個(gè)表傳遞給變量shet1。在你的工作薄中的一個(gè)表有幾列數(shù)據(jù)時(shí),可以先命名變量進(jìn)行簡化處理,可以更方便來訪問和使用,例如:cc="C++"、ja="JAVA"、os="操作系統(tǒng)"、sj="數(shù)據(jù)結(jié)構(gòu)"這樣的形式,可以形成一個(gè)字典的格式,例如:Dicttbk={2:cc,3:ja,4:os,5:sj}操作,在字典的定義中,可以把其中的鍵2、3、4、5理解為對(duì)應(yīng)的某表中的第幾列,方便記憶和使用,其中的cc、ja、os、sj是上面已經(jīng)定義的變量,這樣很方便進(jìn)行一些大數(shù)據(jù)量處理里的循環(huán)操作。如圖3(打開Excel及定義字典)所示。
如果沒有定義如:cc、ja、os、sj這些變量時(shí),在定義字典時(shí)直接使用會(huì)提示錯(cuò)誤信息。定義好這個(gè)字典后,可以遍歷整個(gè)表中的每一列數(shù)據(jù),而每一列數(shù)據(jù)就是在字典中的鍵2、3、4、5。
下面經(jīng)過程序的測試和優(yōu)化,從一個(gè)個(gè)的列訪問的循環(huán),優(yōu)化為定義一個(gè)函數(shù),而通過字典的循環(huán),進(jìn)而訪問到某個(gè)表中的每一列每一行的數(shù)據(jù),這些數(shù)據(jù)取出來后,就可以進(jìn)行任意的操作和使用了。
首先,先定義了一個(gè)自加的變量count,并賦值為1,定義這個(gè)變量是為了后面進(jìn)行循環(huán)時(shí),可以訪問控制每一列的相應(yīng)行的數(shù)據(jù)。這個(gè)變量可以傳遞到函數(shù)InGrades(col,strings)中的col中。定義的這個(gè)通用函數(shù)是InGrades(col,strings),這個(gè)函數(shù)實(shí)現(xiàn)的功能,就是現(xiàn)在通過Cell中的shet3.cell特性,調(diào)用row和column參數(shù)來訪問每個(gè)單元格,以取出表‘Sheet3中的一個(gè)CELL的數(shù)據(jù)與‘Sheet1中列的數(shù)據(jù)進(jìn)行比較,如果符合條件就填入到‘Sheet1中相應(yīng)列的相應(yīng)行的Cell。如下代碼所示。
def InGrades(col, strings):
for rownum3 in range(2,shet3.max_row + 2): #調(diào)用
shet3.max_row特性來每一列的長度控制循環(huán)次數(shù)加2
shet3Name=shet3.cell(row=rownum3,column=1).value
#從Sheet3表中取一個(gè)名字
shet3val=shet3.cell(row=rownum3,column=col).value
#從Sheet3表中取第幾列成績
if shet3val != "/":? ? ? ? #判斷如果不為'/'進(jìn)行操作
for rownum1 in range(2,shet1.max_row+2):
shet1Name=shet1.cell(row=rownum1,column=5)
.value #從Sheet1表中取一個(gè)名字
shet1val =shet1.cell(row=rownum1,column=4)
.value? #從Sheet1表中取對(duì)應(yīng)科目
if (shet1Name==shet3Name) and (shet1val==
strings):? #二表中名字相同且對(duì)應(yīng)科目
shet1.cell(row=rownum1,column=18).value=
shet3val #就把這個(gè)成績填入
這個(gè)通用函數(shù)的定義,優(yōu)化了程序代碼的長度,也清晰地實(shí)現(xiàn)了所需要的功能。
以下通過函數(shù)的調(diào)用,來實(shí)現(xiàn)Excel中的每個(gè)表中的每個(gè)Cell數(shù)據(jù)的取出和更改??赏ㄟ^一個(gè)循環(huán)來實(shí)現(xiàn),這個(gè)循環(huán)的控制就是前面準(zhǔn)備工作中所定義的字典。而在這個(gè)循環(huán)中,二個(gè)循環(huán)變量:key、value是不可或缺少的,否則不能正確的把值取出,以及不能正確的把值傳遞到函數(shù)中去的,這是要特別注意的。代碼如下。
If __name__==‘__main__:? #這段代碼確保塊中的語句
只有當(dāng)程序自己運(yùn)行時(shí)才被執(zhí)行[4],而不是在程序?qū)肓硪粋€(gè)程序時(shí)才會(huì)執(zhí)行。
for key,value in Dicttbk.items():? ?#從字典中取出鍵值和
對(duì)應(yīng)鍵值的數(shù)據(jù),一定要二個(gè)參數(shù),
#如果只有一個(gè)value,取出value數(shù)值為原組數(shù)據(jù)(2:cc)
#不能使用到下面的函數(shù)調(diào)用參數(shù)中
count+=1? #從成績中第二列開始,因?yàn)榈谝涣袨樾彰?/p>
#print(count)這個(gè)可用來檢測你的數(shù)據(jù)是不是有這么多
#time.sleep(2)延遲時(shí)間來檢測你的結(jié)果,隨時(shí)可按ctrl+c中
斷,要先導(dǎo)入time庫,#time模塊提供存取與轉(zhuǎn)換時(shí)間的函數(shù)[5],sleep()將目前進(jìn)程置入睡眠狀態(tài),睡眠時(shí)間為秒。
InGrades(count,value)
至此,已把Excel中的數(shù)據(jù)取出,并進(jìn)行了相應(yīng)的操作,如果想對(duì)數(shù)據(jù)進(jìn)行其他的操作,如刪除、和其他CELL的數(shù)據(jù)進(jìn)行比較等,都是可以的。
最后,要保存所做的更改,這是重要的一步,也是最簡單的一步,只用一條命令:wb.save('new.xlsx') #另存為new.xlsx,This operation will overwrite existing files without warning[6]。
這個(gè)命令把更改后的數(shù)據(jù)保存為new.xlsx文件,保存到C盤根目錄中,其結(jié)構(gòu)還是和ww.xlsx原來一樣,只是其中相應(yīng)的數(shù)據(jù)已經(jīng)得到更改,滿足了相應(yīng)需求。
4 結(jié)束語
本文分析了Python最新版對(duì)Excel中數(shù)據(jù)存取的功能編程及應(yīng)用,對(duì)一些想利用Python來處理Excel數(shù)據(jù)的同行,會(huì)比較有用。文中的代碼敲入到最新版Python3.10.0a2的IDLE環(huán)境中,保存為一個(gè)py文件,把需要處理的Excel文件以文中圖2所示的格式保存,然后拷貝到C盤根目錄,并改名為“ww.xlsx”文件 就可以運(yùn)行這個(gè)程序,以自動(dòng)化的方式來處理大型Excel數(shù)據(jù),簡化了人們大部分日常Excel數(shù)據(jù)處理的工作。但是在處理這些數(shù)據(jù)時(shí),本文提到的一些需注意的方面也需重視,如文件的格式、版本的不同等。在處理自己的文件時(shí),還需做好備份,以防止文件修改后,沒有達(dá)到要求,而發(fā)生數(shù)據(jù)不可挽回。Python對(duì)Excel數(shù)據(jù)的操作,以及Python各種強(qiáng)大功能的應(yīng)用,還有很多應(yīng)用需要嘗試和分析。本文淺析了Python對(duì)Excel中的數(shù)據(jù)的一些應(yīng)用,未來需要不斷的學(xué)習(xí),不斷的提升Python相關(guān)知識(shí),以待更好地實(shí)現(xiàn)更多的功能應(yīng)用。
參考文獻(xiàn)(References):
[1] 樊潮.省計(jì)算機(jī)等級(jí)考試上報(bào)數(shù)據(jù)的自動(dòng)生成系統(tǒng)實(shí)現(xiàn)[J].計(jì)算機(jī)時(shí)代,2012.7:37-39
[2] 官網(wǎng)首頁[EB/OL].https://www.python.org/about/
[3] [美]AI Sweigart著,王海鵬譯.Python編程快速上手---讓繁瑣工作自動(dòng)化[M].人民郵電出版社,2016.
[4] [澳]阿米特·薩哈(Amit Saha)著,許楊毅,劉旭華 譯.Python數(shù)學(xué)編程[M].人民郵電出版社,2020.
[5] 王英英著.Python3.8從入門到精通(視頻教學(xué)版)[M].清華大學(xué)出版社,2020.
[6] Warning[EB/OL].https://openpyxl.readthedocs.io/en/stable/tutorial.html#data-storage