!11179 !11178 会员列表导出

Merge pull request !11179 from 李鹏宇/dev
This commit is contained in:
李鹏宇
2026-04-24 08:59:12 +00:00
committed by Gitee
2 changed files with 63 additions and 46 deletions
+63 -46
View File
@@ -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()