Odoo_自定义导出excel
1.首先按钮或者菜单触发一个后端方法返回url动作
def download_xxx_excel(self): url = '/export_xxx_excel?id={self.id} return { 'type': 'ir.actions.act_url', 'url': url, 'target': 'new', }
2.controller
from odoo import http import xlsxwriter, io import base64 @http.route(['/export_xxx_excel'], type='http', auth="user", website=True) def export_xxx_excel(self, **kw): id = kw.get('id') output_buffer = io.BytesIO() workbook = xlsxwriter.Workbook(output_buffer, options={'default_format_properties': {'font_name': 'Microsoft Yahei', 'font_size': 9, 'valign': 'vcenter'}}) format_title = workbook.add_format({'font_size': 20, 'align': 'center'}) format_header = workbook.add_format({'font_size': 10, 'border': True, 'bold': True, 'align': 'center'}) format_default = workbook.add_format({'text_wrap': True, 'border': True, 'border_color': 'gray'}) format_left = workbook.add_format({'font_size': 10, 'border': True, 'bold': True, 'align': 'left'}) worksheet = workbook.add_worksheet("worksheet_name") worksheet.write("A1", "Python") worksheet.write("B1", "Excel") worksheet.write("C1", "xlsx") workbook.close() output_buffer.seek(0) byte_data = output_buffer.getvalue() # 在内存中读取 base64_data = base64.b64encode(byte_data) # 转为base64 file_name = "xxx.xlsx" byte_data = base64.b64decode(base64_data) response = http.request.make_response( None, headers=[ ('Content-Type', 'application/vnd.ms-excel'), ('Content-Disposition', http.content_disposition(file_name)) ] ) response.stream.write(byte_data) return response
3.需求:Odoo中有一个Binary类型的图片文件,想在生成excel时将该字典的图片添加到excel文件中。
import xlsxwriter, io import base64 from PIL import Image ... # Binary类型的字段 image_data = order_id.company_id.partner_id.signet if image_data: image = Image.open(io.BytesIO(base64.b64decode(image_data))) image_stream = io.BytesIO() image.save(image_stream, format='PNG') image_stream.seek(0) else: image_stream = False co_worksheet.insert_image('B10:D10', 'image.png', {'image_data': image_stream}) ...