2017-12-19 182 views
7

Tôi mới dùng python và odoo. Tôi đi qua một kịch bản mà tôi muốn tạo ra một tập tin excel đầu tiên từ hồ sơ năng động của tôi và sau đó muốn lưu nó vào bảng ir.attachment. Để tôi có thể liên kết đó dưới dạng tệp đính kèm trong email.Cách tạo và sau đó viết trên một tệp xlsx

Đây là những gì tôi đã cố gắng, nhưng nó không viết vào tập tin

workbook = xlsxwriter.Workbook('demo.xlsx') 
    worksheet = workbook.add_worksheet() 
    worksheet.set_column('A:A', 20) 
    bold = workbook.add_format({'bold': True}) 
    worksheet.write('A1', 'Hello') 
    worksheet.write('A2', 'World', bold) 
    worksheet.write(2, 0, 123) 
    worksheet.write(3, 0, 123.456) 
    workbook.close() 

Cập nhật

tôi có thể tạo ra các tập tin xlsx, actullay đó là vấn đề con đường của tôi. Bây giờ tôi chỉ muốn biết rằng làm thế nào để thêm tập tin đó trong ir.attachment

+0

Bạn có ý gì bởi "nó không viết vào tệp"? Tệp có đang được tạo nhưng không được điền không? Ngoài ra, bạn dường như đang sử dụng nhập khẩu không được cung cấp ở đây. Vui lòng cung cấp mã đầy đủ cho [mcve] – asongtoruin

+0

xin lỗi, cập nhật câu hỏi của tôi trong một chút – Ancient

+0

@Ancient, tôi đã chạy mã của bạn mà không gặp bất kỳ sự cố nào và tôi có thể thấy tệp xlsx như dự định. Bạn vẫn còn có một vấn đề? – Eugene

Trả lời

5

bạn có thể tạo xlsx động và đính kèm qua email.

from cStringIO import StringIO 
import base64 
workbook = xlsxwriter.Workbook('demo.xlsx') 
worksheet = workbook.add_worksheet() 
worksheet.set_column('A:A', 20) 
bold = workbook.add_format({'bold': True}) 
worksheet.write('A1', 'Hello') 
worksheet.write('A2', 'World', bold) 
worksheet.write(2, 0, 123) 
worksheet.write(3, 0, 123.456) 
fp = StringIO() 
workbook.save(fp) 
fp.seek(0) 
datas = base64.encodestring(fp.read()) 
file_name = "name_%s" %(time.strftime('%Y%m%d%H%M%S.xlsx')) 
attachment=[] 
attachment_data = { 
    'name':file_name, 
    'datas_fname':file_name, 
    'datas':datas, 
    'res_model':"modelname", 
    } 
attachment.append(self.env['ir.attachment'].create(attachment_data).id) 

mail_obj=self.env['mail.mail'] 
mail_template=self.env.ref('mail_template_id')   
msg_ids=mail_template.send_mail(id of object) 
msgs=mail_obj.browse(msg_ids) 
msgs.write({'attachment_ids': [(6, 0, attachment)]}) 

Trong mã trên, chúng tôi đã tạo một bản ghi trang tính và sau đó tạo bản ghi tệp đính kèm.

Bạn cần phải cung cấp cho tên, datas_fname, dữ liệu ngay, res_model để tạo tập tin đính kèm. bạn cũng có thể cung cấp cho res_id để tạo tệp đính kèm, sau đó hệ thống sẽ tự động hiển thị tệp đính kèm bên trong mô hình và bản ghi đó.

Sau khi tạo tệp đính kèm, bạn có thể sử dụng động trong email.

Điều này có thể giúp bạn.

+0

Cảm ơn, Nó thực sự giúp đỡ và nó hoạt động. – Ancient

0

Bạn có thể xây dựng báo cáo excel của riêng bạn với sự giúp đỡ của các mô-đun: report_xlsreport_xlsx

Có module đã sử dụng các mô-đun report_xls, nhưng bạn có thể tìm kiếm chúng trong Odoo Apps hoặc trong kho OCA

Một khi bạn đã báo cáo bạn có thể sử dụng chúng như phần còn lại của PDF báo cáo

+0

là có bất kỳ ví dụ nào trong tầm nhìn của bạn, nơi 'report_xls 'được sử dụng – Ancient

+0

mô-đun OCA' account_balance_reporting_xls' sử dụng 'report_xls'. – forvas

+0

Nếu bạn kiểm tra [phiên bản 8.0] (https://www.odoo.com/apps/modules/8.0/report_xls/), bạn có thể đọc một số giải thích cũng như – ChesuCR

Các vấn đề liên quan