1 of 31

Python openpyxl (cont.)

2 of 31

สไตล์ (Style)

Styles ถูกใช้เพื่อเปลี่ยนลักษณะการแสดงผลของข้อมูลของคุณขณะปรากฏบนหน้าจอ นอกจากนี้ยังใช้เพื่อกำหนดรูปแบบการแสดงผลของตัวเลขอีกด้วย

Styles สามารถนำไปใช้กับองค์ประกอบต่อไปนี้:

  • font เพื่อกำหนดขนาดตัวอักษร สี การขีดเส้นใต้ เป็นต้น
  • fill เพื่อกำหนดลวดลาย (pattern) หรือการไล่ระดับสี (color gradient)
  • border เพื่อกำหนดเส้นขอบของเซลล์
  • cell alignment การจัดตำแหน่งข้อความภายในเซลล์
  • protection การป้องกัน/การล็อกเซลล์

3 of 31

ค่าต่อไปนี้เป็นค่าเริ่มต้น (default values)�

from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font

font = Font(name='Calibri',

                size=11,

                bold=False,

                italic=False,

                vertAlign=None,

                underline='none',

                strike=False,

                color='FF000000')

fill = PatternFill(fill_type=None,

                start_color='FFFFFFFF',

                end_color='FF000000')

border = Border(left=Side(border_style=None,

                          color='FF000000'),

                right=Side(border_style=None,

                           color='FF000000'),

                top=Side(border_style=None,

                         color='FF000000'),

                bottom=Side(border_style=None,

                            color='FF000000'),

                diagonal=Side(border_style=None,

                              color='FF000000'),

                diagonal_direction=0,

                outline=Side(border_style=None,

                             color='FF000000'),

                vertical=Side(border_style=None,

                              color='FF000000'),

                horizontal=Side(border_style=None,

                               color='FF000000')

               )

alignment=Alignment(horizontal='general',

                    vertical='bottom',

                    text_rotation=0,

                    wrap_text=False,

                    shrink_to_fit=False,

                    indent=0)

number_format = 'General'

protection = Protection(locked=True,

                        hidden=False)

4 of 31

Cell Styles and Named Styles��

มี Styles อยู่ 2 ประเภท คือ Cell Styles และ Named Styles ซึ่งเรียกอีกอย่างว่า Style Templates (แม่แบบสไตล์)

  • Cell styles จะถูกใช้งานร่วมกันระหว่างวัตถุต่าง ๆ และเมื่อถูกกำหนดให้กับเซลล์แล้ว จะไม่สามารถเปลี่ยนแปลงได้ วิธีนี้ช่วยป้องกันผลกระทบที่ไม่พึงประสงค์ (side-effects) เช่น การเปลี่ยนรูปแบบของหลาย ๆ เซลล์โดยไม่ได้ตั้งใจ ในกรณีที่ต้องการเปลี่ยนเพียงเซลล์เดียว
  • Named Styles ตรงกันข้ามกับ Cell Styles นั้น Named Styles สามารถแก้ไขเปลี่ยนแปลงได้ (mutable) เหมาะสำหรับกรณีที่คุณต้องการกำหนดรูปแบบให้กับหลาย ๆ เซลล์พร้อมกัน
  • หมายเหตุ เมื่อคุณกำหนด Named Style ให้กับเซลล์แล้ว การเปลี่ยนแปลงเพิ่มเติมของสไตล์นั้นในภายหลัง จะไม่ส่งผลต่อเซลล์ที่ได้กำหนดไปแล้ว

5 of 31

Cell Styles��

6 of 31

Copying styles

7 of 31

Colors

สีสำหรับตัวอักษร พื้นหลัง เส้นขอบ เป็นต้น สามารถกำหนดได้ 3 วิธี คือ indexed, aRGB หรือ theme

  • Indexed colours เป็นวิธีการแบบดั้งเดิม (legacy) โดยค่าสีจะขึ้นอยู่กับดัชนี (index) ที่กำหนดไว้ในไฟล์ workbook หรือค่าเริ่มต้นของโปรแกรม
  • Theme colours เหมาะสำหรับการใช้เฉดสีที่เข้ากัน (complementary shades) แต่จะขึ้นอยู่กับการมีอยู่ของธีม (theme) ภายใน workbook
  • ดังนั้น จึงแนะนำให้ใช้สีแบบ aRGB เนื่องจากมีความชัดเจนและไม่ขึ้นอยู่กับธีมของไฟล์

8 of 31

Indexed Colors

9 of 31

Indexed Colors

10 of 31

Styling Merged Cells

  • Merged cell (เซลล์ที่ถูกรวมกัน) มีพฤติกรรมคล้ายกับเซลล์ทั่วไป โดยค่า (value) และรูปแบบ (format) จะถูกกำหนดจากเซลล์มุมซ้ายบนของช่วงที่ถูกรวม
  • หากต้องการเปลี่ยนเส้นขอบ (border) ของเซลล์ที่ถูกรวมทั้งหมด ให้เปลี่ยนเส้นขอบที่เซลล์มุมซ้ายบน
  • ทั้งนี้ รูปแบบการจัดรูปแบบ (formatting) จะถูกสร้างขึ้นเพื่อวัตถุประสงค์ในการเขียนข้อมูล (writing) เท่านั้น

11 of 31

12 of 31

Using number formats

  • คุณสามารถกำหนดรูปแบบตัวเลข (number format) ให้กับเซลล์ได้ หรือในบางกรณี (เช่น วันที่และเวลา — datetime) ระบบจะจัดรูปแบบให้อัตโนมัติ

13 of 31

Moving ranges of cells

  • การย้ายช่วงของ cell ใน worksheet เดียวกัน

  • คำสั่งนี้จะย้ายเซลล์ในช่วง D4:F10 ขึ้นไปหนึ่งแถว และไปทางขวาสองคอลัมน์ โดยเซลล์ที่ถูกย้ายจะเขียนทับ (overwrite) เซลล์ที่มีอยู่เดิม

14 of 31

15 of 31

Merge / Unmerge cells

  • เมื่อคุณทำการรวมเซลล์ (merge cells) เซลล์ทั้งหมด ยกเว้นเซลล์มุมซ้ายบน จะถูกลบออกจากแผ่นงาน (worksheet)

16 of 31

Using filters and sorts

  • ในการเพิ่มตัวกรอง (filter) คุณต้องกำหนดช่วงข้อมูล (range) ก่อน จากนั้นจึงเพิ่มคอลัมน์ที่ต้องการกรอง
  • คุณสามารถกำหนดช่วงที่ต้องการใช้ตัวกรองได้โดยการตั้งค่าคุณสมบัติ ref
  • หลังจากนั้น ตัวกรองจะถูกนำไปใช้กับคอลัมน์ภายในช่วงดังกล่าว โดยใช้ดัชนีแบบเริ่มนับจากศูนย์ (zero-based index) ตัวอย่างเช่น หากช่วงข้อมูลคือ A1:H10 ค่า colId = 1 จะอ้างถึงคอลัมน์ B

17 of 31

Using filters and sorts

18 of 31

Using filters and sorts

19 of 31

20 of 31

Advanced filters : CustomFilter

  • CustomFilters สามารถกำหนดเงื่อนไขได้หนึ่งหรือสองเงื่อนไข โดยเงื่อนไขเหล่านี้สามารถทำงานแยกจากกัน (ซึ่งเป็นค่าเริ่มต้น) หรือทำงานร่วมกันโดยการตั้งค่าแอตทริบิวต์ and_ตัวกรอง (Filter) สามารถใช้ตัวดำเนินการ (operators) ต่อไปนี้: equal, lessThan, lessThanOrEqual, notEqual, greaterThanOrEqual, greaterThan.
  • Filter values < 10 and > 90:

21 of 31

22 of 31

23 of 31

Simple Formualae

  • การใช้สูตรต้องใช้ชื่อฟังก์ชันเป็นภาษาอังกฤษ และอาร์กิวเมนต์ของฟังก์ชันต้องคั่นด้วยเครื่องหมายจุลภาค (comma) เท่านั้น ไม่ใช่เครื่องหมายวรรคตอนอื่น เช่น เครื่องหมายอัฒภาค (semicolon)

24 of 31

Array Formulae

  • แม้ว่า array formulae จะถูกนำไปใช้กับช่วงของหลายเซลล์ แต่สูตรจะแสดงให้เห็นเฉพาะที่เซลล์มุมซ้ายบนของช่วงนั้นเท่านั้น
  • สิ่งนี้อาจทำให้เกิดความสับสนและเป็นสาเหตุของข้อผิดพลาดได้
  • หากต้องการตรวจสอบว่าใน worksheet มี array formulae หรือไม่ คุณสามารถใช้คุณสมบัติ ws.array_formulae ซึ่งจะคืนค่าเป็นพจนานุกรม (dictionary) ของเซลล์ที่มีการกำหนด array formula พร้อมทั้งช่วง (range) ที่สูตรนั้นถูกนำไปใช้

25 of 31

26 of 31

Inserting an image

27 of 31

Assignment

  • โจทย์: เขียนโปรแกรม Python ด้วย openpyxl เพื่อสร้างไฟล์ sales_report.xlsx จากข้อมูลยอดขายรายรายการ (กำหนดเป็น list ของ dict ในโค้ด) และจัดรูปแบบ/ฟีเจอร์ตามข้อกำหนดด้านล่าง โดยต้องประยุกต์แนวคิดเรื่อง Styles / Named Styles / aRGB / Merged cells / Number formats / Filters + CustomFilter / Formula
  • ข้อมูลตั้งต้น (ให้ใส่ในโค้ด) ให้สร้างตัวแปร data เป็น list ของ dict อย่างน้อย 12 แถว โดยมีคีย์:
    • date (ชนิด datetime)
    • product (str)
    • qty (int)
    • unit_price (float)

28 of 31

data = [�{"date": datetime(2026, 2, 1), "product": "Kiwi", "qty": 2, "unit_price": 35.0},�{"date": datetime(2026, 2, 2), "product": "Grape", "qty": 15, "unit_price": 12.5},�{"date": datetime(2026, 2, 3), "product": "Apple", "qty": 3, "unit_price": 18.0},�{"date": datetime(2026, 2, 4), "product": "Peach", "qty": 1, "unit_price": 22.0},�{"date": datetime(2026, 2, 5), "product": "Pomegranate", "qty": 3, "unit_price": 45.0},�{"date": datetime(2026, 2, 6), "product": "Pear", "qty": 2, "unit_price": 16.0},�{"date": datetime(2026, 2, 7), "product": "Tangerine", "qty": 11, "unit_price": 14.0},�{"date": datetime(2026, 2, 8), "product": "Blueberry", "qty": 2, "unit_price": 55.0},�{"date": datetime(2026, 2, 9), "product": "Mango", "qty": 5, "unit_price": 30.0},�{"date": datetime(2026, 2, 10), "product": "Banana", "qty": 12, "unit_price": 8.0},�{"date": datetime(2026, 2, 11), "product": "Orange", "qty": 2, "unit_price": 15.0},�{"date": datetime(2026, 2, 12), "product": "Cherry", "qty": 20, "unit_price": 60.0},�]

29 of 31

Assignment (cont.)

  • รูปแบบไฟล์ที่ต้องสร้าง
    • สร้างชีตชื่อ Report พร้อมคอลัมน์เรียงดังนี้:�Date | Product | Qty | Unit Price | Amount
    • โดย Amount = Qty * Unit Price
  • ข้อกำหนดที่ต้องทำ
    1. หัวรายงานแบบ Merge
      • แถวที่ 1 ให้รวมเซลล์ A1:E1 เป็นหัวเรื่อง “Sales Report”
      • จัดกึ่งกลาง และใส่สไตล์เด่น (ตัวหนา/ขนาดใหญ่/พื้นหลังสี)
    2. ใช้ NamedStyle อย่างน้อย 2 แบบ
      • HeaderStyle สำหรับแถวหัวตาราง (แถว 2): ตัวหนา + fill สี (กำหนดสีแบบ aRGB)
      • MoneyStyle สำหรับคอลัมน์ Unit Price และ Amount: ตั้ง number format ให้เป็นสกุลเงิน (money_style.number_format = '"฿"#,##0.00')

30 of 31

Assignment (cont.)

    • ใส่สูตร (Formula)
  1. ในคอลัมน์ Amount ให้เขียนเป็นสูตร Excel (เช่น =C3*D3 ไล่ลงไป)
  2. ที่แถวสุดท้ายให้สรุปยอดรวม Total โดยใช้ SUM
    • ใส่ Filter + CustomFilter
  3. ตั้ง auto_filter.ref ให้ครอบคลุมข้อมูลตั้งแต่หัวตารางถึงแถวสุดท้าย (เช่น A2:E13)
  4. เพิ่ม CustomFilter ที่คอลัมน์ Qty ให้แสดงเฉพาะรายการที่ qty < 3 หรือ qty > 10 (ใช้ 2 เงื่อนไข)
  5. ผลลัพธ์ที่ต้องส่ง
  6. ไฟล์ sales_report.xlsx
  7. โค้ด Python 1 ไฟล์ (.py) ที่รันแล้วสร้างไฟล์ได้ทันที

31 of 31