เมื่อต้องเขียนโปรแกรมเพื่อสร้างเอกสาร Word (.docx) อัตโนมัติด้วยไลบรารีต่าง ๆ เช่น Open XML SDK, python-docx, Apache POI หรือไลบรารีระดับองค์กรอย่าง Aspose.Words สิ่งที่มักทำให้นักพัฒนาสะดุดบ่อยที่สุดคือ “ชื่อเรียกของสไตล์ตารางสำเร็จรูป (Built-in Table Styles)” เนื่องจากชื่อที่มองเห็นบนหน้าจอโปรแกรม Microsoft Word กับรหัสภายในที่ใช้สั่งงานในระดับโค้ดนั้นไม่ได้เหมือนกันเสียทีเดียว
บทความนี้จะพาไปเจาะลึกความสัมพันธ์ระหว่าง Display Name และ OpenXML Style ID พร้อมแนวทางการเรียกใช้งาน และแหล่งข้อมูลอ้างอิงสำหรับนำไปต่อยอด
Display Name vs Style ID: ทำไมถึงไม่เหมือนกัน?
ในสถาปัตยกรรม Office Open XML (ECMA-376) เอกสารจะแยกส่วนการแสดงผลออกจากตัวระบุข้อมูล
- UI Display Name (ชื่อที่แสดงบน Ribbon)
เป็นชื่อที่ถูกแปลตามภาษาของระบบ (Localized) เช่น ภาษาอังกฤษคือGrid Table 4 - Accent 1หรือในภาษาไทยคือตารางเส้นตาราง 4 - เน้น 1 - Built-in Style ID (รหัสโปรแกรมมิ่ง)
เป็นค่าคงที่ตามสเปกสากล ไม่มีเว้นวรรค และคำนึงถึงตัวพิมพ์เล็ก-ใหญ่ (Case-Sensitive) เช่นGridTable4-Accent1ซึ่งโปรแกรม Microsoft Word ทุกเวอร์ชันทั่วโลกจะใช้ ID นี้เหมือนกันทั้งหมด
ตารางเทียบเคียง Built-in Table Style ยอดนิยม
ตารางสรุปการจับคู่ระหว่างชื่อบนหน้าจอ (Display Name) กับ Style ID จริงที่ส่งในแท็ก <w:tblStyle w:val="..."/>:
| หมวดหมู่ | Display Name (UI / python-docx) | OpenXML Style ID (C# / Open XML SDK) | โทน Accent ที่รองรับ |
|---|---|---|---|
| Plain | Table Grid | TableGrid | ไม่มี (ขาว/ดำ) |
| Plain | Plain Table 1 – 5 | PlainTable1 ถึง PlainTable5 | ไม่มี |
| Grid (Light) | Grid Table 1 Light | GridTable1Light | Base + Accent 1–6 |
| Grid (Light) | Light Shading | LightShading-Accent1 | Accent 1–6 |
| Grid (Medium) | Grid Table 2 | GridTable2-Accent1 | Accent 1–6 |
| Grid (Medium) | Grid Table 4 | GridTable4-Accent1 | Accent 1–6 |
| Grid (Dark) | Grid Table 6 Colorful | GridTable6Colorful-Accent1 | Accent 1–6 |
| List (Light) | List Table 1 Light | ListTable1Light-Accent1 | Base + Accent 1–6 |
| List (Medium) | List Table 3 | ListTable3-Accent1 | Accent 1–6 |
| List (Dark) | List Table 7 Colorful | ListTable7Colorful-Accent1 | Accent 1–6 |
รูปแบบการเรียกใช้งานในแต่ละภาษาและไลบรารี
C# (Open XML SDK)
ใน Open XML SDK จะรับค่าเป็น StringValue จึงต้องส่ง Style ID ตัวจริงที่ไม่มีเว้นวรรค
// กำหนด Style ID โดยตรง
table.AppendChild(new TableProperties(
new TableStyle() { Val = "GridTable4-Accent1" },
new TableLook() { Val = "04A0", FirstRow = true, NoHorizontalBand = false }
));
Python (python-docx)
ไลบรารี python-docx ออกแบบมาให้ใช้ง่าย โดยอนุญาตให้ส่ง Display Name แบบภาษาอังกฤษ (มีเว้นวรรค) ได้โดยตรง เนื่องจากตัวไลบรารีมีดิกชันนารีแปลงชื่ออยู่เบื้องหลัง
# ส่งชื่อแบบ Display Name ได้ทันที
table = doc.add_table(rows=3, cols=3)
table.style = 'Grid Table 4 Accent 1'
# หรือเรียกใช้ Core Style
table.style = 'Table Grid'
Enterprise SDK (Aspose.Words / Syncfusion)
ไลบรารีเชิงพาณิชย์มักจะเตรียม Enum สำเร็จรูปมาให้ เพื่อป้องกันข้อผิดพลาดจากการพิมพ์ String พลาด (Typo)
// ตัวอย่างของ Aspose.Words
table.StyleIdentifier = TableStyleIdentifier.GridTable4Accent1;
// ตัวอย่างของ Syncfusion DocIO
table.ApplyStyle(BuiltinTableStyle.GridTable4Accent1);
ข้อมูลอ้างอิงสำหรับศึกษาต่อ (References)
สำหรับผู้ที่ต้องการดูนิยามโครงสร้างสเปก XML และรายการสไตล์ทั้งหมด สามารถศึกษาเพิ่มเติมได้จากแหล่งข้อมูลหลักดังนี้:
- มาตรฐานสากล ECMA-376 (Office Open XML File Formats)
เอกสารสเปกข้อกำหนดทางการในส่วน Part 1: Fundamentals and Markup Language Reference (หัวข้อย่อย17.7.4 Table Stylesและ17.7.4.4 tblStyle) - Microsoft Learn – WdBuiltinStyle Enumeration
เอกสารอ้างอิงค่า Enum สำหรับนักพัฒนา Office VBA / VSTO ครอบคลุมชุดรหัสสไตล์ทั้งหมดที่ฝังอยู่ในตัว Microsoft Word - DocumentFormat.OpenXml API Documentation
คู่มือคลาสTableStyleและTableLookของไลบรารี Open XML SDK อย่างเป็นทางการจาก Microsoft - python-docx Documentation (Understanding Styles)
คู่มือโครงสร้างการจัดการสไตล์ตารางและตารางจับคู่ชื่อ Built-in Style ในระบบนิเวศของภาษา Python