φυβλαςのβλογ
บล็อกของ phyblas



การจัดการและแปลงไฟล์เอกสารต่างๆของไมโครซอฟต์ออฟฟิศโดยใช้ win32com (pywin32)
เขียนเมื่อ 2023/02/28 18:14
แก้ไขล่าสุด 2024/02/21 18:14
 



มอดูล 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 เท่านั้น ที่จริงๆแล้วยังมีรายละเอียดอีกมากที่ไม่ได้เขียนถึง เพราะในที่นี้แค่ต้องการเน้นไปที่เรื่องการแปลงไฟล์

ไพธอนนั้นมีมอดูลหลายตัวสำหรับเขียนอ่านหรือควบคุมจัดการหรือแปลงไฟล์เอกสารต่างๆซึ่งรวมถึงเอกสารของไมโครซอฟต์ออฟฟิศ มีทางเลือกอยู่มากมายทีเดียว ซึ่งก็ได้เขียนแนะนำไปแล้วหลายตัว และไว้เมื่อมีโอกาสก็จะเขียนแนะนำถึงอีกเรื่อยๆ




อ้างอิง


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python
-- คอมพิวเตอร์ >> microsoft_office
-- คอมพิวเตอร์ >> pdf

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文