Python 通過 xlwings 讀取 Excel 數據
去年底公司讓我做設備管理,多次委婉拒絕,最終還是做了。其實我比較喜歡技術。做管理后發現現場沒有停機率統計,而原始數據有,每次要自己在Excel中填寫數據,感覺特麻煩了,就寫了這個自動化操作Excel的程序,以前要半天的工作量,用Python不到10s。程序比較簡單,直接上程序。
# -*- coding: utf-8 -*-
import xlwings as xw
import pandas as pd
from datetime import datetime
# 統計時間, 只有時間要改
START_TIME = '2018-07-01 00:00:00'
END_TIME = '2018-07-31 23:59:00'
START_ROW = 2 # 處理Excel文件開始行
END_ROW = 200 # 處理Excel結束行
# 天數 * 每天工作時間 * 分鍾
WORK_TIME = 30 * 22 * 60
# 關鍵設備清單
key_machine = ['609', '610', '621', '622', '623', '624',
'627', '628', '636', '638', '667', '670', '675', '689']
persons = ['張三', '李四', '王五']
app = xw.App(visible=True, add_book=False)
wb_source = app.books.open('downTimeData.xls') # 打開Excel文件 downTimeData.xls
sheet = wb_source.sheets[0] # 選擇第0個表單
# 需每月修改時間
start_datetime = datetime.strptime(START_TIME, '%Y-%m-%d %H:%M:%S') # 把開始統計時間轉換為DateTime
end_datetime = datetime.strptime(END_TIME, '%Y-%m-%d %H:%M:%S') # 把結束統計時間轉換為DateTime
result = []
for row in range(START_ROW, END_ROW):
row_content = []
row_str = str(row)
time_str = sheet.range('C' + row_str).value.strip()
create_datetime = datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S')
if start_datetime <= create_datetime <= end_datetime:
machine = sheet.range('A' + row_str).value
machine_number = machine[-4:-1]
if machine_number in key_machine:
if sheet.range('G' + row_str).value.strip() in persons:
row_content.append(machine_number)
row_content.append(create_datetime)
response_time_str = sheet.range('D' + row_str).value
complete_time_str = sheet.range('E' + row_str).value
row_content.append(response_time_str + complete_time_str)
solution_str = sheet.range('H' + row_str).value.strip()
row_content.append(solution_str)
comments = sheet.range('I' + row_str).value.strip()
row_content.append(comments)
result.append(row_content)
# count the times and downtime on the same machine and put it in dictionary
# 統計每台設備的停機次數
dict_result = {}
for _, [name, _, downtime, _, _] in enumerate(result):
if name in dict_result:
dict_result[name] = (dict_result[name][0] + 1,
dict_result[name][1] + downtime)
else:
dict_result[name] = (1, downtime)
# fill the result and write it on excel
target_name = START_TIME[5:7]
wb_target = app.books.open('analysis2018.xlsx') # 打開Excel文件,把結果寫入
index = 3
for key in key_machine:
if key not in dict_result:
wb_target.sheets[target_name].range('B' + str(index)).value = 0
wb_target.sheets[target_name].range('C' + str(index)).value = 0
wb_target.sheets[target_name].range('D' + str(index)).value = WORK_TIME
wb_target.sheets[target_name].range('E' + str(index)).value = 0
wb_target.sheets[target_name].range('F' + str(index)).value = 0
else:
wb_target.sheets[target_name].range(
'B' + str(index)).value = dict_result[key][0]
wb_target.sheets[target_name].range(
'C' + str(index)).value = dict_result[key][1]
wb_target.sheets[target_name].range(
'D' + str(index)).value = (WORK_TIME - dict_result[key][1]) / dict_result[key][0]
wb_target.sheets[target_name].range(
'E' + str(index)).value = dict_result[key][1] / dict_result[key][0]
wb_target.sheets[target_name].range(
'F' + str(index)).value = dict_result[key][1] / WORK_TIME
index += 1
# write the comment and solution on excel
result.sort() # 故障信息排序,用於最后輸出
df = pd.DataFrame(result, columns=['編號',
'故障時間',
'停機時間', '解決方案', '備注'])
wb_target.sheets[target_name].range('H2').value = df
wb_target.sheets[target_name].autofit('c')