if self.data_sheet.cell(row=1, column=1).value is None: self.data_sheet.cell(row=1, column=1, value="PEGA-料号") if self.data_sheet.cell(row=1, column=2).value is None: self.data_sheet.cell(row=1, column=2, value="數量") if self.data_sheet.cell(row=1, column=3).value is None: self.data_sheet.cell(row=1, column=3, value="日期") if self.data_sheet.cell(row=1, column=4).value is None: self.data_sheet.cell(row=1, column=4, value="時間") if self.data_sheet.cell(row=1, column=5).value is None: self.data_sheet.cell(row=1, column=5, value="班別") if self.data_sheet.cell(row=1, column=6).value is None: self.data_sheet.cell(row=1, column=6, value="登記人") if self.data_sheet.cell(row=1, column=7).value is None: self.data_sheet.cell(row=1, column=7, value="單價") if self.data_sheet.cell(row=1, column=8).value is None: self.data_sheet.cell(row=1, column=8, value="品名") if self.data_sheet.cell(row=1, column=9).value is None: self.data_sheet.cell(row=1, column=9, value="儲位") if self.data_sheet.cell(row=1, column=10).value is None: self.data_sheet.cell(row=1, column=10, value="入庫單號")這怎麽優化
时间: 2024-03-27 10:41:00 浏览: 17
可以将这段代码改写为一个循环,避免重复的 if 语句。例如:
```
headers = ["PEGA-料号", "數量", "日期", "時間", "班別", "登記人", "單價", "品名", "儲位", "入庫單號"]
for col in range(1, 11):
if self.data_sheet.cell(row=1, column=col).value is None:
self.data_sheet.cell(row=1, column=col, value=headers[col-1])
```
这样代码更简洁,也更易于维护。
相关问题
from openpyxl import load_workbook, Workbook from openpyxl.styles import PatternFill class ExcelMerger: def __init__(self, input_path, output_path): self.input_path = input_path self.output_path = output_path self.workbook = Workbook() self.sheet = self.workbook.active self.fill = PatternFill(fill_type='solid', start_color='FFFFFF', end_color='FFFFFF') self.row_index = 1 def merge(self): for filename in os.listdir(self.input_path): if not filename.endswith('.xlsx'): continue filepath = os.path.join(self.input_path, filename) workbook = load_workbook(filepath, data_only=True) if '功能点拆分表' not in workbook.sheetnames: continue sheet = workbook['功能点拆分表'] for row in sheet.rows: self.sheet.row_dimensions[self.row_index].height = sheet.row_dimensions[row[0].row].height for cell in row: if cell.value is not None: self.sheet.cell(row=self.row_index, column=cell.column, value=cell.value) self.sheet.cell(row=self.row_index, column=cell.column).fill = cell.fill else: self.sheet.cell(row=self.row_index, column=cell.column).fill = self.fill self.row_index += 1 self.workbook.save(self.output_path)上述修改后的代码仍然出现TypeError: unhashable type: 'StyleProxy'的错误,怎么解决
这个问题通常是由于样式对象(Style)是不可哈希的导致的。在这种情况下,你需要将样式对象转换为可哈希的对象,或者使用其他数据结构来代替字典。
你可以尝试将样式对象转换为字符串,然后将字符串作为键来使用。例如,可以使用`str(style)`来获取样式对象的字符串表示形式,并将其用作字典的键,如下所示:
```
cell_style = {}
...
if cell.has_style:
cell_style[cell.coordinate] = str(cell.style)
...
```
这样就可以避免`TypeError: unhashable type: 'StyleProxy'`错误。
当然,这只是一种解决方案,具体如何修改代码需要根据具体情况而定。
def show_excel(self): # 清空文本框内容 self.result_text.delete(1.0, tk.END) self.result_text2.delete(1.0, tk.END) # 获取出入库明细的表格数据 rows = list(self.record_sheet.rows) cols = list(self.record_sheet.columns) # 在文本框1中显示表格 for i in range(len(rows)): for j in range(len(cols)): cell_value = str(rows[i][j].value) if cell_value is None: cell_value = '' if isinstance(rows[i][j].value, datetime.datetime): cell_value = rows[i][j].value.strftime('%Y-%m-%d') self.result_text.insert(tk.END, cell_value + '\t') self.result_text.insert(tk.END, '\n') # 获取库存明细的表格数据 rows = list(self.data_sheet.rows) cols = list(self.data_sheet.columns) # 在文本框2中显示表格 for i in range(len(rows)): for j in range(len(cols)): cell_value = str(rows[i][j].value) if cell_value is None: cell_value = '' if isinstance(rows[i][j].value, datetime.datetime): cell_value = rows[i][j].value.strftime('%Y-%m-%d') self.result_text2.insert(tk.END, cell_value + '\t') self.result_text2.insert(tk.END, '\n')將這個代碼中顯示數據的表格設置第一行列標題的寬度
你可以在显示表格之前,先将第一行的列标题显示出来,并设置它们的宽度。例如:
```
from openpyxl.utils import get_column_letter
# 获取第一行的列标题
header_row = list(sheet.rows)[0]
# 显示列标题,并设置它们的宽度
for cell in header_row:
col_letter = get_column_letter(cell.column)
cell_value = str(cell.value) if cell.value is not None else ''
self.result_text.insert(tk.END, cell_value + '\t')
sheet.column_dimensions[col_letter].width = len(cell_value) + 2
self.result_text.insert(tk.END, '\n')
# 显示数据
for row in sheet.iter_rows(min_row=2):
for cell in row:
cell_value = str(cell.value) if cell.value is not None else ''
self.result_text.insert(tk.END, cell_value + '\t')
self.result_text.insert(tk.END, '\n')
```
其中,sheet 是你要显示的工作表对象,self.result_text 是你要显示数据的文本框。我们先获取第一行的列标题,然后根据每个单元格的内容计算出它们应该具有的宽度,并设置到对应的列。最后再显示数据。