Insert Picture pada File Excel [ Python XLWT + Odoo 10 ]
Report Development

Assalamualaikum Warrahmatullahi Wabarrakatuh

Haloooo.. salam damai, salam sejahtera untuk semuanya yang sudah menyempatkan diri mampir disini.

Yak, untuk kali ini saya akan membagikan bagaimana caranya menyertakan gambar pada file excel dengan menggunakan salah satu library python, yaitu XLWT, yang tentu saja diimplementasikan pada aplikasi ERP kesayangan kita, Odoo. :D


Well, kita mulai saja yuk, lets check it out.

  • Buat sebuah file baru bernama xlwt_image.py (nama file opsional) atau bisa langsung download modulenya disini, dan cukup ikuti penjelasannya saja.

  • Lalu tulis code berikut ini, yang berarti import library yang diperlukan.

    import xlwt

    import base64

    from PIL import Image

    from cStringIO import StringIO

    from odoo import models, fields, api, _

  • Selanjutnya tuliskan code berikut sebagai deklarasi class beserta variable - variablenya.

    class xlwt_image(models.TransientModel):

        _name = 'xlwt.image'

        data_file = fields.Binary("File")

        name = fields.Char("Filename")

        pict = fields.Binary("Picture")

  • Lanjut lagi kita buat method untuk eksekusi export/print file excelnya, pada bagian ini juga kita deklarasikan file excel yg akan kita export tsb.

    def export_excel(self, vals, context=None):

            # add an excel file, a sheet with overwrite cell, magnifier code #  

            book = xlwt.Workbook()

            sheet = book.add_sheet("Image On Xls", cell_overwrite_ok=True)

            sheet.normal_magn = 80

  • Decode then buffer it. Mengolah file gambar yang akan disertakan pada file excelnya, tuliskan code berikut ini.

    # decode uploaded pict as base64 and buffer it with StringIO #

            image_base64 = str(self.pict).decode('base64')

            image_data = StringIO(image_base64)

  • Convert it. Gambar yg sudah diolah tadi akan diconvert menjadi file bmp, yang mana memang library XLWT hanya support import file bmp saja, tuliskan code berikut ini dan pada code img.save kamu harus ganti ke path folder kamu ya.

             img = Image.open(image_data).convert('RGB')

            img.save('/home/odhon/Pictures/pict.bmp') 

  • Place it. Gambar akan ditempatkan pada excel, sesuaikan parameter path folder, nomor baris kolom dan skalanya.

          sheet.insert_bitmap('/home/odhon/Pictures/pict.bmp', 3, 3, x=10, y=10, scale_x=1, scale_y=1)

  • Finally save it. Berikut ini code untuk memproses penyimpanan file excel yg sudah diolah sedemekian rupa. File akan tersimpan pada variable pict yg sudah kita deklarasikan di awal tadi.

          # finally save it, write out and return it to xml view # 

            file_data = StringIO()

            book.save(file_data)

            filename = 'Image On Xls.xls'

            out = base64.encodestring(file_data.getvalue())

            self.write({'data_file': out, 'name': filename})

            view_rec = self.env['ir.model.data'].get_object_reference('xlwt_image', 'view_wizard_xlwt_image')

            view_id = view_rec[1] or False

  • Selesaikah ? belum ya, karena perlu ditentukan akan mau dibawa kemana hubungan kita eh proses pengolahan tadi. tuliskan code berikut ini. 

     return {

                'view_type': 'form',

                'view_id': [view_id],

                'view_mode': 'form',

                'res_id': self.id,

                'res_model': 'xlwt.image',

                'type': 'ir.actions.act_window',

                'target': 'new',

            } 

  • Selanjutnya, buatlah sebuah file bernama xlwt_views.xml, artinya file ini sebagai deklarasi untuk tampilan dari proses export excel.

  • Pendeklarasian tsb adalah deklarasi form yang berisi variable dan button, 2 buah menuitem yaitu menuitem sebagai menu baru bernama Reports dan menuitem lainnya sebagai submenunya, dan juga ada deklarasi action window untuk aksi saat proses click menuitem tsb.

     <?xml version="1.0" encoding="utf-8"?>

    <odoo>

        <record model="ir.ui.view" id="view_wizard_xlwt_image">

            <field name="name">xlwt.image.wizard.form</field>

            <field name="model">xlwt.image</field>

            <field name="arch" type="xml">

                <form string="XLWT Report">

                    <group>

                        <group>

                            <field name="pict"/>

                        </group>

                        <group>

                            <field name="name" invisible='True'/>

                            <field name="data_file" filename="name" widget="binary" attrs="{'readonly':True}"/>

                        </group>

                    </group>

                    <footer>

                        <button name="export_excel" string="Print" type="object" class="oe_highlight"/>

                        or

                        <button string="Cancel" class="oe_link" special="cancel"/>

                    </footer>

                </form>

            </field>

        </record>

        <act_window id="launch_xlwt_image"

                    name="Image on xls (XlWT)"

                    src_model="xlwt.image"

                    res_model="xlwt.image"

                    view_mode="form"

                    target="new"

                    key2="client_action_multi"/>

        <menuitem id="menu_hr_reports" name="Reports" parent="hr.menu_hr_root" sequence="93"/>

        <menuitem id="menu_xwlt_image" name="Write Image On Xls" action="launch_xlwt_image parent="menu_hr_reports" sequence="1"/>

    </odoo>

  • Nah, jika sudah selesai maka saya sarankan membuat folder module baru.

  • Lalu simpan file xlwt_image.py pada folder models.

  • Masih di folder models pada file __init__.py, tambahkan code from . import xlwt_image

  • Lalu simpan file xlwt_views.xml pada folder views.

  • Edit file __manifest__.py pada folder module, pastikan xlwt_views.xml ada pada data yang akan di load dengan code berikut; 'data': ['views/xlwt_views.xml'],

  • Install module pada Odoo Server, dan akses module tsb pada Menu Employee.

  • Next, upload file gambar yang akan disertakan pada file excel.

  • Click Print untuk mencetak filenya.

  • Click icon download pada field File untuk mendownloadnya.

  • Dan seperti ini lah hasilnya

Alhamdulillah selesai sudah postingan kali ini, sebagai kesimpulannya bahwa tentu saja adanya fitur insert picture ini sangat berguna untuk keperluan report management, karena memang ada saja permintaan dari client untuk menyertakan logo perusahaannya pada file reportnya. Nah iya ya..

Oke deh, mudah - mudahan bermanfaat ya, mohon maaf jika ada kesalahan dalam penulisan postingan ini.

Wassalamu'alaikum warrahmatullahi wabarrakatuh...




Memberikan Nilai Default Untuk Field One2Many dari Event Create dan Onchange