มอดูล win32com ในไพธอนนั้นเอาไว้ใช้ควบคุมตัวโปรแกรมต่างๆในไมโครซอฟต์ออฟฟิศ เช่นเวิร์ด, เอ็กซ์เซล, พาวเวอร์พอยต์ เป็นต้น โดยมีความสามารถทำอะไรได้หลายอย่างโดยควบคุมอัตโนมัติ ทั้งเปิดไฟล์ สร้างเอกสาร บันทึกเอกสารลงไฟล์ หรือแปลงเอกสารเป็นไฟล์ชนิดต่างๆอย่างเช่น pdf
เมื่อใช้แล้วเราสามารถทำการเขียนหรือดึงข้อมูลไฟล์เอกสารพวกนี้ได้ อย่างไรก็ตามสำหรับเอ็กซ์เซลแล้วมีมอดูลที่ใช้งานได้ดีเช่น xlrd (อ่านวิธีใช้ใน
https://phyblas.hinaboshi.com/20200606) และ openpyxl (อ่านวิธีใช้ใน
https://phyblas.hinaboshi.com/20200605) เป็นต้น ส่วนเวิร์ดก็มีมอดูล python-docx และพาวเวอร์พอยต์มีมอดูล python-ppt ซึ่งใช้งานได้สะดวกและง่ายดายกว่า
ดังนั้นในบทความนี้จะแนะนำการใช้งาน win32com โดยเน้นไปที่การใช้งานเบื้องต้นและการใช้เพื่อแปลงเอกสารเป็นไฟล์ pdf หรือรูปภาพ
การติดตั้งและเริ่มใช้งาน มอดูลนี้สามารถติดตั้งเพื่อใช้งานได้โดย pip เช่นเดียวกับมอดูลอื่นๆโดยทั่วไป เพียงแต่ว่าชื่อมอดูลเวลาสั่ง pip นั้นไม่ใช่ win32com แต่เป็น pywin32
pip install pywin32
จากนั้นเวลาที่ใช้งานนั้นมักจะใช้ฟังก์ชัน
client
โดยเวลาจะใช้ควรสั่ง import แบบนี้
import win32com.client
หริอสั่ง import ตัวออบเจ็กต์ Dispatch ที่จะใช้เป็นหลักในงานนี้มาโดยตรงเลย
from win32com.client import Dispatch
ถ้าแค่
import win32com
แบบนี้จะไม่สามารถใช้ win32com.client ได้ ต้องระวังด้วย
import win32com
win32com.client # ได้ AttributeError: module 'win32com' has no attribute 'client'
สำหรับตัวอย่างโค้ดที่จะเขียนต่อไปนี้จะใช้อยู่แค่
Dispatch
ดังนั้นจะแค่
from win32com.client import Dispatch
ทั้งหมดเพื่อความง่าย
การสร้างหน้าเอกสารเวิร์ดขึ้นใหม่ ขอเริ่มยกตัวอย่างจากการใช้งานง่ายๆคือสร้างไฟล์เวิร์ดใหม่ขึ้นมาแล้วเขียนอะไรลงไปนิดหน่อย
from win32com.client import Dispatch
app = Dispatch('Word.Application')
app.visible = True
doc = app.Documents.Add()
doc.Content.Text = 'ราชาวีรชน เกิดใหม่เพื่อขัดเกลาวิถีต่อสู้\nและกลายเป็นอัศวินฝึกหัดที่แกร่งสุดในโลก♀'
พอรันแล้วโปรแกรมเวิร์ดก็จะถูกเปิดขึ้น มีหน้าเอกสารใหม่โผล่ขึ้นมา และมีข้อความที่ใส่ไปนี้พิมพ์อยู่
ในที่นี้เริ่มจากทำการสร้างออบเจ็กต์
Dispatch
ขึ้น โดยใส่
'Word.Application'
หมายถึงต้องการเปิดไฟล์เวิร์ด (ถ้าหากต้องการเปิดเอ็กซ์เซลก็เปลี่ยนเป็น
'Excel.Application'
เป็นต้น)
ส่วน
app.visible = True
นั้นหมายถึงว่าให้เปิดมาในโหมดที่ขึ้นหน้าต่างมาให้เรามองเห็นด้วยได้ ถ้าไม่ได้ใส่โปรแกรมก็จะถูกเปิดขึ้นมาเบื้องหลัง เราจะมองไม่เห็น และไม่สามารถปิดหน้าต่างโดยตรงได้ด้วย
จากนั้น
doc = app.Documents.Add()
หมายถึงสร้างหน้ากระดาษใหม่ขึ้นมาเป็นหน้าเปล่าๆ
และ
doc.Content.Text
นั้นคือตัวข้อความภายในหน้ากระดาษ เราสามารถป้อนข้อความที่ต้องการเขียนเข้าไปได้โดยตรงเลย ข้อความก็จะมาปรากฏในหน้ากระดาษตามนั้น ที่จริงแล้วมีรายละเอียดมากกว่านี้อีก เช่นกำหนดย่อหน้า ปรับขนาดหรือสีหรือฟอนต์ของอักษร แต่ในที่นี้แค่แสดงให้เห็นตัวอย่างการใช้ง่ายๆ
การบันทึกไฟล์เวิร์ด เอกสารที่ถูกสร้างขึ้นมาใหม่นี้สามารถทำการบันทึกเป็นไฟล์ได้โดยใช้เมธอด
.SaveAs()
โดยใส่ชื่อไฟล์ที่ต้องการบันทึกลงไป เช่น
from win32com.client import Dispatch
app = Dispatch('Word.Application')
doc = app.Documents.Add()
doc.Content.Text = 'เพราะพระเจ้าเลือกเลยได้เกิดใหม่มาเลี้ยงสไลม์ในต่างโลก'
doc.SaveAs(r'พระเจ้าเลือก.docx')
doc.Close()
app.Quit()
ในที่นี้ลงท้ายด้วย
doc.Close()
และ
app.Quit()
เพื่อทำการปิดทุกอย่างลงหลังจากที่บันทึกเรียบร้อยแล้ว
ในที่นี้เราอาจจะใส่
app.visible = True
ก็ได้ แล้วก็จะเห็นเวิร์ดถูกเปิดขึ้นมาก่อนจะถูกปิดไป แต่ก็ไม่จำเป็นถ้าไม่ได้ต้องการเห็นหน้าต่างมันขึ้นมาระหว่างดำเนินการอยู่
การเปิดไฟล์เวิร์ดขึ้นมา หากต้องการเปิดไฟล์เวิร์ดที่มีอยู่แล้วก็ทำได้โดยใช้
.Documents.Open()
เช่น ลองเปิดไฟล์ที่บันทึกไว้ในตัวอย่างที่แล้วขึ้นมาดู
from win32com.client import Dispatch
app = Dispatch('Word.Application')
app.visible = True
doc = app.Documents.Open(r'พระเจ้าเลือก.docx')
พอรันแล้วไฟล์ก็จะถูกเปิดขึ้นมาแบบนี้
การแปลงไฟล์เวิร์ดเป็น pdf เมธอด
.SaveAs
นั้นนอกจากจะใช้บันทึกไฟล์เป็นไฟล์เวิร์ดธรรมดาแล้วยังอาจใช้บันทึกเป็นไฟล์ชนิดต่างๆซึ่งสามารถเลือกได้ ทำได้โดยการเติมตัวเลขระบุชนิดของไฟล์ที่ต้องการไปข้างหลัง เช่นถ้าต้องการบันทึกเป็น pdf ก็ใส่เลข 17
เราสามารถใช้ความสามารถตรงนี้เพื่อแปลงไฟล์เวิร์ดเป็น pdf ได้ โดยเปิดไฟล์เวิร์ดขึ้นมาแล้วบันทึกด้วยโหมด 17 ดังนี้
from win32com.client import Dispatch
docx_file = r'shougayaki.docx' # ไฟล์เวิร์ดที่ต้องการแปลง
pdf_file = r'หมูย่างซอสขิง.pdf' # ชื่อไฟล์ pdf ที่ต้องการ
app = Dispatch('Word.Application')
doc = app.Documents.Open(docx_file) # เปิดไฟล์เวิร์ดขึ้นมา
doc.SaveAs(pdf_file,17) # บันทึกเป็น pdf
doc.Close() # บันทึกเสร็จแล้วก็ปิดด้วย
app.Quit()
เท่านี้ก็จะได้ไฟล์ pdf ขึ้นมาจากไฟล์เวิร์ดแล้ว
อย่างไรก็ตาม ที่จริงแล้วการแปลงไฟล์เวิร์ดเป็น pdf นั้นมีมอดูลที่ใช้งานได้สะดวกและเขียนง่ายกว่า นั่นคือ docx2pdf ซึ่งได้เขียนถึงไปใน
https://phyblas.hinaboshi.com/20230207 แนะนำให้ใช้อันนี้น่าจะสะดวกกว่า ทั้งเขียนสั้นกว่าและสามารถแปลงหลายไฟล์พร้อมกันทีเดียวได้ง่ายๆ
การแปลงไฟล์เอ็กซ์เซลเป็น pdf ต่อไปจะว่าด้วยเรื่องการใช้จัดการไฟล์เอ็กซ์เซล โดยวิธีการใช้ก็จะคล้ายๆกับกรณีใช้กับเวิร์ด แต่ก็มีความต่างกันในรายละเอียดอยู่พอสมควร ซึ่งในที่นี้จะไม่พูดถึงในรายละเอียด แต่จะพูดถึงเรื่องการแปลงเป็น pdf
เราสามารถเปิดไฟล์เอ็กซ์เซลขึ้นมาแล้วบันทึกใหม่เป็นไฟล์ pdf ได้เช่นเดียวกับเวิร์ด เพียงแต่เมธอด .SaveAs() ในกรณีของเอ็กซ์เซลนั้นจะไม่มีตัวเลือกให้บันทึกเป็น pdf แต่ก็มีเมธอด
.ExportAsFixedFormat()
แทน สามารถใช้เพื่อบันทึกเป็น pdf ได้
ตัวอย่างโค้ดสำหรับแปลงไฟล์เอ็กซ์เซลเป็น pdf
from win32com.client import Dispatch
excel_file = r'pot-au-feu.xlsx' # ไฟล์เอ็กซ์เซลที่ต้องการแปลง
pdf_file = r'ปอโตเฟอ.pdf' # ชื่อไฟล์ pdf ที่ต้องการบันทึก
app = Dispatch('Excel.Application')
wb = app.Workbooks.Open(excel_file)
wb.ExportAsFixedFormat(0,pdf_file)
wb.Close()
app.Quit()
การแปลงไฟล์พาวเวอร์พอยต์เป็น pdf กรณีที่ใช้กับพาวเวอร์พอยต์นั้นสามารถใช้เมธอด
.SaveAs()
เพื่อทำการบันทึกไฟล์เป็น pdf ได้เช่นเดียวกับกรณีเวิร์ด เพียงแต่เลขรหัสสำหรับแปลงเป็น pdf นั้นคือ 32 ระหว่างอย่างสับสนกับของเวิร์ด
ตัวอย่างโค้ดการแปลงไฟล์พาวเวอร์พอยต์เป็น pdf
from win32com.client import Dispatch
ppt_file = r'karaage.pptx' # ไฟล์พาวเวอร์พอยต์ที่ต้องการแปลง
pdf_file = r'คาราอาเงะ.pdf' # ชื่อไฟล์ pdf ที่ต้องการบันทึก
app = Dispatch('Powerpoint.Application')
ppt = app.Presentations.Open(ppt_file)
ppt.SaveAs(pdf_file,32)
ppt.Close()
app.Quit()
การแปลงไฟล์พาวเวอร์พอยต์เป็นภาพ ที่จริงแล้วเมธอด
.SaveAs()
ของพาวเวอร์พอยต์นั้นทรงพลังยิ่งกว่าของเวิร์ดหรือเอ็กซ์เซลเสียอีก นั่นเพราะนอกจากจะใช้บันทึกไฟล์เป็น pdf ได้แล้วยังสามารถบันทึกเป็นไฟล์รูปภาพได้เลย โดยแค่เปลี่ยนตัวเลขแทนโหมดเป็นชนิดภาพตามที่ต้องการเท่านั้น มีให้เลือกอยู่หลากหลาย
ตารางแสดงตัวเลขชนิดไฟล์
16 |
gif |
17 |
jpg |
18 |
png |
19 |
bmp |
21 |
tif |
32 |
pdf |
เพียงแต่ว่ากรณีบันทึกเป็นรูปภาพจะได้มาเป็นโฟลเดอร์ซึ่งบรรจุรูปภาพที่แปลงมาจากแต่ละหน้าของสไลด์ในไฟล์พาวเวอร์พอยต์ ต่างจากกรณีแปลงเป็น pdf ที่จะถูกบันทึกเป็นไฟล์เดียว
ตัวอย่างเช่นถ้าต้องการแปลงเป็นภาพ png ก็ใส่เลข 18 โดยอาจเขียนได้ดังนี้
from win32com.client import Dispatch
ppt_file = r'chikinnanban.pptx' # ไฟล์พาวเวอร์พอยต์ที่ต้องการแปลง
img_path = r'ไก่นัมบัง' # โฟลเดอร์ที่ต้องการเก็บภาพที่ได้จากการแปลง
app = Dispatch('Powerpoint.Application')
ppt = app.Presentations.Open(ppt_file)
ppt.SaveAs(img_path,18)
ppt.Close()
app.Quit()
เท่านี้ก็ได้ไฟล์รูปภาพที่มาจากแต่ละหน้าของสไลด์แล้ว
น่าเสียดายว่าวิธีการเดียวกันนี้ไม่สามารถใช้ในกรณีเวิร์ดและเอ็กซ์เซลได้ แต่ว่าเมื่อแปลงเป็น pdf ได้แล้ว ที่เหลือก็สามารถแปลงต่อเป็นรูปภาพได้ไม่ยากโดยใช้มอดูล pdf2image (อ่านวิธีใช้ใน
https://phyblas.hinaboshi.com/20230226)
สรุปทิ้งท้าย จากที่เขียนแนะนำไปนี้คงพอทำให้เข้าใจการทำงานของ win32com ในเบื้องต้นเพื่อจัดการกับไฟล์เอกสารชนิดต่างๆ
ที่จริงแล้วไม่ใช่แค่เรื่องจัดการพวกเอกสาร แต่ win32com ยังใช้ควบคุมไมโครซอฟต์เอาท์ลุคเพื่อทำการเขียนอ่านและรับส่งอีเมลได้ด้วย แต่นั่นก็คงจะเป็นอีกหัวข้อใหญ่หากต้องการจะเขียนถึง
ที่แนะนำไปคร่าวๆในหน้านี้เป็นเพียงแค่ความสามารถส่วนหนึ่งของ win32com เท่านั้น ที่จริงๆแล้วยังมีรายละเอียดอีกมากที่ไม่ได้เขียนถึง เพราะในที่นี้แค่ต้องการเน้นไปที่เรื่องการแปลงไฟล์
ไพธอนนั้นมีมอดูลหลายตัวสำหรับเขียนอ่านหรือควบคุมจัดการหรือแปลงไฟล์เอกสารต่างๆซึ่งรวมถึงเอกสารของไมโครซอฟต์ออฟฟิศ มีทางเลือกอยู่มากมายทีเดียว ซึ่งก็ได้เขียนแนะนำไปแล้วหลายตัว และไว้เมื่อมีโอกาสก็จะเขียนแนะนำถึงอีกเรื่อยๆ
อ้างอิง