pip install python-docx
import
แค่ docx
ไม่ใช่ python-docx
import 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')