樊潮 秦娥



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