最近和同學聊天,有聊到工作中經(jīng)常會處理一些產(chǎn)品的檢測數(shù)據(jù)晤锥,經(jīng)常都是從一張或者多張Excel表中摘取需要的數(shù)據(jù)然后放到一張新表中掉蔬,但是每次都是重復性的工作。如圖1要獲取數(shù)據(jù)后處理成圖2
可不可以寫一個程序處理這些工作呢矾瘾?當然是可以的女轿,Python就可以處理。Python中處理Excel表的庫有很多壕翩。比如:xlrd蛉迹,openpyxl,xlwings等如圖3放妈。
這次我們就選用openpyxl庫來處理
首先我們新建工程建原始數(shù)據(jù)導入工程
我們的原始數(shù)據(jù)文件就是“analyzedata.xlsx”
新建一個.py文件北救,“analyze.py”
然后導入庫
from openpyxl import Workbook //主要是用來新建文件
from openpyxl import load_workbook //加載文件
首先我們在原來的Excel上新建一個sheet,并且命名為“Result”芜抒,代碼如下:
# 新建一個新表用于存放結(jié)果數(shù)據(jù)
def new_sheet():
# 加載Excel文件
workbook = load_workbook(filename="analyzedata.xlsx")
# 定義一個新表名
new_sheetname = "Result"
# 判斷Excel中是否已經(jīng)存在“Result”名稱的這樣一個表
if new_sheetname not in workbook.sheetnames:
# 如果不存在我們就新建一個
workbook.create_sheet(new_sheetname)
# print(workbook.sheetnames)
workbook.save(filename="analyzedata.xlsx")
# 如果已經(jīng)存在珍策,我們就把sheet里的數(shù)據(jù)刪除
else:
sheet = workbook[new_sheetname]
# 打印出表格有數(shù)據(jù)的范圍,觀察看看
# print(sheet.dimensions) # A1:E27
# 或有數(shù)據(jù)的每一行宅倒,然后執(zhí)行刪除
for row in sheet.iter_rows():
# print(row)
sheet.delete_rows(idx=1)
workbook.save(filename="analyzedata.xlsx")
注意每次我們退Excel表進行了表的刪減攘宙,對數(shù)據(jù)進行了更改,都需要對文件使用“.save()”函數(shù)保存拐迁。如下
workbook.save(filename="analyzedata.xlsx")
注意:我們對于已經(jīng)存在的表蹭劈,最好進行一次數(shù)據(jù)的清空再加入新數(shù)據(jù),防止有其他無用的數(shù)據(jù)混入唠亚。
比如我做的是刪除每一行的操作链方。這樣也可以做到在加入新數(shù)據(jù)前清空所有數(shù)據(jù)。
sheet = workbook[new_sheetname]
# 打印出表格有數(shù)據(jù)的范圍灶搜,觀察看看
# print(sheet.dimensions) # A1:E27
# 或有數(shù)據(jù)的每一行祟蚀,然后執(zhí)行刪除
for row in sheet.iter_rows():
# print(row)
sheet.delete_rows(idx=1)
workbook.save(filename="analyzedata.xlsx")
通過上面new_sheet()函數(shù)我們就新建了一個sheet表。接下來我們獲取需要的數(shù)據(jù)割卖。如下定義一個新函數(shù):
# 到源數(shù)據(jù)表中找到目標數(shù)據(jù)
def find_result():
data_cell_list = []
workbookT = load_workbook(filename="analyzedata.xlsx")
# sheetT = workbook.active
sheetT = workbookT["SourceData"]
# 獲取工作表大小
sheet_size = sheetT.dimensions
# 獲取工作表內(nèi)容
cells = sheetT[sheet_size]
# print(cells)
# 定義是三個空列表
data_cps_h31 = []
data_cps_h32 = []
data_poi_tp1 = []
# cell_row_tuple是每一行為1個元組
for cell_row_tuple in cells:
# cell是每一行元組中的每一個小格子
for cell in cell_row_tuple:
# print(cell.value)
if cell.value == "CPS_H31":
print(cell.row, cell.column)
cell_Y = sheetT.cell(row=(cell.row + 2), column=(cell.column + 3))
cell_Z = sheetT.cell(row=(cell.row + 3), column=(cell.column + 3))
cell_Len = sheetT.cell(row=(cell.row + 4), column=(cell.column + 3))
cell_WID = sheetT.cell(row=(cell.row + 5), column=(cell.column + 3))
cell_len_tem = sheetT.cell(row=(cell.row + 4), column=cell.column + 1)
cell_wid_tem = sheetT.cell(row=(cell.row + 5), column=cell.column + 1)
data_cps_h31 = [
["Y", cell_Y.value],
["Z", cell_Z.value],
[cell_len_tem.value, cell_Len.value],
[cell_wid_tem.value, cell_WID.value],
]
if cell.value == "CPS_H32":
print(cell.row, cell.column)
cell_Y = sheetT.cell(row=(cell.row + 2), column=(cell.column + 3))
cell_Z = sheetT.cell(row=(cell.row + 3), column=(cell.column + 3))
cell_Len = sheetT.cell(row=(cell.row + 4), column=(cell.column + 3))
cell_WID = sheetT.cell(row=(cell.row + 5), column=(cell.column + 3))
cell_len_tem = sheetT.cell(row=(cell.row + 4), column=cell.column + 1)
cell_wid_tem = sheetT.cell(row=(cell.row + 5), column=cell.column + 1)
data_cps_h32 = [
["Y", cell_Y.value],
["Z", cell_Z.value],
[cell_len_tem.value, cell_Len.value],
[cell_wid_tem.value, cell_WID.value],
]
if cell.value == "POI_TP1":
print(cell.row, cell.column)
cell_X = sheetT.cell(row=(cell.row + 2), column=(cell.column + 2))
data_poi_tp1 = [
["X", cell_X.value]
]
data_re = [data_cps_h31, data_cps_h32, data_poi_tp1]
return data_re
思路就是獲取到表格中所有內(nèi)容前酿,也就是獲取到所有有數(shù)據(jù)格子中的數(shù)據(jù),然后通過if判斷找到所需要的數(shù)據(jù)鹏溯。
如下:
sheet_size = sheetT.dimensions
# 獲取工作表內(nèi)容
cells = sheetT[sheet_size]
# cell_row_tuple是每一行為1個元組
for cell_row_tuple in cells:
# cell是每一行元組中的每一個小格子
for cell in cell_row_tuple:
# print(cell.value)
if cell.value == "CPS_H31":
.......
通過這個函數(shù)就可以獲得所有需要的數(shù)據(jù)了罢维。有了數(shù)據(jù)就可以往新表中添加數(shù)據(jù)了。添加數(shù)據(jù)函數(shù)如下丙挽。
def append_rows(data_result):
workbook = load_workbook(filename="analyzedata.xlsx")
sheet = workbook["Result"]
for row in data_result:
sheet.append(row)
workbook.save(filename="analyzedata.xlsx")
這個比較簡單就不多說了肺孵。對于基礎有疑問的可以訪問我的簡書基礎部分匀借。運行代碼如下:
這些數(shù)據(jù)已經(jīng)很接近我們結(jié)果了,通過分析平窘,我們可以通過插入一列后添加數(shù)據(jù)達到我們結(jié)果吓肋。代碼如下:
def insert_cols_data():
workbook = load_workbook(filename="analyzedata.xlsx")
sheet = workbook["Result"]
sheet.insert_cols(idx=1)
cellOne = sheet["A1"]
cellOne.value = "H31"
cellTwo = sheet["A5"]
cellTwo.value = "H32"
cellThree = sheet["A9"]
cellThree.value = "H31"
workbook.save(filename="analyzedata.xlsx")
調(diào)用這些函數(shù),然后運行瑰艘,得到結(jié)果:
注意一個很多人可能遇到的bug是鬼,如下圖
這個bug是由于我們ExcelB表格被打開了,沒有關(guān)閉導致的紫新。如下圖
把表格關(guān)閉均蜜,運行代碼就恢復正常了。本次分享已經(jīng)完成芒率。
源碼地址:關(guān)注微信公眾號“碼農(nóng)不頭禿”后回復“Excel表格處理”將會有源碼地址發(fā)給您囤耳。
對Python感興趣的朋友可以關(guān)注我的簡書和公眾號。需要Python或者爬蟲電子書的朋友們關(guān)注微信公眾號后臺回復“python電子書”敲董。