最近的工作遇到一個(gè)需求,整理多個(gè)相同格式但是不標(biāo)準(zhǔn)的Excel表格,最終匯總成一個(gè)Excel表格,并進(jìn)行數(shù)據(jù)透視分析。
表格內(nèi)涉及到合并的單元格,不同表格表頭位置有偏差等問題。目標(biāo)是將所有表格內(nèi)容相同表頭內(nèi)容統(tǒng)計(jì)到一個(gè)表內(nèi)。由于Excel表格內(nèi)容數(shù)據(jù)量巨大,如果使用人力的手段,工作量巨大,并且容易出錯(cuò)(預(yù)估工作量3天)。所以決定使用Python對(duì)Excel進(jìn)行自動(dòng)處理,實(shí)現(xiàn)一鍵導(dǎo)出目標(biāo)Excel的目的。
大致步驟:Python學(xué)習(xí)交流群:1004391443
1.安裝Python3,pip工具環(huán)境
2.安裝xlrd和xlwt
3.讀取所有源Excel文件
4.將讀取到的Excel信息組織到新的Excel對(duì)象中
5.數(shù)據(jù)緩存和分析
6.向新Excel對(duì)象中追加分析結(jié)果
7.將新Excel對(duì)象保存為目標(biāo)輸出文件(最終想要的文件)
1.對(duì)于Python環(huán)境的安裝本文不做說明。
2.安裝Python擴(kuò)展包有不同的方式,這里使用pip命令安裝xlrd和xlwt。
在Windows下,打開命令提示符(控制臺(tái)),cd python的安裝路徑下Scripts文件夾下(在這里有pip命令執(zhí)行工具)?;蛘邔⒃撀窂教砑拥较到y(tǒng)環(huán)境變量。
xlrd:讀取Excel的擴(kuò)展包
執(zhí)行:pip install xlrd
xlwt:寫入Excel的擴(kuò)展包
執(zhí)行:pip install xlwt
隨便寫一個(gè)py文件寫入import xlrd, xlwt 執(zhí)行該文件不出錯(cuò)說明安裝成功。
或者打開python自帶的編輯器進(jìn)行輸入測試。
3.具體代碼如下
# -*- coding: utf-8 -*-import xlrdimport xlwtimport sysdef read(file_list): # 創(chuàng)建新的workbook out_work_book = xlwt.Workbook(encoding = 'utf-8') # 為了將多個(gè)文件的相同表頭的sheet和并到一個(gè)sheet內(nèi),定義新sheet寫入的行號(hào)位置 out_work_book_rows = [0,0] # 取得傳入的文件列表 (第一個(gè)參數(shù)為腳本名字) for file_name in file_list[1:]: # 打開文件 workbook = xlrd.open_workbook(file_name) # 取得當(dāng)前文檔的sheet列表 sheet_names = workbook.sheet_names() for sheet_idx in range(len(sheet_names)): sheet_name = sheet_names[sheet_idx] # sheet = workbook.sheet_by_index(sheet_idx) sheet = workbook.sheet_by_name(sheet_name) # sheet.row_values(n) 獲取整行數(shù)據(jù) # sheet.col_values(n) 獲取整列數(shù)據(jù) # 獲取行數(shù) rows_count = sheet.nrows # 獲取列數(shù) cols_count = sheet.ncols # 存儲(chǔ)寫入的列數(shù) write_col_count # 創(chuàng)建新的sheet if len(out_work_book_sheet) <= sheet_idx: out_work_book_sheet[sheet_idx] = out_work_book.add_sheet('sheet' sheet_idx) # 寫入sheet for curr_col_num in range(cols_count) # 當(dāng)前列的內(nèi)容 col = sheet.col_values(curr_col_num) # 遍歷當(dāng)前列的所有選項(xiàng) for index in range(len(col)) # 當(dāng)前列第index的內(nèi)容 value = col[index] # 在寫入的sheet的行號(hào)上,加入上一個(gè)表寫到的位置行號(hào),繼續(xù)向后追加內(nèi)容 out_work_book_sheet[sheet_idx].write(out_work_book_rows[sheet_idx] index, write_col_count, value) write_col_count out_work_book_rows[sheet_idx] = cols_count # 輸出目標(biāo)文件 out_work_book.save('out.xls')if __name__ == "__main__": read(sys.argv)
4.針對(duì)合并的單元格,上述代碼會(huì)出現(xiàn)合并單元格只有一個(gè)格子有內(nèi)容其余為空的情況。這種情形,現(xiàn)將當(dāng)前sheet表格內(nèi)所有合并單元格數(shù)據(jù)保存下來,當(dāng)遇到屬于合并單元格的部分,則默認(rèn)選取該合并單元格的第一個(gè)格子的數(shù)值即可。代碼如下:
def get_merged_cells_value(sheet, row_index, col_index): # 獲得當(dāng)前sheet的所有合并單元格數(shù)據(jù) merged = sheet.merged_cells # 判斷給定的單元格,是否屬于合并單元格,如果是合并單元格,就返回合并單元格的內(nèi)容 for (rlow, rhigh, clow, chigh) in merged: if (row_index >= rlow and row_index < rhigh): if (col_index >= clow and col_index < chigh): cell_value = sheet.cell_value(rlow, clow) return cell_value return None
5.數(shù)據(jù)緩存可以利用python中的容器,和對(duì)象結(jié)構(gòu),將Excel中的數(shù)據(jù)對(duì)象化,在讀取時(shí)候進(jìn)行實(shí)例化然后進(jìn)行保存。在需要進(jìn)行數(shù)據(jù)分析的時(shí)候利用。
6.在遇到特殊的表格格式的時(shí)候,讀取的內(nèi)容可能在轉(zhuǎn)存的時(shí)候出現(xiàn)類型錯(cuò)誤,導(dǎo)致無法識(shí)別。例如時(shí)間類型,正確顯示需要按特定格式進(jìn)行讀取并且轉(zhuǎn)換。
表格類型說明: table.ctype
0 empty
1 string
2 number
3 date
4 boolean
5 error
代碼如下:
from datetime import datetime,datedef get_merged_cells_value(workbook, sheet, row_index, col_index): # 獲得當(dāng)前sheet的所有合并單元格數(shù)據(jù) merged = sheet.merged_cells # 判斷給定的單元格,是否屬于合并單元格,如果是合并單元格,就返回合并單元格的內(nèi)容 for (rlow, rhigh, clow, chigh) in merged: if (row_index >= rlow and row_index < rhigh): if (col_index >= clow and col_index < chigh): if sheet.cell(rlow, clow).ctype == 3: date_value = xlrd.xldate_as_tuple(sheet.cell(rlow, clow), workbook.datemode) # 轉(zhuǎn)換顯示格式為2019/05/05 cell_value = date(*date_value[:3]).strftime('%Y/%m/%d') else: cell_value = sheet.cell_value(rlow, clow) return cell_value return None
7.最終,我們寫一個(gè)windows下的bat批處理文件或者在linux下寫一個(gè)shell,將文檔名字作為參數(shù)傳入執(zhí)行即可。
到此我利用程序完成了幾天的工作,還可以在以后相同的使用環(huán)境下更快速的完成工作。
聯(lián)系客服