Odoo实现页面生成并下载自定义excel

实现原理:使用xlsxwriter生成excel文件,存储在服务器指定文件夹下,然后解码存为Binary到模型数据库
优点

  • 它支持的 Excel 功能比任何替代模块都多。
  • 它对 Excel 生成的文件具有高度的保真度。在大多数情况下,生成的文件与 Excel 生成的文件 100% 等效。
  • 它有大量的文档、示例文件和测试。
  • 它速度很快,即使对于非常大的输出文件,也可以配置为使用很少的内存。

缺点

  • 它无法读取或修改现有的 Excel XLSX 文件。
# 导入使用需要的包
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')

需求是在查询前50的时候生成查询出来的结果的报表 供下载,一种简单的实现方式
os.sep.join和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"

页面即可点击显示下载
生成的附件
点击下载
excel效果图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/iuv_li/article/details/126279574