φυβλαςのβλογ
phyblas的博客



การใช้ python-docx เพื่ออ่านและเขียนไฟล์เวิร์ด (.docx)
เขียนเมื่อ 2023/03/12 22:48
แก้ไขล่าสุด 2024/02/17 16:15
 

python-docx เป็นมอดูลในไพธอนที่ใช้จัดการกับไฟล์ไมโครซอฟต์เวิร์ด (.docx) ทำได้ทั้งเปิดอ่านดูข้อมูลในไฟล์ หรือเขียนไฟล์ขึ้นใหม่ หรือแก้ไขไฟล์ที่มีอยู่แล้วก็ได้

วิธีการใช้มีส่วนคล้ายกับมอดูล python-pptx ที่ใช้จัดการกับไฟล์พาวเวอร์พอยต์ (อ่านได้ใน https://phyblas.hinaboshi.com/20230305) แต่ต่างกันไปในรายละเอียด




การติดตั้งและเริ่มใช้งาน

การติดตั้ง python-docx นั้นทำได้ง่ายโดยใช้ pip เช่นเดียวกับมอดูลอื่นๆในไพธอน
pip install python-docx

เพียงแต่เวลาที่จะใช้งานนั้นจะ import แค่ docx ไม่ใช่ python-docx
import docx

แต่เวลาใช้งานนั้นมักจะ import แต่ละส่วนภายในมอดูลแยกกันไปมากกว่า ในตัวอย่างในที่นี้ก็จะทำแบบนั้นเช่นกัน




การเปิดอ่านไฟล์หรือสร้างไฟล์ใหม่แล้วบันทึกไฟล์ใหม่

การใช้งาน python-docx นั้นโดยทั่วไปแล้วจะเริ่มจากสร้างออบเจ็กต์คลาส Document ซึ่งเป็นออบเจ็กต์ที่แทนตัวไฟล์เอกสาร เวลาที่จะจัดการข้อมูลต่างๆภายในเอกสารก็จะทำผ่านตัวออบเจ็กต์นี้

ปล่อยให้วงเล็บหลัง Document ก็จะเป็นการสร้างเอกสารเปล่าๆขึ้นมา แต่หากใส่ชื่อไฟล์ที่มีอยู่ลงไปก็จะเป็นการเปิดไฟล์นั้นขึ้นมา

ตัวอย่างเช่นถ้าต้องการสร้างเอกสารเปล่าๆขึ้นมาแล้วบันทึกทันทีก็เขียนได้ดังนี้
from docx import Document

doc = Document()
doc.save('เอกสารเปล่า.docx')

ในที่นี้เมธอด .save() ใช้บันทึกไฟล์

ตัวอย่างต่อไป ลองเปิดไฟล์ที่มีอยู่แล้วเพื่อมาดูข้อมูลอะไรต่างๆภายในเอกสารทำได้ดังนี้
from docx import Document

doc = Document('เอกสารอะไรบางอย่าง.docx')
cp = doc.core_properties
print(cp.author) # ผู้สร้างไฟล์
print(cp.created) # วันที่สร้างไฟล์
print(cp.last_modified_by) # ผู้แก้ไฟล์ล่าสุด
print(cp.modified) # วันที่แก้ไฟล์ล่าสุด

แอตทริบิวต์ .core_properties นั้นเป็นตัวเก็บค่าข้อมูลต่างๆที่เกี่ยวข้องกับไฟล์เอกสารนี้ แต่ไม่ได้มีผลต่อเนื้อหาที่อยู่ภายใน




การดูและแก้ข้อความในแต่ละย่อหน้า

เนื้อหาภายในไฟล์เวิร์ดนั้นประกอบด้วยย่อหน้า (paragraph) ต่างๆ โดยตัวเนื้อหาในแต่ละย่อหน้านั้นจะเข้าถึงได้ผ่านแอตทริบิวต์ .paragraphs ของออบเจ็กต์ตัวเอกสาร

เราอาจลองเปิดไฟล์เวิร์ดที่มีอยู่แล้วมาดูว่ามีกี่ย่อหน้า และให้แสดงข้อความภายในแต่ละย่อหน้ามาได้โดยเขียนแบบนี้
from docx import Document

doc = Document('เอกสาร.docx')
print(len(doc.paragraphs)) # จำนวนย่อหน้า
for parag in doc.paragraphs:
    print(parag.text) # ข้อความในย่อหน้านั้น

ในที่นี้ข้อความภายในแต่ละย่อหน้านั้นถูกเก็บอยู่ในแอตทริบิวต์ .text สามารถดูค่าได้ และยังสามารถป้อนข้อความใหม่เข้าไปเพื่อแก้ข้อความภายในได้ด้วย

ตัวอย่างเช่นถ้าต้องการเอาเอกสารที่มีอยู่เดิมมาเติม ~ เข้าไปด้านหน้าหลังของแต่ละย่อหน้าก็อาจเขียนแบบนี้
from docx import Document

doc = Document('เอกสารเดิม.docx')
for parag in doc.paragraphs:
    parag.text = '~'+parag.text+'~'
doc.save('เอกสารหลังแก้.docx')




การใส่ย่อหน้าใหม่หรือแทรกย่อหน้าเข้าไป

การใส่ย่อหน้าใหม่เข้าไปทำได้โดยใช้เมธอด .add_paragraph() โดยใส่ข้อความที่ต้องการลงไปในวงเล็บข้างหลังได้เลย

ตัวอย่างเช่น
from docx import Document

doc = Document()
parag = doc.add_paragraph('ข้อความ')
doc.save('เอกสารที่มีข้อความย่อหน้าเดียว.docx')

หรือหากต้องการจะแทรกย่อหน้าใหม่ลงไปในตำแหน่งที่ไม่ใช่ท้ายสุดก็ทำได้โดยใช้เมธอด .insert_paragraph_before() โดยใช้ที่ตัวออบเจ็กต์ของย่อหน้าที่ต้องการให้อยู่หลังย่อหน้าที่เพิ่มเข้าไปใหม่

เช่นถ้าต้องการเพิ่มข้อความลงไปในย่อหน้าแรกก็อาจเขียนแบบนี้
from docx import Document

doc = Document('เอกสารเดิม.docx')
doc.paragraphs[0].insert_paragraph_before('ข้อความขึ้นต้น')
doc.save('เอกสารที่เติมย่อหน้าขึ้นต้นเข้าไป.docx')




การปรับรูปแบบตัวหนังสือ

ข้อความภายในแต่ละย่อหน้านั้นที่จริงแล้วประกอบไปด้วยหน่วยย่อยที่เรียกว่า run โดยในย่อหน้าหนึ่งอาจประกอบไปด้วยหลาย run ปกติเวลาที่เราสร้างย่อหน้าใหม่ที่มีข้อความขึ้นมานั้นจะมี run อยู่ภายในนั้นอยู่แล้วอันนึง

ตัว run นั้นสามารถเข้าถึงได้โดยผ่านแอตทริบิวต์ .runs ของตัวออบเจ็กต์ย่อหน้า โดยจะเป็นลิสต์ที่เก็บ run ทั้งหมดที่ย่อหน้านั้นมี

ในตัวออบเจ็กต์ run นั้นมีแอตทริบิวต์ต่างๆที่กำหนดรูปแบบของตัวหนังสือ (เช่นฟอนต์, ขนาด, สี) หากต้องการปรับเปลี่ยนรูปแบบตัวหนังสือก็ให้ตั้งค่าที่ตัวแอตทริบิวต์นั้น

ตัวอย่างเช่นถ้าต้องการข้อความที่อักษรมีขนาดใหญ่และฟอนต์ Tahoma ก็เขียนได้โดย
from docx import Document
from docx.shared import Pt

doc = Document()
parag1 = doc.add_paragraph('ฏิฆนะรี')
run1 = parag1.runs[0]
run1.font.size = Pt(100)
run1.font.name = 'Tahoma'
doc.save('เอกสารที่มีตัวหนังสือใหญ่.docx')

แอตทริบิวต์ที่ใช้บ่อยนั้นอาจสรุปได้ดังนี้

แอตทริบิวต์ ความหมาย ค่าที่ใส่
.font.name ชื่อฟอนต์ str
.font.size ขนาดอักษร docx.shared.Pt
.font.color.rgb สี docx.shared.RGBColor
.font.bold
หรือ .bold
ตัวหนา True หรือ False
.font.italic
หรือ .italic
ตัวเอียง
.font.underline
หรือ .underline
ขีดเส้นใต้
.font.strike ขีดฆ่า

สำหรับค่าที่ใส่ในการปรับขนาดตัวหนังสือนี้คือออบเจ็กต์ชนิด docx.shared.Pt เอาไว้แสดงขนาดเป็นหน่วย pt ซึ่งใช้โดยทั่วไปในการเขียนด้วยเวิร์ด แต่นอกจากนี้แล้วอาจใช้หน่วยอื่นเช่น docx.shared.Inches สำหรับหน่วยนิ้ว หรือ docx.shared.Cm สำหรับหน่วยเซนดิเมตรก็ได้ เป็นต้น

ตัวอย่างเพิ่มเติมแสดงการปรับรูปแบบตัวหนังสือแบบต่างๆ
from docx import Document
from docx.shared import Pt
from docx.shared import RGBColor

doc = Document()
parag1 = doc.add_paragraph()

run1 = parag1.add_run()
run1.text = 'หนา'
run1.bold = True

run2 = parag1.add_run()
run2.text = 'เอียง'
run2.italic = True

run3 = parag1.add_run()
run3.text = 'ขีดเส้นใต้'
run3.underline = True

run4 = parag1.add_run()
run4.text = 'แดง'
run4.font.color.rgb = RGBColor(189,0,0)

for run in parag1.runs:
    run.font.size = Pt(60)
    run.font.name = 'Angsana New'

doc.save('เอกสารที่มีตัวหนังสือแบบต่างๆ.docx')

ก็จะได้เอกสารหน้าตาแบบนี้ออกมา






การปรับรูปแบบการจัดเรียงในย่อหน้า

การปรับการจัดวางข้อความภายในย่อหน้าว่าจะให้วางชิดซ้ายหรือชิดขวาหรืออยู่ตรงกลางทำได้โดยแก้ที่แอตทริบิวต์ .alignment โดยใส่ออบเจ็กต์ docx.enum.text.WD_ALIGN_PARAGRAPH เข้าไป

ตัวอย่างเช่น
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = Document()
parag1 = doc.add_paragraph('ข้อความอยู่ตรงกลาง')
parag1.alignment = WD_ALIGN_PARAGRAPH.CENTER
parag2 = doc.add_paragraph('ข้อความอยู่ทางขวา')
parag2.alignment = WD_ALIGN_PARAGRAPH.RIGHT
doc.save('เอกสารที่มีข้อความอยู่ตรงกลางและขวา.docx')

ส่วนการปรับค่าอื่นๆบางส่วนนั้นอยู่ในแอตทริบิวต์ .paragraph_format เช่น

แอตทริบิวต์ ความหมาย ค่าที่ใส่
.first_line_indent ระยะร่นจากขอบซ้ายของบรรทัดแรกของย่อนหน้า docx.shared.Pt
.left_indent ระยะห่างของทั้งย่อหน้าจากขอบซ้าย
.right_indent ระยะห่างของทั้งย่อหน้าจากขอบขวา
.line_spacing ความสูงของย่อหน้านั้น
.space_before ที่ว่างด้านบนก่อนย่อหน้านี้
.space_after ที่ว่างด้านล่างหลังย่อหน้านี้
.page_break_before ให้ย่อหน้านี้อยู่หน้าใหม่เสมอหรือไม่ True หรือ False

ตัวอย่างเช่น ลองสร้างย่อหน้าที่มีการร่นที่บรรทัดแรก
from docx import Document
from docx.shared import Pt

doc = Document()
parag1 = doc.add_paragraph('ข้อความย่อหน้านี้มีการร่นที่บรรทัดแรก เพียงแต่ว่าถ้าขึ้นบรรทัดใหม่จะอยู่ชิดซ้ายตามปกติ บรรทัดต่อไปไม่มีการร่นแต่อย่างใด')
parag1.paragraph_format.first_line_indent = Pt(60)
parag1.runs[0].font.size = Pt(32)
doc.save('เอกสารที่มีการร่นย่อหน้า.docx')



ต่อมาเป็นตัวอย่างการกำหนดระยะที่จะเว้นก่อนหน้าหรือหลังย่อหน้า
from docx import Document
from docx.shared import Pt

doc = Document()
parag1 = doc.add_paragraph('ย่อหน้าแรกอยู่บนสุด')
parag1.runs[0].font.size = Pt(48)

parag2 = doc.add_paragraph('ย่อหน้าสอง เว้นระยะจากย่อหน้าด้านบนไว้สักหน่อย')
parag2.runs[0].font.size = Pt(28)
parag2.paragraph_format.space_before = Pt(45)

parag3 = doc.add_paragraph('ย่อหน้าสาม เว้นระยะจนกว่าจะถึงย่อหน้าต่อไป')
parag3.runs[0].font.size = Pt(32)
parag3.paragraph_format.space_after = Pt(70)

parag4 = doc.add_paragraph('ย่อหน้าสุดท้ายอยู่ล่างสุด')
parag4.runs[0].font.size = Pt(42)

doc.save('เอกสารที่มีการเว้นระยะห่างแต่ละย่อหน้า.docx')



ส่วน .page_break_before นั้นเอาไว้ใช้เวลาที่ต้องการให้ตัดขึ้นหน้าใหม่
from docx import Document
from docx.shared import Pt

doc = Document()
doc.add_paragraph('ข้อความในหน้าแรก')
parag2 = doc.add_paragraph('ข้อความนี้อยู่ในหน้าใหม่')
parag2.runs[0].font.size = Pt(60)
parag2.paragraph_format.page_break_before = True
doc.save('เอกสารที่ย่อหน้าใหม่อยู่หน้าใหม่.docx')






การปรับรูปแบบตัวหนังสือตั้งต้น

หากต้องการปรับตัวหนังสือหมดทั้งเอกสารโดยไม่ต้องมาคอยกำหนดทีละย่อหน้าให้เหนื่อย อาจทำได้โดยตั้งรูปแบบตัวหนังสือผ่าน .styles['Normal']

ตัวอย่างเช่น ถ้าต้องการให้ตัวหนังสือใหญ่หมดทุกย่อหน้าก็ตั้ง .font.size ที่ .styles['Normal'] แล้วถ้ามีตัวหนังสือส่วนไหนที่ต้องการให้ขนาดเล็กก็ค่อยมาตั้งขนาดเปลี่ยนอีกที
from docx import Document
from docx.shared import Pt
from docx.shared import RGBColor

doc = Document()
doc.styles['Normal'].font.size = Pt(60)
doc.styles['Normal'].font.color.rgb = RGBColor(0,112,0)
doc.add_paragraph('ย่อหน้านี้ตัวใหญ่')
parag2 = doc.add_paragraph('ย่อหน้านี้ตัวเล็ก')
parag2.runs[0].font.size = Pt(26)
doc.add_paragraph('ย่อหน้านี้ก็ตัวใหญ่')
doc.save('เอกสารที่ตัวหนังสือส่วนใหญ่ใหญ่.docx')






การปรับขนาดหน้ากระดาษหรือระยะห่างจากขอบหน้ากระดาษ

การปรับขนาดหน้ากระดาษหรือระยะห่างจากขอบด้านต่างๆของหน้ากระดาษนั้นสามารถทำได้โดยปรับที่แอตทริบิวต์ต่างๆใน .sections[0] ซึ่งได้แก่

แอตทริบิวต์ ความหมาย ค่าที่ใส่
.page_width ขวางกว้างของหน้า docx.shared.Pt
.page_height ความสูงของหน้า
.top_margin ระยะห่างของตังหนังสือจากขอบบน
.left_margin ระยะห่างของตังหนังสือจากขอบซ้าย
.right_margin ระยะห่างของตังหนังสือจากขอบขวา
.bottom_margin ระยะห่างของตังหนังสือจากขอบล่าง

ตัวอย่าง
from docx import Document
from docx.shared import Pt

doc = Document()
doc.sections[0].page_width = Pt(460)
doc.sections[0].page_height = Pt(310)
doc.sections[0].top_margin = Pt(5)
doc.sections[0].left_margin = Pt(5)
doc.styles['Normal'].font.size = Pt(60)
doc.add_paragraph('ตัวหนังสือในหน้านี้อยู่แทบจะชิดขอบ')
doc.save('เอกสารที่ตัวหนังสืออยู่แทบชิดขอบ.docx')






การแบ่ง section

ในหัวข้อที่แล้วได้มีการใช้ .sections[0] โดยที่ไม่ได้อธิบายโดยละเอียดว่าหมายถึงอะไร เลยจะมาขอขยายความในนี้สักหน่อย

section ในที่นี้แสดงถึงส่วนของการแบ่งส่วนภายในเอกสาร โดยปกติเวลาที่สร้างเอกสารเปล่าขึ้นมาจะมีอยู่ section นึงอยู่แล้ว ซึ่งก็คือ .sections[0] โดยปกติแล้วไม่จำเป็นจะต้องสร้างส่วนเพิ่ม เพราะมีแค่ส่วนเดียวก็มีหลายหน้าได้อยู่แล้ว เพียงแต่ว่าหากต้องการจะทำให้ในไฟล์นึงมีหน้ากระดาษที่มีคุณสมบัติบางอย่างต่างกันออกไป เช่นขนาดแผ่นกระดาษหรือระยะห่างระหว่างตัวหนังสือกับขอบ เป็นต้น กรณีแบบนี้ก็อาจทำการสร้าง .section เพิ่มโดยการใช้ .add_section() ที่ออบเจ็กต์ตัวเอกสาร

เมื่อสร้างส่วนใหม่ขึ้นมาแล้วหากใช้ .add_paragraph เพื่อใส่ย่อหน้าใหม่ ย่อหน้านั้นก็จะไปอยู่ในส่วนใหม่

ตัวอย่าง ลองสร้างเอกสารที่มีการแบ่งเป็นส่วนต่างๆ
from docx import Document
from docx.shared import Pt

doc = Document()
doc.styles['Normal'].font.size = Pt(30)

sec1 = doc.sections[0]
sec1.top_margin = Pt(5)
sec1.page_width = Pt(600)
sec1.page_height = Pt(50)
doc.add_paragraph('ส่วนที่หนึ่ง ย่อหน้าแรก')
doc.add_paragraph('ส่วนที่หนึ่ง ย่อหน้าสอง')

sec2 = doc.add_section()
sec2.page_width = Pt(450)
sec2.page_height = Pt(200)
doc.add_paragraph('ส่วนที่สอง ย่อหน้าแรก')
doc.add_paragraph('ส่วนที่สอง ย่อหน้าสอง')

sec3 = doc.add_section()
sec3.page_width = Pt(550)
sec3.page_height = Pt(80)
doc.add_paragraph('ส่วนที่สาม')

doc.save('เอกสารที่มีสามส่วน.docx')






การใช้ style

ในหัวข้อก่อนหน้านี้ได้มีการใช้ .styles['Normal'] เพื่อปรับรูปแบบตัวหนังสือทั้งเอกสาร

ในที่นี้ Normal หมายถึงตัวอักษรทั่วไปที่อยู่ภายในเอกสาร แต่นอกจากนี้แล้วยังมีรูปแบบ style อีกมากซึ่งอยู่ภายในแอตทริบิวต์ .styles ของออบเจ็กต์เอกสารซึ่งอาจนำมาใช้ได้

ถ้าอยากรู้ว่ามีอะไรบ้าง อาจลองนำมาไล่ดูชื่อทั้งหมดได้ดังนี้
doc = Document()
print(', '.join([s.name for s in doc.styles]))

ปกติแล้วเวลาที่ใช้ .add_paragraph() เพื่อสร้างย่อหน้าขึ้นมาใหม่เราสามารถกำหนด style ได้โดยใส่ลงเป็นอาร์กิวเมนต์ตัวที่ ๒ ต่อจากตัวข้อความที่ต้องการใส่ แต่หากไม่ได้ใส่ก็จะเป็น Normal คือตัวหนังสือทั่วไป

ตัวอย่าง ลองใส่ย่อนห้าที่มี style อื่นเช่น Title ลงไปดูได้ดังนี้
from docx import Document

doc = Document()
doc.add_paragraph('หัวข้อ','Title')
doc.add_paragraph('หัวข้อย่อย','Subtitle')
doc.add_paragraph('ข้อความธรรมดา')
doc.save('เอกสารมีหัวข้อ.docx')



หรือจะเปลี่ยน style เอาหลังจากสร้างย่อหน้ามาแล้วก็ได้โดยแทนเข้าไปในแอตทริบิวต์ .style แบบนี้
parag1.style = 'Title'

อีกตัวอย่าง ลองมาไล่ดู style ต่างๆอีกหลายแบบที่อาจมีโอกาสใช้บ่อยดู
from docx import Document
from docx.shared import Pt

doc = Document()
doc.sections[0].page_width = Pt(200)
doc.sections[0].page_height = Pt(300)
doc.sections[0].left_margin = Pt(10)
doc.sections[0].right_margin = Pt(10)
doc.sections[0].top_margin = Pt(10)
doc.sections[0].bottom_margin = Pt(10)

lis_style = [
    'Normal','Title','Subtitle',
    'Heading 1','Heading 2','Heading 3','TOC Heading',
    'List Bullet','List Bullet 2','List Bullet 3',
    'macro','Quote','Intense Quote','Caption']
for style in lis_style:
    doc.add_paragraph('นี่คือ '+style,style)

doc.save('เอกสารมีสไตล์.docx')



และเช่นเดียวกับ style แบบ Normal ที่จริง style แบบอื่นๆก็สามารถปรับรูปแบบต่างๆได้เช่นกัน หากต้องการนำมาใช้ก็ลองปรับตามที่ต้องการดูได้




การใส่ข้อความที่หัวหรือท้าย

ภายในหน้ากระดากษของเวิร์ดนั้นนอกจากจะมีข้อความส่วนเนื้อหาหลักแล้ว ยังมีส่วนหัว คือส่วนด้านบนสุด กับส่วนเท้า คือส่วนด้านล่าง ซึ่งสามารถใส่ข้อความ

ข้อความส่วนหัวนั้นอยู่ที่แอตทริบิวต์ .header ของ section ส่วนข้อความส่วนเท้าจะอยู่ที่ .footer ถ้าหากใส่ข้อความลงในส่วนหัวหรือเท้าของ section ไป มันก็จะปรากฏในทุกหน้ากระดาษภายใน section นั้น

ตัวอย่าง
from docx import Document
from docx.shared import Pt

doc = Document()
doc.styles['Normal'].font.size = Pt(120)
parag1 = doc.add_paragraph('ลำตัว')
parag2 = doc.add_paragraph('แขนซ้าย แขนขวา')

doc.sections[0].header.paragraphs[0].text = 'ส่วนหัว'
doc.sections[0].footer.paragraphs[0].text = 'ส่วนเท้า'

doc.save('เอกสารที่มีหัวและเท้า.docx')






การใส่ตาราง

เราสามารถใส่ตารางลงไปได้โดยใช้เมธอด .add_table() โดยใส่จำนวนแถว (แนวตั้ง) และจำนวนคอลัมน์ (แนวนอน) เช่นถ้าต้องการตารางที่มี x แถว y คอลัมน์ก็ใส่ .add_table(x,y) เป็นต้น

ส่วนการเข้าถึงแต่ละช่องภายในตารางเพื่อที่จะใส่ข้อความลงไปนั้นทำได้โดยใช้เมธอด .cell() ที่ออบเจ็กต์ตัวตารางนั้น โดยใส่เลขลำดับแถวและลำดับคอลัมน์ลงไป

การใส่ข้อความลงในช่องที่ต้องการทำได้โดยป้อนข้อความลงไปที่แอตทริบิวต์ .text ของออบเจ็กต์ช่องนั้น

ภายในแต่ละช่องจะประกอบไปด้วย paragraph และ run เช่นเดียวกับข้อความทั่วไปด้านนอกตาราง ส่วนรูปแบบการจัดเรียงในย่อหน้าก็ทำได้ที่ .paragraphs[0] และการกำหนดรูปแบบอักษรก็ทำได้โดยใส่ที่ .paragraphs[0].runs[0]

ตัวอย่างการใช้
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = Document()
tb = doc.add_table(6,4)
for i in range(6):
    for j in range(4):
        cell = tb.cell(i,j)
        cell.text = 'ช่อง [%d,%d]'%(i,j)
        if(i>3):
            cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.RIGHT
        elif(i>1):
            cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        cell.paragraphs[0].runs[0].font.size = Pt(15)
        cell.paragraphs[0].runs[0].font.name = 'Tahoma'
doc.save('เอกสารที่มีตาราง.docx')



การกำหนดความสูงของแต่ละแถวในตารางทำได้โดยปรับที่แอตทริบิวต์ .height ของตัวออบเจ็กต์แถว ซึ่งออบเจ็กต์แถวนั้นเข้าถึงได้ผ่านแอตทริบิวต์ .rows ของออบเจ็กต์ตาราง ส่วนความกว้างของช่องปรับที่แอตทริบิวต์ .width ของออบเจ็กต์ตัวช่อง

ส่วนการกำหนดการจัดเรียงข้อความว่าจะชิดบนหรือชิดล่างหรืออยู่ตรงกลางของช่อง ทำได้ที่แอตทริบิวต์ .vertical_alignment โดยใส่ออบเจ็กต์ใน docx.enum.table.WD_ALIGN_VERTICAL ลงไป

ตัวอย่างการใช้
from docx import Document
from docx.shared import Pt
from docx.enum.table import WD_ALIGN_VERTICAL

doc = Document()
tb = doc.add_table(1,3)
tb.rows[0].height = Pt(100)
tb.cell(0,0).text = 'ชิดบน'
tb.cell(0,0).width = Pt(80)
tb.cell(0,1).text = 'อยู่ตรงกลาง'
tb.cell(0,1).vertical_alignment = WD_ALIGN_VERTICAL.CENTER
tb.cell(0,1).width = Pt(60)
tb.cell(0,2).text = 'ชิดล่าง'
tb.cell(0,2).vertical_alignment = WD_ALIGN_VERTICAL.BOTTOM
tb.cell(0,2).width = Pt(90)
doc.save('เอกสารที่มีตาราง.docx')






การใส่รูปภาพ

การใส่รูปภาพจากไฟล์ที่ต้องการนั้นทำได้โดยใช้เมธอด .add_picture() โดยอาจใส่คีย์เวิร์ด width= ลงไปเพื่อกำหนดความกว้างของภาพที่ใส่ หรือใส่ height= เพื่อกำหนดความสูง ถ้าใส่แค่ความกว้างลงไปแล้วความสูงก็จะเปลี่ยนไปตามสัดส่วนโดยอัตโนมัติ ถ้าใส่แค่ความสูงลงไปความกว้างก็จะถูกกำหนดโดยอัตโนมัติเช่นกัน

ตัวอย่างการใส่รูปภาพลงไปโดยกำหนดความกว้างของภาพ
from docx import Document
from docx.shared import Pt

doc = Document()
doc.add_picture('รูป.png',width=Pt(300))
doc.save('เอกสารที่มีรูป.docx')




อ้างอิง


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python
-- คอมพิวเตอร์ >> microsoft_office

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

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  查看日志

  推荐日志

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ