@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user