odoo生成excel
记录一下odoo中数据生成excel数据,直接看以下代码
def generate_excel_attachment(self):
# 创建Excel工作簿和工作表
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet('excel数据')
# 设置表头行高
header_row_height = 38 # 行高为38
worksheet.row(0).height_mismatch = True
worksheet.row(0).height = 31 * 20 # 行高以20为基准
worksheet.row(1).height_mismatch = True
worksheet.row(1).height = header_row_height * 20 # 行高以20为基准
worksheet.row(1).height_mismatch = True
worksheet.row(1).height = header_row_height * 20 # 行高以20为基准
# 设置合并后的单元格居中和字体大小
alignment = xlwt.Alignment()
alignment.horz = xlwt.Alignment.HORZ_CENTER
alignment.vert = xlwt.Alignment.VERT_CENTER
# 设置字体
font = xlwt.Font()
font.height = 20 * 12
font.bold = True
style = xlwt.XFStyle()
style.alignment = alignment
style.font = font
style_borders = xlwt.Borders()
style_borders.left = xlwt.Borders.THIN
style_borders.right = xlwt.Borders.THIN
style_borders.top = xlwt.Borders.THIN
style_borders.bottom = xlwt.Borders.THIN
style.borders = style_borders
# worksheet.write(0, 0, '合并单元格', style)
worksheet.write_merge(0, 0, 0, 16, 'excel数据', style)
# 创建表头样式
header_style = xlwt.XFStyle()
header_font = xlwt.Font()
header_font.bold = True
header_style.font = header_font
header_style.alignment.horz = xlwt.Alignment.HORZ_CENTER
header_style.alignment.vert = xlwt.Alignment.VERT_CENTER
# 设置表头背景色
header_pattern = xlwt.Pattern()
header_pattern.pattern = xlwt.Pattern.SOLID_PATTERN
header_pattern.pattern_fore_colour = xlwt.Style.colour_map['gray25']
header_style.pattern = header_pattern
# 设置表头边框
header_borders = xlwt.Borders()
header_borders.left = xlwt.Borders.THIN
header_borders.right = xlwt.Borders.THIN
header_borders.top = xlwt.Borders.THIN
header_borders.bottom = xlwt.Borders.THIN
header_style.borders = header_borders
# 在Excel工作表中写入数据
head = ["标题名称...."]
for i in head:
worksheet.write(1, head.index(i), i, header_style)
# 列宽
column_width = 15
for i in range(len(head)):
worksheet.col(i).width = column_width * 256 # 列宽以256为基准
# 创建内容样式
content_style = xlwt.XFStyle()
# 设置内容数据边框
content_borders = xlwt.Borders()
content_borders.left = xlwt.Borders.THIN
content_borders.right = xlwt.Borders.THIN
content_borders.top = xlwt.Borders.THIN
content_borders.bottom = xlwt.Borders.THIN
content_style.borders = content_borders
# 居中
content_font = xlwt.Font()
content_style.font = content_font
content_style.alignment.horz = xlwt.Alignment.HORZ_CENTER
content_style.alignment.vert = xlwt.Alignment.VERT_CENTER
# 添加内容
row = 1
excel_records = self.excel_ids.sorted(key=lambda r: r.dep_id)
for record in excel_records:
row += 1
worksheet.write(row, 0, record.name, content_style)
...
# 设置换行样式
style_merge = xlwt.XFStyle()
alignment = xlwt.Alignment()
alignment.wrap = 1 # 自动换行
alignment.vert = xlwt.Alignment.VERT_TOP
style_merge.alignment = alignment
style_font_merge = xlwt.Borders()
style_font_merge.left = xlwt.Borders.THIN
style_font_merge.right = xlwt.Borders.THIN
style_font_merge.top = xlwt.Borders.THIN
style_font_merge.bottom = xlwt.Borders.THIN
style_merge.borders = style_font_merge
# 在单元格内使用\n进行换行
text_with_newline = """字段说明:
1.统计范围:统计说明"""
s_merge = len(self.excel_ids)
worksheet.write_merge(s_merge+2, s_merge+11, 0, 16, text_with_newline, style_merge)
# 将Excel数据保存到BytesIO对象中
excel_file = BytesIO()
workbook.save(excel_file)
# 创建附件并将Excel数据附加到附件中
attachment = self.env['ir.attachment'].create({
'name': '生成excel数据.xls',
'datas': base64.encodebytes(excel_file.getvalue()),
'mimetype': 'application/vnd.ms-excel',
'res_model': model,
'res_id': self.id,
})
# 下载
# return {
# 'type': 'ir.actions.act_url',
# 'url': '/web/content/%s?download=true' % (attachment.id),
# 'target': 'self',
# }