Odoo implementa la generación de páginas y descarga Excel personalizado

Principio de implementación: use xlsxwriter para generar archivos de Excel, guárdelos en la carpeta especificada en el servidor y luego decodifique y guárdelos como binarios en la base de datos del
modelo .

  • Admite más funciones de Excel que cualquier módulo alternativo.
  • Tiene alta fidelidad a los archivos generados por Excel. En la mayoría de los casos, los archivos generados son 100% equivalentes a los generados por Excel.
  • Tiene una extensa documentación, archivos de ejemplo y pruebas.
  • Es rápido y se puede configurar para usar muy poca memoria incluso para archivos de salida muy grandes.

Desventajas :

  • No puede leer ni modificar archivos Excel XLSX existentes.
# 导入使用需要的包
import os
import base64
import xlsxwriter
from odoo import tools
# 定义Binary字段,定义附件显示名称
top_fifty_file = fields.Binary(string='Top Fifty File')
top_fifty_filename = fields.Char('File Name')

El requisito es generar un informe de los resultados de la consulta para su descarga al consultar los 50 principales. Un método de implementación simple es la
diferencia entre os.sep.join y os.path.join

	@api.one
    def inquire_top_fifty_tax_date(self):
    	# 获取OE根目录
        root_path = tools.config['root_path'] 
        # os.sep是为了解决不同平台上文件路径分隔符差异问题 os.sep.join( )函数传入的参数是一个列表,输出的结果是将列表中的元素用相应平台对应的路径分隔符链接起来的整体
        temp_download_report_dir = os.sep.join([root_path, 'temp_download_report_dir'])  
        # os.path.isdir()函数来判断路径是否为目录
        if not os.path.isdir(temp_download_report_dir):
        	# 若没有则创建给权限
            os.mkdir(temp_download_report_dir, 0777)
        # 保存在此目录下的文件名称
        filename = os.sep.join([temp_download_report_dir, "50强.xlsx"])
        # 因为每次查询都是自定义条件查询,结果不同,所以先删除上一次查询的历史文件
        if os.path.isfile(filename):
            os.remove(filename)
						.............
						.............
						.............
						# 省略查询逻辑
						.............
						.............
						.............
						.............
						.............
	# 调用拆分出去的生成excel的方法(也可以放在一块)
	self.download_top_fifty_report(self, filename)
    def download_top_fifty_report(self, top_fifty_tax_date(*此处为当前模型实例), filename(文件名称)):
    	# 使用xlsxwriter创建文件名为---绝对路径+文件名---
        workbook = xlsxwriter.Workbook(filename)
        worksheet = workbook.add_worksheet()
        # 添加用于突出显示单元格的粗体格式。
        bold = workbook.add_format({
    
    
            'bold': True,
            'align': 'center',  # 水平方向居中,默认左对齐
            'valign': 'vcenter'})  # 垂直方向居中
        data = []
        # Write some data headers.
        worksheet.write('A1', '排名', bold)
        worksheet.write('B1', '纳税人名称', bold)
        worksheet.write('C1', '所属单位', bold)
        worksheet.write('D1', '税收合计', bold)
        for top_fifty_data in top_fifty_tax_date.top_fifty_tax_ids:
            top_fifty_val = [
                top_fifty_data.rank,
                top_fifty_data.company_information_id.name,
                top_fifty_data.company_id.name,
                top_fifty_data.total_tax,
            ]
            data.append(top_fifty_val)
        excel_data = tuple(data)
        # Start from the first cell below the headers.
        row = 1
        col = 0
        # Iterate over the data and write it out row by row.
        for rank, company_information_name, company_name, total_tax in (excel_data):
            worksheet.write(row, col, rank)
            worksheet.write(row, col + 1, company_information_name)
            worksheet.write(row, col + 2, company_name)
            worksheet.write(row, col + 3, total_tax)
            row += 1
        workbook.close()
        # 拼接日期
        start_date = top_fifty_tax_date.start_year_month[0:4] + top_fifty_tax_date.start_year_month[5:7]
        end_date = top_fifty_tax_date.end_year_month[0:4] + top_fifty_tax_date.end_year_month[5:7]
        name_date = start_date + '-' + end_date
		# 读取创建保存在服务器目录下的文件
        data = open(filename, 'rb').read()
        # 编码解码
        file_base64_encoded = base64.b64encode(data).decode('UTF-8')
        # 写入字段
        top_fifty_tax_date.top_fifty_file = file_base64_encoded
        # 对显示名称赋值
        top_fifty_tax_date.top_fifty_filename = name_date + "分规模统计表.xlsx"

Puede hacer clic en la página para mostrar y descargar
archivo adjunto generado
haga clic para descargar
las representaciones de Excel
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/iuv_li/article/details/126279574
Recomendado
Clasificación