diff --git a/yuthon_contract/models/inherit_hr_employee.py b/yuthon_contract/models/inherit_hr_employee.py index c0c58eb38..9f1bd5ca1 100644 --- a/yuthon_contract/models/inherit_hr_employee.py +++ b/yuthon_contract/models/inherit_hr_employee.py @@ -3,10 +3,8 @@ from odoo import fields, models from odoo.exceptions import UserError import io -from copy import copy -from openpyxl import load_workbook -from openpyxl.styles import Alignment -from odoo.modules.module import get_module_resource +from openpyxl import Workbook +from openpyxl.styles import Alignment, Font, Border, Side, PatternFill import base64 @@ -28,55 +26,74 @@ class HrEmployee(models.Model): employees = self.env['hr.employee'].browse(active_ids) - template_path = get_module_resource( - 'yuthon_contract', 'static', 'tmpl', 'huzhubaozhangcanbaoren.xlsx' + workbook = Workbook() + sheet = workbook.active + sheet.title = 'sheet1' + + # 设置列宽 + col_widths = {1: 6, 2: 12, 3: 20, 4: 30, 5: 12, 6: 10, 7: 15} + for col, width in col_widths.items(): + sheet.column_dimensions[chr(64 + col)].width = width + + # 样式定义 + center_align = Alignment(horizontal='center', vertical='center', wrap_text=True) + title_font = Font(name='宋体', size=14, bold=True) + header_font = Font(name='宋体', size=11, bold=True) + data_font = Font(name='宋体', size=11) + thin_border = Border( + left=Side(style='thin'), right=Side(style='thin'), + top=Side(style='thin'), bottom=Side(style='thin') ) - workbook = load_workbook(template_path) - sheet = workbook['sheet1'] + header_fill = PatternFill(start_color='B8CCE4', end_color='B8CCE4', fill_type='solid') - data_start_row = 4 + # 第1行:标题1 + sheet.merge_cells('A1:B1') + sheet['A1'] = '住' + sheet['A1'].font = title_font + sheet['A1'].alignment = center_align - # 提取第4行样式作为模板 - template_styles = {} - if sheet.max_row >= data_start_row: - for col in range(1, 8): - cell = sheet.cell(row=data_start_row, column=col) - template_styles[col] = { - 'font': copy(cell.font), - 'fill': copy(cell.fill), - 'border': copy(cell.border), - } + sheet.merge_cells('C1:E1') + sheet['C1'] = '广州市职工住院医疗互助保障计划' + sheet['C1'].font = title_font + sheet['C1'].alignment = center_align - # 清空模板预填行 - for r in range(data_start_row, sheet.max_row + 1): - for c in range(1, 8): - sheet.cell(row=r, column=c).value = None + sheet.merge_cells('F1:G1') + sheet['F1'] = '参续保人员名册' + sheet['F1'].font = title_font + sheet['F1'].alignment = center_align - row = data_start_row + # 第2行:标题2 + sheet.merge_cells('C2:E2') + sheet['C2'] = '广州市职工非因工伤病残互助保障计划' + sheet['C2'].font = title_font + sheet['C2'].alignment = center_align + + # 第3行:表头 + headers = ['序号', '姓 名', '身 份 证 号 码', '工 作 单 位', '工人或干部', '是否外来工', '手机号码'] + for col, header in enumerate(headers, start=1): + cell = sheet.cell(row=3, column=col, value=header) + cell.font = header_font + cell.alignment = center_align + cell.border = thin_border + cell.fill = header_fill + + # 第4行起:数据 + row = 4 for index, employee in enumerate(employees, start=1): - # 解除合并单元格 - to_unmerge = [ - str(mr) for mr in sheet.merged_cells.ranges - if mr.min_row <= row <= mr.max_row + values = [ + index, + employee.name or '', + employee.identification_id or '', + employee.party_id.party if employee.party_id else '', + employee.user_type or '', + employee.is_local_location or '', + employee.mobile_phone or '', ] - for mr_str in to_unmerge: - sheet.unmerge_cells(mr_str) - - for col in range(1, 8): - cell = sheet.cell(row=row, column=col) - if col in template_styles: - cell.font = copy(template_styles[col]['font']) - cell.fill = copy(template_styles[col]['fill']) - cell.border = copy(template_styles[col]['border']) - cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) - - sheet.cell(row=row, column=1, value=index) - sheet.cell(row=row, column=2, value=employee.name or '') - sheet.cell(row=row, column=3, value=employee.identification_id or '') - sheet.cell(row=row, column=4, value=employee.party_id.party if employee.party_id else '') - sheet.cell(row=row, column=5, value=employee.user_type or '') - sheet.cell(row=row, column=6, value=employee.is_local_location or '') - sheet.cell(row=row, column=7, value=employee.mobile_phone or '') + for col, value in enumerate(values, start=1): + cell = sheet.cell(row=row, column=col, value=value) + cell.font = data_font + cell.alignment = center_align + cell.border = thin_border row += 1 output = io.BytesIO() diff --git a/yuthon_contract/static/tmpl/huzhubaozhangcanbaoren.xlsx b/yuthon_contract/static/tmpl/huzhubaozhangcanbaoren.xlsx deleted file mode 100644 index e69de29bb..000000000