from io import BytesIOimport requests
from flask import make_response
from openpyxl.workbook import Workbook
from openpyxl.styles import Font, Alignment, Border, Side
from openpyxl.drawing.image import Imagefrom openpyxl.writer.excel import save_virtual_workbookdef get_excel(id: str = None, *args, **kwargs):'''下载导出:基本信息填报表'''# 创建excel表# 创建一个新的工作簿wb = Workbook()# 选择默认的活动工作表ws = wb.activews.title = "第1页"# 基本信息填报表: 相关信息# 执行sql语句获取你的相关信息,自己写一下,result变量接收,通过主键查询,获取单条记录# 设置字体样式和单元格样式title_font = Font(name='宋体', size=22, color='000000', bold=True)title_alignment = Alignment(horizontal='center', vertical='top', wrap_text=True)body_font = Font(name='宋体', size=12, color='000000', bold=False)body_alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)# 定义边框样式# 全黑边框black_border = Border(left=Side(border_style='thin', color='000000'),right=Side(border_style='thin', color='000000'),top=Side(border_style='thin', color='000000'),bottom=Side(border_style='thin', color='000000'))# 全无边框no_border = Border(left=None,right=None,top=None,bottom=None)# 顶部无边框top_no_border = Border(left=Side(border_style='thin', color='000000'),right=Side(border_style='thin', color='000000'),top=None,bottom=Side(border_style='thin', color='000000'))image_path = Nonemerge_cell_params = []for item in result:# 标题merge_cell_params.append((1, 1, 1, 15, "基本信息填报表", title_font, title_alignment, black_border))# 姓名merge_cell_params.append((3, 5, 1, 2, "姓名", body_font, body_alignment, black_border))merge_cell_params.append((3, 5, 3, 4, item.name, body_font, body_alignment, black_border))# 性别merge_cell_params.append((3, 5, 5, 6, "性别", body_font, body_alignment, black_border))merge_cell_params.append((3, 5, 7, 8, item.sex, body_font, body_alignment, black_border))# 出生年月merge_cell_params.append((3, 4, 9, 10, "出生年月", body_font, body_alignment, black_border))merge_cell_params.append((3, 4, 11, 12, item.birthYear, body_font, body_alignment, black_border))# 照片路径image_path = item.image_pathmerge_cell_params.append((4, 8, 14, 14, " is image ", body_font, body_alignment, no_border))# 民族merge_cell_params.append((6, 6, 1, 2, "民族", body_font, body_alignment, black_border))merge_cell_params.append((6, 6, 3, 4, item.nation, body_font, body_alignment, black_border))# 处理合并单元格for index, params in enumerate(merge_cell_params):start_row, end_row, start_column, end_column, value, font, align, cell_border = paramsws.merge_cells(start_row=start_row, end_row=end_row, start_column=start_column, end_column=end_column)# 是否为图片if value and isinstance(value, str) and "is image" in value:response = requests.get(url=image_path)if response.status_code == 200:# 创建响应对象image_data = BytesIO(response.content)ws.add_image(image_data, "N4")else:logger.error("未找到照片信息!")else:# 设置值在合并区域的第一个单元格ws.cell(row=start_row, column=start_column).value = value# ws.cell(row=start_row, column=start_column).value = valueif font:# 应用字体样式ws.cell(row=start_row, column=start_column).font = fontif align:# 应用对齐样式ws.cell(row=start_row, column=start_column).alignment = align# 添加边框for row in range(start_row, end_row + 1):for col in range(start_column, end_column + 1):ws.cell(row=row, column=col).border = cell_border# 设置行高自适应内容ws.row_dimensions[start_row].auto_size = Truefile_name = "测试.xlsx"content = save_virtual_workbook(wb)resp = make_response(content)resp.headers["Content-Disposition"] = 'attachment; filename={}.xlsx'.format(file_name.encode().decode('latin-1'))resp.headers['Content-Type'] = 'application/x-xlsx'return resp