ป้ายกำกับ: Openxml Sdk

OpenXML SDK Case: การเขียนข้อมูลลงเซลล์ Excel ทีละแถวแบบ High-Performance สำหรับข้อมูลหลักแสนแถวOpenXML SDK Case: การเขียนข้อมูลลงเซลล์ Excel ทีละแถวแบบ High-Performance สำหรับข้อมูลหลักแสนแถว

ในโลกของการวิเคราะห์ข้อมูลทางธุรกิจ (Business Intelligence) การสร้างรายงานที่ประกอบด้วยชุดข้อมูลขนาดใหญ่เป็นภารกิจที่เกิดขึ้นซ้ำ ๆ และมีความสำคัญอย่างยิ่งต่อการตัดสินใจของผู้บริหาร อย่างไรก็ตาม เมื่อปริมาณข้อมูลเพิ่มขึ้นจนถึงหลักแสนถึงหลักล้านแถว การใช้เครื่องมือหรือไลบรารีทั่วไปในการจัดการไฟล์ Excel มักจะประสบปัญหาคอขวดด้านประสิทธิภาพ (Performance Bottleneck) หรือใช้หน่วยความจำ (Memory) มากเกินไป ทำให้กระบวนการสร้างรายงานล่าช้าและไม่สามารถนำมาใช้ในระบบอัตโนมัติได้จริง

ปัญหาคอขวดของหน่วยความจำ (Memory Bottleneck)

ปัญหาหลักในการเขียนข้อมูลจำนวนมากลงใน Excel คือการที่ไลบรารีส่วนใหญ่มีแนวโน้มที่จะโหลดโครงสร้างเอกสารทั้งหมดเข้าสู่หน่วยความจำ (In-Memory Loading) ก่อนเริ่มกระบวนการ เมื่อขนาดของข้อมูลเกินขีดจำกัดที่ระบบรองรับ จะทำให้เกิดข้อผิดพลาดด้านหน่วยความจำ (Out-of-Memory Error) การแก้ปัญหาด้วย OpenXML SDK จึงต้องอาศัยหลักการ Streaming หรือการเขียนแบบสตรีมมิ่ง

หลักการ Streaming คือการสร้างองค์ประกอบ XML ของแต่ละแถวและบันทึกมันลงในไฟล์โดยตรงทีละส่วน (Chunk by Chunk) แทนที่จะเก็บข้อมูลทั้งหมดไว้ในหน่วยความจำก่อน ซึ่งเป็นหัวใจสำคัญของการประมวลผลข้อมูลขนาดใหญ่ (Big Data) ในรูปแบบไฟล์ Excel

สถาปัตยกรรม High-Performance: PostgreSQL ➡️ OpenXML SDK

เพื่อให้ระบบทำงานได้อย่างมีประสิทธิภาพสูง เราต้องจัดการทั้งสองส่วน: แหล่งข้อมูล (Source) และ การเขียน (Write)

  1. การดึงข้อมูลจาก PostgreSQL: เพื่อป้องกันไม่ให้แอปพลิเคชันหน่วยความจำล่ม เราต้องดึงข้อมูลจาก PostgreSQL เป็นชุดย่อย (Batching) โดยใช้เทคนิค Cursor หรือการจำกัดขอบเขต (LIMIT/OFFSET) แทนการใช้คำสั่ง `SELECT *` ครั้งเดียว
  2. การเขียนด้วย OpenXML SDK: เมื่อได้รับชุดข้อมูลย่อย (Batch) มาแล้ว OpenXML SDK จะถูกใช้เพื่อสร้างไฟล์ Excel โดยการเขียนข้อมูลทีละแถว (Row) และเซลล์ (Cell) โดยไม่เก็บข้อมูลทั้งหมดไว้ในหน่วยความจำ

การทำงานร่วมกันนี้ทำให้เราสามารถประมวลผลชุดข้อมูลหลักแสนแถวได้เสร็จสิ้นภายในเวลาอันสั้น โดยที่หน่วยความจำยังคงอยู่ในระดับต่ำ (Low Memory Footprint) ซึ่งเป็นแนวทางปฏิบัติที่ดีที่สุดในการทำ ETL (Extract, Transform, Load) ไปยังไฟล์รายงาน

ตัวอย่างการดึงข้อมูลจาก PostgreSQL (Batching)

เราจะจำลองการดึงข้อมูลเป็นชุดย่อย (Batch) เพื่อส่งต่อให้ OpenXML SDK ประมวลผล:

SQL

-- การดึงข้อมูลเป็นชุดย่อย (Batching) 1000 แถวต่อรอบ
SELECT id, product_name, sales_amount
FROM sales_report
WHERE report_date = '2023-10-27'
ORDER BY id
LIMIT 1000 OFFSET 0;

หลังจากได้รับชุดข้อมูลนี้แล้ว ระบบจะวนลูป (Loop) เพื่อสร้าง Row และ Cell ใน OpenXML SDK สำหรับชุดข้อมูลถัดไป (Offset 1000, 2000, …) จนกว่าจะครบทุกแถว

บทสรุป: การสร้างรายงานที่ยั่งยืน

การใช้ OpenXML SDK ร่วมกับหลักการ Streaming และการดึงข้อมูลแบบ Batching จาก PostgreSQL ไม่เพียงแต่ช่วยให้เราสามารถจัดการกับข้อมูลหลักแสนแถวได้เท่านั้น แต่ยังช่วยให้ระบบอัตโนมัติ (Automation) ของเรามีความเสถียรสูง (Robust) และใช้ทรัพยากรได้อย่างมีประสิทธิภาพ ทำให้การสร้างรายงาน BI ขนาดใหญ่เป็นไปได้จริงในระดับ Production Environment