구현 원리: 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 렌더링을 표시하고 다운로드할 수 있습니다.