
前段時(shí)間,溫老師找我說財(cái)務(wù)處的某老師平日處理大量的Excel,很多都是機(jī)械的重復(fù)勞動(dòng),不勝其煩。和我簡(jiǎn)單說了下需求,看我能不能寫個(gè)程序幫一下忙。
需求簡(jiǎn)述如下:
? ? 一個(gè)多行多列的Excel文檔有一列為“項(xiàng)目代碼”,總共有多行各不相同數(shù)據(jù),而“項(xiàng)目代碼”這列下為無(wú)次序出現(xiàn)的重復(fù)數(shù)據(jù)。需求是將相同的“項(xiàng)目代碼”所在行的數(shù)據(jù)挑選出來(lái),并單獨(dú)生成一個(gè)以此項(xiàng)目代碼命名的sheet,在此sheet中將數(shù)據(jù)按照順序排列。

顯然這個(gè)是通過財(cái)務(wù)處網(wǎng)站導(dǎo)出的Excel,首先想到的是,應(yīng)該多設(shè)計(jì)幾個(gè)接口,直接在服務(wù)端用SQL語(yǔ)句解決這個(gè)問題。但是現(xiàn)狀是沒有設(shè)計(jì)這些功能,那么只能在這個(gè)文件上做文章。那么,首先想到的就是Python,py處理這些簡(jiǎn)單數(shù)據(jù)應(yīng)該是最便捷的。不過之前還沒有做過,需要做一些準(zhǔn)備工作。
首先確定用需要用到處理表格數(shù)據(jù)的模塊,xlrd、xlwt或者pandas,因?yàn)閜andas聽上去比較萌,這里選擇這個(gè),但是比較難受的一點(diǎn)是pandas 沒有中文文檔,有些操作想查詢需要啃英文。
我的思路是這樣的:
? ? 1.首先把Excel文件讀取到內(nèi)存中,但是文件不是固定和單一的,考慮到使用者,較簡(jiǎn)單的方式是讓用戶輸入需要處理的文件的絕對(duì)路徑。
? ? 2.獲取“項(xiàng)目代碼”這列的所有數(shù)據(jù),去重,排序,保存到一個(gè)project_code_list中。
? ? 3.循環(huán)讀取這個(gè)project_code_list中的值,比如讀到“1064801601”這個(gè)值后,遍歷內(nèi)存中的DataFrame,獲取所有項(xiàng)目代碼為“1064801601”的數(shù)據(jù),將其保存在一個(gè)新的DataFrame中。
? ? 4.同時(shí)循環(huán)在源文件里寫入新的sheet(使用project_code來(lái)命名),同時(shí)往這個(gè)sheet里寫入數(shù)據(jù)。
? ? 5.考慮用戶友好,需要寫一定的異常拋出與處理。
接下來(lái)就是編碼部分
思路確實(shí)很簡(jiǎn)單,但是需要編碼實(shí)現(xiàn),以及如何盡量寫得優(yōu)雅,又是另外一回事了。
因?yàn)槭稚线€有其他事要做,所以代碼沒有寫得很規(guī)范,異常處理也沒有寫,瑕疵比較多,但是既然功能實(shí)現(xiàn)了,也就懶得改了。

? ? 沒有做異常處理與用戶提示,假如用戶輸入了不存在的路徑,那么程序會(huì)直接炸掉。所有這些都要注意。

? ? 沒有做異常處理。

? ? 這個(gè)函數(shù)寫得很臃腫,其實(shí)應(yīng)該另外定義一個(gè)handleExcel方法來(lái)專門處理數(shù)據(jù),再用write2Excel來(lái)專門寫入,另外相同的問題也是沒有做異常處理。

最后就是考慮打包的問題,因?yàn)樨?cái)務(wù)處老師辦公室電腦上是肯定沒有Python3環(huán)境和模塊依賴的,最好直接給他一個(gè)exe可執(zhí)行文件。查了資料,這邊使用pyInstaller直接打包。

下面看下運(yùn)行及處理效果


數(shù)據(jù)沒什么問題,該處理的也完成了,哎,就這樣吧。