Excel (import/export/report) ผ่าน Template

หมายเหตุ: บทความนี้เขียนมาจากการเข้าร่วม Talk ในงาน Odoo Days 2020 (youtube นาทีที่ 0:50 – 1:17)

ผ่านมาหลายปีแล้วที่ผมได้รู้จักกับ กลุ่ม OCA และได้ความรู้มากมาย และก็ได้ใช้ Tools ต่างๆของ OCA มาช่วยทำงานโครงการต่างๆ วันนี้จึงถือเป็นโอกาสดีที่จะได้ร่วมแบ่งปัน Tools ตัวหนึ่งที่พัฒนาให้กับ OCA โดย Ecosoft บ้างครับ

โมดูลที่จะแชร์วันนี้คือ excel_import_export จริงๆแล้วถ้าคุณเข้าไปที่ OCA app store https://odoo-community.org/shop แล้วเลือก sorting เป็นแบบ Max Download จะพบว่าโมดูลนี้ติด Top 5 ของการดาวน์โหลดเลยทีเดียว ไม่ว่ายุคไหน Excel ก็ยังเป็น Tools ที่สำคัญ

อย่างแรกเลย ทำไมเราถึงต้องมีโมดูลที่ใช้ทำ Excel Report ขึ้นมาอีกทั้งๆที่ OCA ก็มีโมดูล report_xlsx ใช้อยู่แล้ว ซึ่งก็ใช้งานได้ดีสำหรับการสร้างไฟล์แบบ Excel และถูกใช้จนแทบจะเป็นมาตรฐานของ OCA อยู่แล้ว (แบบที่ QWeb ใช้ทำ PDF)

แล้วทำไมยังต้องสร้าง excel_import_export ขึ้นมาอีก?

สาเหตุเป็นเพราะว่าเมื่อประมาณ 2-3 ปีก่อน Ecosoft ได้รับทำโปรเจคหนึ่งซึ่งมีความต้องการการใช้งาน Excel ในแบบที่ tools เท่าที่มีทั้งหมดของ Odoo และ OCA ช่วยเราไม่ได้ กล่าวคือ

  • เราต้องสร้างรายงานในรูปแบบ Excel เยอะมากๆ มันต้องทำได้ง่ายและเร็วพอ และต้องพร้อมให้ปรับรูปแบบได้ง่าย (ไม่งั้นเราจะต้องมาวนเสียเวลากลับการแก้ไขโค้ด เพียงเพื่อความสวยงามของ excel)
  • พนักงานในองค์กรในส่วนที่ไม่เกี่ยวกับการใช้ระบบ Odoo โดยตรง ต้องวางแผนงบประมาณประจำปี Budget Planning ผ่าน Excel ซึ่งต้องสามารถนำแผนนี้ Import กลับเข้าระบบได้ด้วย (ตัวไฟล์ทำงานเองก็ต้องใช้งานง่าย ป้องการการใส่ข้อมูลผิดพลาดได้ เช่นมี dropdown และอื่นๆ)

สรุปง่ายๆคือ Excel ก็ควรมีความเป็น Excel ที่สามารถใช้ features ต่างๆของ Excel ได้เต็มที่ ซึ่งตรงนี้ Tools เท่าที่ผมพยายามหาไม่ตอบโจทย์แน่ สิ่งที่ผมคิดตอนนั้นคือ เราน่าจะสามารถออกแบบตัว Excel ได้ด้วยการใช้ Excel เอง ความสวยงามน่าใช้ และความสะดวกสบายก็น่าจะดีกว่า

ภาพด้านล่างนี้แสดงให้เห็นว่า โดยปกติแล้ว report_xlsx หรือ excel generator อื่นๆทำงานโดยใช้ python code สร้างไฟล์ Excel โดยตรง (แปลว่าถ้าอยากเป็นอะไรบน Excel ต้องมาเปลี่ยนที่โค้ด)

report_xlsx

แต่วิธีการทำงานของ excel_import_export จะต่างกัน โดยจะทำสองส่วนแยกจากกัน

  1. ออกแบบตัว excel template ก่อน เอาที่สบายใจ
  2. ทำ instruction ที่บอกว่าจะเอาข้อมูลที่ได้ไปใส่ใน excel อย่างไร ในรูปแบบ dictionary ที่เข้าใจง่าย

ตัวอย่างในรูปด้านล่าง สามารถอ่านความได้ว่า ให้เอาข้อมูลที่ได้ไปวางลงที่ Sheet 1 ของ file excel ที่ออกแบบไว้ โดยข้อมูล จากฟิลด์ results ให้นำไปเริ่มต้นที่ A4 ด้วย id, B4 ด้วย name และต่อไปเรื่อยๆ C4, D4, …

ผมคิดว่าใครดูก็น่าจะเข้าใจ โดย instruction จะมีทั้ง __EXPORT__ และ __IMPORT__ ทำงานคล้ายๆกันแต่กลับด้าน

หัวใจของ excel_import_export ก็คือ Template นั่นเอง ซึ่งจะเป็นที่รวมของทั้ง excel template file และ dictionary instruction เมื่อมันถูกเรียกใช้งาน data ที่ input เข้ามา จะรวมกับ instruction สร้างเป็นผลลัพธ์ไฟล์ excel

หน้าต่าง Template

Core APIs

เราอยากให้ developer สามารถนำฟังก์ชั่นนี้ไปเรียกใช้ได้ด้วยง่ายจากโปรแกรมอื่นๆตามต้องการ จึงออกแบบให้มีแค่ 2 ฟังก์ชั่นการทำงานหลักดังนี้

  • self.env[‘xlsx.export’].export_xlsx(template, model, rec)
  • self.env[‘xlsx.import’].import_xlsx(file, template, model)

สำหรับการสร้าง report เราจะสามารถเรียกผ่านฟังก์ชั่่นตามด้านล่างนี้ซึ่งจริงๆก็ผ่านไปเรียกใช้ export_xlsx() อีกทีนั่นเอง

  • self.env[‘xlsx.report’].report_xlsx(…)

เท่าที่อธิบายมาคงพอเข้าใจในหลักการทำงานของโมดูลนี้แล้วนะครับ ซึ่งการนำไปใช้มีได้หลายรูปแบบทีเดียว แต่ที่ใช้เยอะกว่าแบบอื่นก็คือการเอาไปทำรายงาน และการใช้ excel template เป็นแกนทำให้ได้ประโยชน์หลายอย่าง เช่น

  1. เราจะยังสามารถใช้ความสามารถทั้งหมดของ Excel ได้ตามปกติ ทั้งความสวยงาม, สูตรคำนวน, dropdown list, lock pane, graph, และอื่นๆ
  2. แทบไม่ต้องเขียน Python Code เลยในส่วนของการสร้าง Excel
  3. สามารถปรับแต่งได้เพิ่มเติมผ่านหน้าจอ Template โดยตรง โดยไม่ต้องกลับไปที่ addon

สำหรับผู้ที่สนใจนำโมดูลนี้ไปใช้งาน ก็มีหลายตัวอย่างใน excel_import_export_demo ท่านที่สนใจสามารถดาวน์โหลดไปตั้งต้นได้ ในที่นี้ผมจะเอาบางตัวอย่างมาอธิบายไว้พอสังเขป

ตัวอย่าง Use Case

1) Purchase Order Import / Export

ตัวอย่าง: excel_import_export_demo/import_export_purchase_order

นี่เป็นกรณีที่ต้องการ Export Purchase Order ทำการแก้ไขบน excel แล้วโหลดกลับเข้ามาใหม่ โดยเราจะทำการสร้าง Action เพิ่มเติมตามรูป

และเราจะได้ใช้ Template ที่สวยงามตามต้องการ

Step 1: สร้าง Actions — import / export

ขั้นคอนนี้เป็นการสร้าง menu, actions ตามปกติของ Odoo โดยจะทกำาร inherit model “export.xlsx.wizard”

Step 2: สร้าง excel template และ instruction

ตัวอย่าง: excel_import_export_demo/report_sale_order

ไฟล์ excel template file และ dictionary instruction จะถูกโหลดเข้าไปที่หน้าต่าง XLSX Template และพร้อมให้ถูกเรียกใช้ ผมขออธิบายพอสังเขปตามรูปด้านล่าง

  • ‘__EXPORT__’ : export instruction
  • ‘purchase’: export ไปที่ sheet ที่ชื่อว่า “purchase”
  • ‘_HEAD_’: ข้อมูลของ purchase.order จะถูกวางบน cell ต่างๆ, เช่น, B1: เป็นข้อมูลผ่าน orm <purchase.order>.partner_id.contact_address

ทำเท่านี้ก็จะได้ฟังก์ชั่นตามต้องการ คราวนี้ลองมาดูตัวอย่างถัดไปกันครับ

2) Sales Report

เนื่องจากเป็นรายงานที่รันผ่าน Search Wizard (ไม่ใช่ action ที่ไป hook ไว้ที่ตัว purchase.order โดยตรง) สิ่งที่แตกต่างคือ เราจะต้องเขียนโค้ดส่วนการสร้าง search criteria และการได้มาซึ่งข้อมูลที่ต้องการก่อน

Step 0: เขียนโค้ส่วนการสร้าง search wizard และได้เอาข้อมูล.

ทำการสร้าง wizard โดยใช้ตัวช่วย _inherit = “xlsx.report”

  • partner_id: คือ custom search criteria ที่เราต้องใช้
  • results: เป็น many2many field ที่จะเก็บข้อมูลหลังการ search เพื่อนำไปแสดงผล

Step 1: สร้าง Menu / Action ตามปกติ

เขียน Wizard form โดยใช้ตัวช่วย inherit_id = “excel_import_export.xlsx_report_view”

Step 2: สร้าง excel template และ instruction

ขั้นตอนสุดท้ายเช่นเคย คือการสร้าง template และ instruction

และทั้งหมดก็คือการอธิบายหลักการทำงานโดยสังเขป เมื่อเรายังสามารถใช้ความสามารถทุกอย่างของ Excel ได้เต็มที่ ทุกอย่างก็อยู่ที่จินตนาการของคุณแล้ว 🙂

Reference

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *