Automate MS word with Python

kiratopat
3 min readApr 26, 2022

--

โจทย์ของ tutorial

  • ต้องการทำใบเซนต์ชื่อเข้าเรียนรายวันของหลักสูตรแบบเต็ม ของเดือนเมษายน
  • โดยมีต้นแบบไฟล์ ที่มีส่วนหัว และข้อมูลรายชื่อด้านใน เตรียมไว้แล้ว

วิธีทำแบบ manual

เราก็มีหลากหลายวิธีการที่สามารถทำได้ ตามแต่กรณีและความต้องการของแต่ละงาน

เช่น หากเราต้องการที่จะเก็บไฟล์ทั้งหมดไว้ด้วย ก็อาจจะใช้วิธี

  1. เปิดเอกสารต้นฉบับวันที่ 1 ขึ้นมา
  2. เปลี่ยนเป็นวันที่ 2 แล้วก็ save as เป็นไฟล์ของวันที่ 2
  3. ทำไปทั้งหมดจนครบตามวันที่เราต้องการ เท่ากับเราต้องทำทั้งหมด 29 loop

หรือหากไม่ต้องการเก็บไฟล์ทั้งหมดไว้ เราก็แค่เปลี่ยนการกด save as ในกระบวนการข้างต้น เป็น Print ออกมาเป็น paper ไปเลย

แต่! ถ้ามี wording ที่เราพิมพ์ผิดพลาดไป หรือ !ผู้บริหารต้องการเปลี่ยน wording
ก็ต้องไล่ทำ “ ใหม่ทั้งหมด ” อีกรอบ

ผมจึงลองหาวิธีมารับมือเพื่อประหยัดเวลา สายตา และการ click mouse ของเราได้อย่างง่ายดาย โดยมี algorithm แบบเรียบง่ายดังนี้…

Algorithm

  • กำหนดให้ i_start มีค่าที่ 1
  • กำหนดให้ i_stop มีค่าที่ 30
  • ในขณะที่ i_start <= i_stop ให้ {
  • - เปิดไฟล์ต้นฉบับ
  • - แก้ไข Header วันที่ n + 1
  • - บันทึกเป็นไฟล์ใหม่โดยให้ชื่อไฟล์เป็น n + 1
  • - จบ loop ให้ i มีค่าเพิ่ม 1}

เราก็จะได้ไฟล์ทั้งหมดออกมาเป็น output ตั้งแต่วันที่ 1-30 เมษายน
หากต้องการ print ก็สามารถเลือกหลายๆไฟล์แล้ว click print ทีเดียวได้เลย

ต่อไปจะเป็นวิธีทำ ทุกคนสามารถลองทำตามได้ด้วยขั้นตอนนี้…

วิธีทำแบบสร้าง Automation ด้วย ภาษา python

เตรียม

  • python

Download at https://www.python.org/

  • VS code

Download at https://code.visualstudio.com/

สร้าง Floder เก็บไฟล์ของ Project

ในที่นี้จะใช้ชื่อว่า “ automate ”

เปิด VS code ใน floder project ของเรา

ติดตั้ง

  • virtual environment
py -m pip install virtualenv

สร้าง virtualenv สำหรับ Project MSbot

py -m venv MSbot

เรียกใช้ virtual environment MSbot

MSbot\Scripts\activate

ติดตั้ง

  • python-docx
pip install python-docx

see Documentation here

นำไฟล์ docx ที่เราต้องการทำ automate มาใส่ใน floder project เรา

ใน tutorial นี้จะใช้ไฟล์ “ template.docx ”

Download file Template.docxDownload Font TH SarabunPSK

สร้างไฟล์ app.py จาก Algorithm ที่เราลองสร้างไว้เบื้องต้น

#import module การจัดการ docxfrom docx import Document#import module string เพื่อใช้งาน string templatefrom string import Template#import module docx.shared เพื่อระบุขนาดของตัวอักษรในหน่วย Ptfrom docx.shared import Pt#เปิด template.docxdocument = Document('template.docx')#สร้าง string template วันที่ และชื่อไฟล์ไว้ในตัวแปร 2 ตัวนี้templateDate = Template('วันที่ $date เมษายน 2565')templateName = Template('result-$num.docx')#กำหนดให้ i เริ่มที่ 1 สิ้นสุดที่ 30i_start = 1i_stop = 30# สร้าง while loopwhile i_start <= i_stop:# สร้างตัวแปร section เพื่อเข้าถึงพื้นที่เนื้อหาของเอกสารsection = document.sections[0]# สร้างตัวแปร header เพื่อเข้าถึงส่วนหัวของกระดาษheader = section.header# สร้างตัวแปร paragraph เพื่อเข้าถึงส่วนของข้อความที่เราต้องการแก้ไขtextToChange = header.paragraphs[3]# แก้ไขข้อความใน paragraph ที่เราต้องการแก้ไขtextToChange.text = templateDate.substitute(date=i_start)# log ดึงข้อความชุดใหม่ที่อยู่ตำแแหน่ง array เดิมของ paragraphs ที่เราพึ่งแทนที่ชุดข้อความที่เราแก้ไขไปใน Terminalprint(header.paragraphs[3].text)# ตั้งค่า font ของ paragraph ที่เราแก้ไขไว้textToChange.style.font.name = 'TH SarabunPSK'# ตั้งค่า style ของ font ใน paragraph ที่เราแก้ไขไว้textToChange.style.font.bold = True# save เอกสารเป็นชื่อไฟล์วันที่ใหม่document.save(templateName.substitute(num=i_start))# จบ loop ให้ i_start เพิ่มขึ้น 1i_start += 1

video tutorial soon…

รันคำสั่งใน teminal

py app.py
  • ใน Terminal ของเราก็จะมีชื่อไฟล์ไล่จาก 1 ถึง 30 ขึ้นมา
  • ใน floder ของ project เราก็จะมีไฟล์ตามวันที่ 1 ถึง 30 ขึ้นมาทั้งหมด 30 ไฟล์

ต่อไปถ้าเราต้องการที่จะแก้ไขส่วนไหน ก็สามารถแก้ไขต้นแบบครั้งเดียวแล้วสั่ง run เพื่อให้ python generate ไฟล์ออกมาให้เราลาก print ได้อย่างง่ายดาย

Ref:

python-docx documentation

--

--

kiratopat
kiratopat

No responses yet