โจทย์ของ tutorial
- ต้องการทำใบเซนต์ชื่อเข้าเรียนรายวันของหลักสูตรแบบเต็ม ของเดือนเมษายน
- โดยมีต้นแบบไฟล์ ที่มีส่วนหัว และข้อมูลรายชื่อด้านใน เตรียมไว้แล้ว
วิธีทำแบบ manual
เราก็มีหลากหลายวิธีการที่สามารถทำได้ ตามแต่กรณีและความต้องการของแต่ละงาน
เช่น หากเราต้องการที่จะเก็บไฟล์ทั้งหมดไว้ด้วย ก็อาจจะใช้วิธี
- เปิดเอกสารต้นฉบับวันที่ 1 ขึ้นมา
- เปลี่ยนเป็นวันที่ 2 แล้วก็ save as เป็นไฟล์ของวันที่ 2
- ทำไปทั้งหมดจนครบตามวันที่เราต้องการ เท่ากับเราต้องทำทั้งหมด 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
นำไฟล์ 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: