pip install python-docx
import แค่ docx ไม่ใช่ python-docximport docx
import แต่ละส่วนภายในมอดูลแยกกันไปมากกว่า ในตัวอย่างในที่นี้ก็จะทำแบบนั้นเช่นกัน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 นั้นเป็นตัวเก็บค่าข้อมูลต่างๆที่เกี่ยวข้องกับไฟล์เอกสารนี้ แต่ไม่ได้มีผลต่อเนื้อหาที่อยู่ภายใน.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 นั้นมีแอตทริบิวต์ต่างๆที่กำหนดรูปแบบของตัวหนังสือ (เช่นฟอนต์, ขนาด, สี) หากต้องการปรับเปลี่ยนรูปแบบตัวหนังสือก็ให้ตั้งค่าที่ตัวแอตทริบิวต์นั้น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')

.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')

.styles['Normal'] เพื่อปรับรูปแบบตัวหนังสือทั้งเอกสาร.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 แบบนี้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')
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ