win32com操作word 第二集:Application&Documents介面

2023-01-16 06:01:12

本課程《win32com操作word API精講&專案實戰》以視訊為主,文字教學為輔,公眾號ID:一燈程式設計。

先回答一個網友私信問題: win32com和微軟的word介面檔案有什麼關係

win32com的底層呼叫的是word的介面,理論上,想檢視win32com的介面情況,只需要看微軟官方的檔案即可。檔案地址: https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.office.interop.word.application?view=word-pia

令入門者雲裡霧裡的API關係

微軟word介面檔案的組織形式說不上有什麼問題,但其介面規模巨大(接近900個,每個介面中少則十幾個,多則幾百個的屬性和方法)的介面及錯綜綜複雜的介面交叉參照足以將一部分入門者拒之門外,著實繁雜。往往看到一個介面即便有詳細的說明,就是無法知曉如何使用,各種嘗試也不得要領,往往最常見的問題是:到底誰來呼叫這個介面。

要想快速抓住word程式設計的七寸,請一定要認真閱讀下方的講解。

第一點 回憶一下,我們是如何操作一個檔案的

  • 1、開啟使用者端
  • 2、建立或開啟一個檔案
  • 3、選中某些資源或滑鼠點選準備寫入內容
  • 4、設定格式:頁面設定、字型顏色、縮排等等
  • 5、儲存檔案
  • 6、關閉使用者端

瞧,其實就那麼簡單,別看檔案寫得烏泱烏泱的,從檔案操作的角度去思考,其實這個事並沒有那麼複雜。現在只需要記住:

  • Application介面是用來控制使用者端的啟動和關閉的,甭管它有多少個直接子級API
  • Documents介面是用來建立和開啟檔案的,通過Application.Documents即可呼叫。記住建立檔案和開啟檔案回返回一個Document物件,要使用變數接受這個物件,這樣才方便我們對這個檔案進行操作。

現在再回過來對照,使用者端開啟了,檔案也有了,那使用什麼方法來選中資源呢?介面中有Selection和Range可以實現選中檔案的資源,官方推薦在檔案級程式設計中,優先使用Range介面。 這不來了嘛,就是用Range介面來選中資源。那麼誰才有這個資格來呼叫Range介面呢?答案是:Document,也就是檔案物件,所以上面提到,建立檔案或儲存檔案需要使用變數來接受,就是為了方便後續的操作。

第二點 字型、字號、行間距、頁面設定等等這些如何實現呢

先將word的資源分類:

  • 1、內容類資源,如文字、圖片、表格、圖表、形狀及公式等
  • 2、檔案設定類資源,如頁首頁尾、檔案頁面設定

上方兩點分類,通通都能通過Document介面搞定,因為這些資源只在檔案中才存在呀,即便是頁面設定,也是設定某個檔案的!所以,即便看對應的檔案,我們也能快速知曉呼叫者就是Document。 再者,如果選中了某段文字,想為文字設定格式,各種格式也有獨立的介面,那麼又是誰來呼叫這些格式介面呢?答案自然是:Range。使用Range選中某個資源,那自然是使用Range來呼叫這些格式介面。 瞧瞧,就是那麼簡單。

第二課的程式碼演示

ok,進入第二集的程式碼演示階段,跟著敲一篇,簡單的一批。

Application和Documents介面演示

Applicatioin和Documents是兩個入門級API,前者控制使用者端,後者儲存著所有的檔案物件

from win32com.client import Dispatch # 此乃排程器

client = Dispatch('kwps.Application'
# 如果要啟動微軟的word使用者端可使用下方辦法
# client = Dispatch('word.Application')
client.Visible = True

# 到這,使用者端已經能啟動了,但尚未開啟檔案
# client是一個使用者端物件,即Application物件

# Documents是Application的直接子級API,通過Application直接呼叫Documents

# 建立一個新檔案並返回一個Document物件
d1 = client.Documents.Add() # 有預設引數,正常建立無需傳參
# 開啟一個檔案並返回一個Document物件
d2 = client.Documents.Open(
  FileName=file_name,
)

# Open方法的引數多達15個,第一個引數是需要開啟的檔案路徑,必填引數,檔案不存在時丟擲異常
# 如果檔案要密碼才能開啟則使用需要將密碼傳給Open,如下
d2 = client.Documents.Open(
  FileName=file_path,  # 檔案路徑  
  ConfirmConversions=True# 檔案不是word格式時是否會彈窗要求強制轉換格式
  ReadOnly=False# 是否以唯讀方式開啟
  AddToRecentFiles=True# 是否將檔案新增到「檔案」->"最近使用"中
  PasswordDocument='密碼' # 所需要的密碼
)
# 注:Open還可以使用位置引數傳參,其各個引數的位置要嚴格按照檔案引數的位置來設定

此時,我們是不是已經有了兩個檔案物件了?一個Add方法所建立的d1,一個是Open方法所返回的d2。要想單獨操作某個檔案,就直接使用變數d1d2去呼叫Document介面中的方法和屬性就OK了。

第一課的內容非常簡單,其重點並非是Application和Documents如何使用,而是要建立起一個"使用者思維",即再複雜的程式設計,最後都是給使用者使用的,我們站在使用者的角度的感受,該如何去操作一個檔案:開啟檔案、操作檔案,上方的變數中,d1d2都是要操作的物件,圍繞Document這個物件,再去呼叫各種各樣的介面來實現需求。

下節課,我們中開始重點介紹Document的屬性和方法啦!

有疑問,可私信也可評論區交流哈。