# WPS 重要API(表格部分)
## 開始
### 簡介
> 本文中所有的測試都是在Python 3.8.5的環境中進行實現的,IDE為Pycharm
>
> 引用的庫主要是Pywin32,通過該庫直接調用WPS提供的開發API,因此必須在計算機上安裝WPS,遷移時記得在目標主機上安裝需要的依賴庫(當然也可以直接打包成exe)
>
> 由于這種方式直接就是操縱WPS,因此完全可以用一樣的方式去調用Excel,但需要根據Office官方提供的二次開發庫做一小部分修改(遷移幅度應該不大,因為這其間具有一整套API標準)
### 快速測試
#### 導入庫
~~~
?# 必須引入client,直接引入win32com可能報錯
?import win32com.client
~~~
#### 聲明application(加載wps的表格)
~~~
?# 實際上測試excel時也可以直接這樣做
?application = win32com.client.Dispatch('Excel.Application')
~~~
#### 打開WPS文件
~~~
?# Path指的是本地表格文件的路徑,比如:
?# Path = r"c:\Users\Aine\Desktop\a.xlsx"
?# 通過Win32的方式并不限制xls和xlsx(因為操作是wps在做)
?workbook = application.Workbooks.Open(Path)
~~~
#### 讀取表格文件中的表
~~~
?# Sheet指的就是表名(注意不是文件名)
?worksheet = workbook.Worksheets(Sheet)
~~~
#### 修改單元格的內容
~~~
?worksheet.Cells(1, 1).Value = 'Hello World'
~~~
#### 修改表名稱
~~~
?worksheet.Name = 'MySheet'
~~~
#### 保存并退出
~~~
?# Path是指要將文件保存到哪一個位置
?worksheet.SaveAs(Path)
~~~
#### 操作完成后退出表格文件
~~~
?# 注意,此處退出的是文件,而不是WPS程序
?# 相當于在WPS中關閉了文件
?# 如果操作完表格不關閉文件,極有可能會造成文件無法打開
?workbook.Close()
~~~
#### 最后一定要記得退出ET(表格)
~~~
?application.Quit()
~~~
### 流程概況
> 1. 加載Application
>
> 2. 通過Application獲取Workbook
>
> 3. 通過Workbook的Worksheets獲取Worksheet
>
> 4. 根據獲取到的表對數據進行操作
>
> 5. 保存修改/另存為
>
> 6. 關閉Workbook(文件)
>
> 7. 關閉Application(ET)
>
## 重要API
#### Application
> 參考 [WPS開放文檔](https://open.wps.cn/docs/office)
>
> Application相當于WPS中表格的主程序(也稱為et),在Python + Pywin32中,首先要通過Dispatch加載程序
##### 重要方法
###### FindFile和GetOpenFilename(打開文件對話框)
> [參考信息(FindFile)](https://qn.cache.wpscdn.cn/encs/doc/office_v11/index.htm?page=WPS%20%E5%8A%A0%E8%BD%BD%E9%A1%B9%E5%BC%80%E5%8F%91/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Application/%E6%96%B9%E6%B3%95/FindFile%20%E6%96%B9%E6%B3%95.htm)
>
> [參考信息(GetOpenFilename)](https://qn.cache.wpscdn.cn/encs/doc/office_v11/index.htm?page=WPS%20%E5%8A%A0%E8%BD%BD%E9%A1%B9%E5%BC%80%E5%8F%91/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Application/%E6%96%B9%E6%B3%95/GetOpenFilename%20%E6%96%B9%E6%B3%95.htm)
~~~
?# FindFile方法
?# 該方法屬于Application對象的方法,調用后會前臺顯示WPS界面,并彈出打開文件對話框。
?# 注意,該對話框不會返回打開文件的路徑,但會返回是否打開成功
?# 當選擇了一個文件,會在前臺打開該文件
?Application.FindFile()
?# GetOpenFilename方法
?# 和FindFile方法不同,這個方法并不會前臺打開文件,而是彈出一個打開文件對話框
?# 該方法返回的值是文件的全路徑
?# 通常有需要的情況下是使用GetOpenFilename方法
?Application.GetOpenFilename()
~~~
###### GetSaveAsFilename(彈出另存為對話框)
> [參考信息](https://qn.cache.wpscdn.cn/encs/doc/office_v11/index.htm?page=WPS%20%E5%8A%A0%E8%BD%BD%E9%A1%B9%E5%BC%80%E5%8F%91/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Application/%E6%96%B9%E6%B3%95/GetSaveAsFilename%20%E6%96%B9%E6%B3%95.htm)
~~~
?# GetSaveAsFilename方法
?# 該方法和GetOpenFilename類似,都不會真正的進行另存為操作,而是返回用戶選擇的全路徑
?Application.GetSaveAsFilename()
~~~
###### InputBox(彈出一個接受用戶輸入的對話框)
> [參考信息](https://qn.cache.wpscdn.cn/encs/doc/office_v11/index.htm?page=WPS%20%E5%8A%A0%E8%BD%BD%E9%A1%B9%E5%BC%80%E5%8F%91/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Application/%E6%96%B9%E6%B3%95/InputBox%20%E6%96%B9%E6%B3%95.htm)
~~~
?# 該方法會彈出一個包含一個文本框的對話框,并返回用戶的輸入
?# 該文本框可以接受多種數值,也可以指定其標題、初始值、位置以及返回值類型
?# 具體參數參考官方文檔 ↑↑↑
?Application.InputBox("請輸入密碼","警告","123456")
~~~
###### Run和Wait
> [參考消息(Run)](https://qn.cache.wpscdn.cn/encs/doc/office_v11/index.htm?page=WPS%20%E5%8A%A0%E8%BD%BD%E9%A1%B9%E5%BC%80%E5%8F%91/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Application/%E6%96%B9%E6%B3%95/Run%20%E6%96%B9%E6%B3%95.htm)
>
> [參考消息(Wait)](https://qn.cache.wpscdn.cn/encs/doc/office_v11/index.htm?page=WPS%20%E5%8A%A0%E8%BD%BD%E9%A1%B9%E5%BC%80%E5%8F%91/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Application/%E6%96%B9%E6%B3%95/Wait%20%E6%96%B9%E6%B3%95.htm)
~~~
?# Run方法用于運行一個宏或調用一個VB程序
?# 注意,個人版一般是不支持宏調用的
?# Wait方法用于暫停運行宏
?Application.Run(要運行的宏)
?# Wait會暫停ET的一切操作,當然不會暫停打印和重新計算
?# 傳入的值是必須的,含義是下一次繼續運行的時間,比如Wait("12:20:00")
?Application.Wait(繼續運行的時間)
~~~
當然也可以暫停運行指定的時間,比如十分鐘(官方例程)
~~~
?let now = new Date()
?let seconds = now.getTime()
?now.setTime(seconds + 1000 * 10)
?Application.Wait(now.toLocaleString())
~~~
###### Quit
> [參考信息](https://qn.cache.wpscdn.cn/encs/doc/office_v11/index.htm?page=WPS%20%E5%8A%A0%E8%BD%BD%E9%A1%B9%E5%BC%80%E5%8F%91/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Application/%E6%96%B9%E6%B3%95/Quit%20%E6%96%B9%E6%B3%95.htm)
~~~
?# Quit幾乎是最需要但最容易忘記的方法,它負責退出ET程序,注意,該方法要在退出表格文件之后執行
?# 另外,如果有未保存的Workbook,ET會彈出對話框詢問用戶是否關閉,可以通過將Application中的DisplayAlerts設置為False(不顯示信息,會直接不保存退出)
?Application.Quit()
~~~
##### 重要屬性
###### ActivePrinter(獲取/設置打印機)
~~~
?# String類型
?Application.ActivePrinter
~~~
###### Build(獲取ET內部版本號)
~~~
?Application.Build
~~~
###### DisplayFullScreen(是否全屏)
~~~
?# 指示ET當前是否為全屏狀態,可讀寫(True 全屏; FaLse 非全屏)
?Application.DisplayFullScreen
~~~
###### EnableSound(是否允許發聲)
~~~
?# 該屬性指示ET是否可以發出聲音,Boolean,可讀寫
?Application.EnableSound
~~~
###### HighQualityModeForGraphics(高質量打印圖形)
~~~
?# Boolean
?Application.HighQualityModeForGraphics
~~~
###### Hinstance(獲取ET的句柄)
~~~
?# 只讀
?Application.Hinstance
~~~
###### OperatingSystem(獲取操作系統版本)
~~~
?# 只讀
?Application.OperatingSystem
~~~
###### Path(獲取WPS所在目錄)
~~~
?# 只讀
?Application.Path
~~~
###### PrintCommunication(測試打印機可達性)
~~~
?Application.PrintCommunication
~~~
###### Ready(ET是否就緒)
~~~
?# 判斷ET是否準備就緒
?Application.Ready
~~~
###### ScreenUpdating(屏幕更新)
~~~
?# 一般設置為True,如果需要加快宏(包括Py腳本)運行,可以暫時設置為False
?Application.ScreenUpdating
~~~
###### StatusBar(設置狀態欄文字)
~~~
?# 可以獲取和設置ET下方狀態欄的文本
?Application.StatusBar
~~~
###### UserControl (判斷窗口是否由用戶打開)
~~~
?# 如果用戶創建或者ET可見,該值為True,如果以代碼方式打開切應用程序隱藏,該值為False
?Application.UserControl
~~~
###### UserName (獲取系統用戶名)
~~~
?Application.UserName
~~~
###### Version(ET版本號)
~~~
?Application.Version
~~~
###### Visible(是否可見)
~~~
?# 確定ET是否可見(一般不用設置,如果設置可能造成運行時閃一下屏)
?Application.Visible
~~~
###### Workbooks(打開的工作表)
~~~
?# 最重要的屬性之一,代表所有打開的ET文件
?Application.Workbooks
?# 可以通過它調取Open方法來打開ET文件
?workbook = application.Workbooks.Open(Path)
~~~
###### Worksheets(Sheets集合)
~~~
?# 代表Sheets集合
?# 對于Application對象來說,該屬性代表活動工作簿(文件)中的所有工作表(sheet)
?Application.Worksheets
~~~
* * *
#### Workbook
> 參考 [WPS開放文檔](https://open.wps.cn/docs/office)
>
> Workbook相當于在ET中打開的一個文件,注意是一個文件而不是文件中的表格
>
> Workbook對象一般是由打開文件產生的,當然這不唯一
##### 重要方法
###### **[PrintOut](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E6%96%B9%E6%B3%95/PrintOut%20%E6%96%B9%E6%B3%95.htm)**(打印文檔)
> **[PrintOut](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E6%96%B9%E6%B3%95/PrintOut%20%E6%96%B9%E6%B3%95.htm)**可用的參數很多,并且都是可選參數,可用控制打印的起始頁、終止頁、份數、是否調用打印預覽(默認False)、活動的打印機名、是否打印到文件、是否逐份打印、是否忽略打印區域并打印整個文檔和區域語言
~~~
?Workbook.PrintOut(起始頁, 終止頁, 份數, 打印預覽, 活動的打印機, 是否打印到文件, 逐份打印, 打印到文件的位置, 是否打印整個對象, 區域語言)
~~~
###### **[Save](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E6%96%B9%E6%B3%95/Save%20%E6%96%B9%E6%B3%95.htm)**(保存文件)
> 保存對指定工作簿所做的更改
~~~
?Workbook.Save()
~~~
###### **[SaveAs](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E6%96%B9%E6%B3%95/SaveAs%20%E6%96%B9%E6%B3%95.htm)**(另存為文件)
> 另存文檔到指定位置
>
> 參數很多,比較常用的一般是Filename(保存到)、FileFormat(保存格式)
~~~
?Workbook.SaveAs(文件路徑,文件格式...)
~~~
###### **[Close](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E6%96%B9%E6%B3%95/Close%20%E6%96%B9%E6%B3%95.htm)**(關閉工作簿)
> 一定記得用完關掉,關掉工作簿之前要記得保存
>
> 雖然具有參數,但一般不需要傳參
###### **[SendMail](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E6%96%B9%E6%B3%95/SendMail%20%E6%96%B9%E6%B3%95.htm)**(發送郵件)
> 這種方式當然可以使用,但如果想要直接后臺發送,完全可以使用Python的yagmail庫,一般的只需要兩行代碼就完成發送
~~~
?Workbook.SendMail(收件人,主題,是否請求返回收件人,區域語言)
~~~
###### **[XmlImport](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E6%96%B9%E6%B3%95/XmlImport%20%E6%96%B9%E6%B3%95.htm)**(XML轉XLS/XLSX)
> 實際上是導入Xml文件導入到工作表中,真實現轉換只需要保存即可
~~~
?Workbook.XmlImport(URL/UNC路徑,XmlMap架構映射)
~~~
##### 重要屬性
###### **[FullName](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E5%B1%9E%E6%80%A7/FullName%20%E5%B1%9E%E6%80%A7.htm)**(打開的工作簿的全路徑)
> 一般用來獲取當前打開文件的全路徑
###### **[Password](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E5%B1%9E%E6%80%A7/Password%20%E5%B1%9E%E6%80%A7.htm)**(如果打開工作簿需要密碼,在此處設置)
~~~
?# 一般也用不上,但也不是不可能
?Workbook.Password()
~~~
###### **[ReadOnly](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E5%B1%9E%E6%80%A7/ReadOnly%20%E5%B1%9E%E6%80%A7.htm)**(判斷打開的文件是否是只讀的)
> 只讀狀態一般是因為已經打開了
>
> 也有可能是之前通過程序打開但是沒有進行關閉(.Close()方法)
###### **[Saved](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E5%B1%9E%E6%80%A7/Saved%20%E5%B1%9E%E6%80%A7.htm)** (文件是否保存)
> 可以根據此屬性判斷文件是否已經保存,防止數據丟失
###### **[Worksheets](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbook/%E5%B1%9E%E6%80%A7/Worksheets%20%E5%B1%9E%E6%80%A7.htm)**(工作簿中所有的工作表)
> 一般都是通過這種方式來獲取Sheets對象,灰常重要
* * *
#### Workbooks
##### 重要方法
**[Add](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbooks/%E6%96%B9%E6%B3%95/Add%20%E6%96%B9%E6%B3%95.htm)** (新建工作表)
**[Open](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbooks/%E6%96%B9%E6%B3%95/Open%20%E6%96%B9%E6%B3%95.htm)**(打開工作表)
**[Close](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbooks/%E6%96%B9%E6%B3%95/Close%20%E6%96%B9%E6%B3%95.htm)** (關閉對象)
**[OpenDatabase](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbooks/%E6%96%B9%E6%B3%95/OpenDatabase%20%E6%96%B9%E6%B3%95.htm)**(打開數據庫)
**[OpenText](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbooks/%E6%96%B9%E6%B3%95/OpenText%20%E6%96%B9%E6%B3%95.htm)**(打開文本文件)
**[OpenXML](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbooks/%E6%96%B9%E6%B3%95/OpenXML%20%E6%96%B9%E6%B3%95.htm)**(打開XML)
##### 重要屬性
**[Count](https://qn.cache.wpscdn.cn/encs/doc/office_v11/topics/C++%20%E5%BA%94%E7%94%A8%E9%9B%86%E6%88%90%20WPS%20%E6%8C%87%E5%8D%97/%E8%A1%A8%E6%A0%BC%20API%20%E5%8F%82%E8%80%83/Workbooks/%E5%B1%9E%E6%80%A7/Count%20%E5%B1%9E%E6%80%A7.htm)**(獲取工作表的數量)