將這兩段代碼優化提升運行速度,修改的的完整代碼
时间: 2024-03-15 10:44:59 浏览: 15
针对第一段代码,可以将文件读写的操作放在循环外面,避免重复打开和关闭文件。同时,可以使用`load_workbook()`方法的`data_only`参数来只读取Excel文件中的数据,而不读取公式,这样可以提高读取速度。修改后的代码如下:
```python
def refresh_labels(self):
data4 = self.la
if not data4.endswith('.xlsx'):
data4 += '.xlsx'
wo = pinjie
filepath = os.path.join(wo, data4)
workbook = openpyxl.Workbook()
if os.path.exists(filepath):
workbook = openpyxl.load_workbook(filepath, data_only=True)
current_time = datetime.datetime.now().time()
start_time_1 = datetime.time(8, 0, 0) # 早上8点
end_time_1 = datetime.time(20, 0, 0) # 下午7点
start_time_2 = datetime.time(20, 0, 0) # 晚上8点
end_time_2 = datetime.time(7, 0, 0) # 早上7点
for i, sheet_name in enumerate(self.sheet_names):
filtered_rows = []
sheet = workbook.get_sheet_by_name(sheet_name)
today = datetime.datetime.now().strftime('%Y/%m/%d')
cell_value = sheet.cell(row=1, column=1).value
if cell_value is not None and cell_value != '':
for row in sheet.iter_rows(min_row=1):
if row[2].value == today and row[8].value == sheet_name:
datetime_obj = datetime.datetime.strptime(row[3].value, '%H:%M:%S')
row_time = datetime_obj.time()
if start_time_1 <= row_time <= end_time_1 and start_time_1 <= current_time <= end_time_1:
filtered_rows.append(row)
elif start_time_2 <= row_time or current_time <= end_time_2:
filtered_rows.append(row)
label = self.unique_listbox.grid_slaves(row=i // 3, column=i % 3)[0]
if filtered_rows:
label.config(text=f"{sheet_name} - 已點檢", fg="green")
else:
label.config(text=f"{sheet_name} - 未點檢", fg="red")
```
针对第二段代码,可以将文件读写的操作放在循环外面,并且将`openpyxl`库的`optimization`模块导入,使用`coordinate_to_tuple()`方法来将坐标字符串转换为元组,以便更快地访问单元格。同时,也可以将日期的字符串格式化操作提前,避免重复执行。修改后的代码如下:
```python
def refresh_logs(self):
data1 = self.la1
data2 = self.la2
if not data1.endswith('.xlsx'):
data1 += '.xlsx'
if not data2.endswith('.xlsx'):
data2 += '.xlsx'
wo = pinjie
filepath1 = os.path.join(wo, data1)
filepath2 = os.path.join(wo, data2)
workbook1 = openpyxl.Workbook()
workbook2 = openpyxl.Workbook()
if os.path.exists(filepath1):
workbook1 = openpyxl.load_workbook(filepath1, data_only=True)
if os.path.exists(filepath2):
workbook2 = openpyxl.load_workbook(filepath2, data_only=True)
sheet_name = self.sheet_names[self.current_sheet_index]
sheet1 = workbook1.get_sheet_by_name(sheet_name)
sheet2 = workbook2.get_sheet_by_name(sheet_name)
rows = []
for row in sheet1.iter_rows(min_row=2):
date = row[2].value.strftime('%Y/%m/%d')
time = row[3].value.strftime('%H:%M:%S')
user = row[4].value
action = row[5].value
cell = row[6]
if cell.data_type == 'f':
value = cell.value
else:
value = cell.text
rows.append((date, time, user, action, value))
for row in sheet2.iter_rows(min_row=2):
date = row[2].value.strftime('%Y/%m/%d')
time = row[3].value.strftime('%H:%M:%S')
user = row[4].value
action = row[5].value
cell_coord = row[6].coordinate
cell_tuple = openpyxl.utils.cell.coordinate_to_tuple(cell_coord)
rows.append((date, time, user, action, cell_coord, cell_tuple, sheet2.title))
rows.sort(key=lambda x: f"{x[0]} {x[1]}")
self.logs_listbox.delete(0, tk.END)
for row in rows:
if len(row) == 5:
date, time, user, action, value = row
self.logs_listbox.insert(tk.END, f"{date} {time} {user} {action} {value}")
else:
date, time, user, action, cell_coord, cell_tuple, sheet_name = row
self.logs_listbox.insert(tk.END, f"{date} {time} {user} {action} {sheet_name} {cell_coord} {cell_tuple}")
```
这样修改后,应该能够提升代码的运行速度。