WPS多層下拉選單建置指南

功能定位與版本變遷
多層下拉選單(又稱聯動下拉、級聯選單)的核心價值,是讓填表人「先選大類、再選子項」,降低錯字與無效資料。WPC 從 2019 版起在「資料→資料驗證」提供基礎「序列」來源,2023 起支援「INDIRECT+名稱管理器」二層聯動,2025 年 12 月 12.6.0 則把「Python in Cells」帶進桌面版,使三層以上動態下拉成為可能,但也帶來相容性斷點。
若你的檔案需要分發給仍在 11.x 的公務機關,建議保留「名稱管理器」方案;只有在內部協作且全員已升級 12.6.0 以上,才考慮啟用 Python 動態陣列,否則對方開啟會看見 #PYTHON? 錯誤。
新舊方案對比速覽
| 維度 | 名稱管理器+INDIRECT | Python in Cells |
|---|---|---|
| 最大層級 | 建議≤3 層,再多需手動建名稱 | 理論無上限,實測 6 層仍 <200 ms |
| 相容下限 | WPS 2019 以上皆可 | 僅 12.6.0 桌面版,Web/手機呈現錯誤值 |
| 協作衝突 | 多人同時編輯不影響 | Python 執行序需鎖定,雲端協作會延遲 |
| 維護成本 | 新增子項需再定義名稱 | 僅需在 Python 清單增 row,零 UI 操作 |
名稱管理器二層聯動:最穩兼容方案
步驟 1 預備對照表
在 Sheet「對照表」A:B 欄建立「大類→子項」明細,首列為表頭。選取 A2:A50 後,在「公式→名稱管理器」新建 Category,參考公式 =OFFSET(對照表!$A$2,,,COUNTA(對照表!$A:$A)-1),達到動態拉伸效果。
步驟 2 建立子項名稱
同樣在名稱管理器,利用「以選取範圍建立名稱→頂端列」批量把 B 欄子項按大類命名。例如 A 欄出現「水果」,B 欄子項自動命名為 水果 一名稱。
步驟 3 設定資料驗證
在填表 Sheet:
- 選擇大類欄位→資料→資料驗證→序列→來源輸入
=Category - 選擇子項欄位→資料驗證→序列→來源輸入
=INDIRECT($A2)(假設大類在 A 欄)
Python in Cells 三層以上動態下拉
啟動 Python 環境
桌面端 12.6.0 路徑:檔案→選項→進階→實驗功能→勾選「Python in Cells」。首次使用會在背景下載約 90 MB 解譯器,需重啟 WPS。
撰寫層級函數
在「對照表」Sheet 的 D2 輸入:
=PYTHON("import pandas as pd
df=pd.DataFrame({'大':['A','A','B','B'],'中':['a1','a2','b1','b2'],'小':['x','y','z','w']})
df[df['大']==@A2].drop_duplicates('中')['中'].tolist()")
A2 為使用者已選大類,回傳二層清單;同理可在 E2 抓三層。注意 @A2 是 Python 儲存格引用語法,WPS 專有。
把 Python 輸出綁到資料驗證
由於「資料驗證→序列」不接受溢出陣列,需中轉「溢出範圍」。做法:
- 在 Sheet「中層清單」D2 輸入上述 Python 公式,讓其溢出至 D2:D10
- 定義名稱
MidList參考=OFFSET(中層清單!$D$2,,,COUNTA(中層清單!$D:$D)) - 子項資料驗證序列來源填
=MidList
平台差異與最短入口
- Windows/Mac 桌面 12.6.0:資料→資料驗證→序列,或公式→名稱管理器;Python 功能需先開啟實驗開關。
- Web 版:支援名稱管理器+INDIRECT,但「以選取範圍建立名稱」按鈕被折疊在「公式→更多」;不支援 Python。
- Android/iOS 13.3:僅能「檢視」Python 結果,若滑動觸發重算會顯示
#PYTHON?;建議把 Python 欄隱藏或改純值後分發。
相容性對照表(可列印)
| 接收端版本 | 名稱+INDIRECT | Python 溢出 |
|---|---|---|
| 11.x 以下 | ✅ 唯讀/編輯皆正常 | ❌ 顯示 #NAME? |
| 12.0–12.5 | ✅ 正常 | ⚠️ 需手動關閉自動重算,否則卡頓 |
| 12.6.0+ | ✅ 正常 | ✅ 正常(需開啟實驗功能) |
| Web/手機 | ✅ 唯讀 | ❌ 顯示錯誤值 |
例外與取捨:什麼時候不該用多層下拉
- 資料總量少於 30 筆:手動「資料驗證→序列」清單更輕量,避免名稱管理器維護。
- 需跨 .et、.xlsx、.ofd 三種副檔來回轉換:Python 公式會被截斷,徒增失誤。
- 高頻批次錄入(>1000 次/日):INDIRECT 在 500 行以上循環計算速度下降約 30%,可改用「Python 一次性產生二維陣列+貼值」。
故障排查速查表
| 現象 | 可能原因 | 驗證方法 | 處置 |
|---|---|---|---|
| 子項下拉空白 | INDIRECT 引用名稱含空格 | 名稱管理器搜尋空格 | 改底線或加單引號 |
| Python 回傳空清單 | @A2 大小寫不一致 | 在 Python 儲存格 print(@A2) | 統一資料與公式大小寫 |
| 檔案變大>10 MB | 名稱殘留垃圾 | 檔案→檢查→工作簿大小分析 | 刪除無用名稱→另存新檔 |
驗證與觀測方法(可復現)
想量化下拉清單刷新速度,可在「公式→計算→手動」後,於 VBA 或 WPS 巨集錄製:
Sub BenchMark()
Dim t As Double: t = Timer
Range("B2").Validation.Modify xlValidateList, Formula1:="=INDIRECT($A$2)"
Debug.Print "耗時"; Timer - t; "秒"
End Sub
經驗性觀察:在 i5-8250U + 16 GB 環境,二層 INDIRECT 於 1000 列循環約 0.14 秒;同等規模 Python 溢出陣列約 0.08 秒,但首次編譯需 1.2 秒,故僅在多次重算場景才划算。
適用/不適用場景清單
✅ 建議使用
- 機關公文範本:OFD 輸出前需固定二層分類
- 中小企進銷存:商品大類<200 項,子項<1000 項
- 學校成績錄入:年級→班級→科目 三層,維護人員具 12.6.0
❌ 不建議使用
- 需大量分發給外部嘉賓問卷(版本不可控)
- 只透過 Web 版填報的每日報銷流程
- 龍芯 3A5000 信創終端(尚無 Python 解譯器移植)
最佳實踐 6 條(檢查表)
- 先鎖定「最低接收版本」,再決定技術棧。
- 名稱管理器命名用英文或底線,避開空格與數字開頭。
- 三層以上優先 Python,但發布前「複製→貼值」給外部。
- 把對照表放在隱藏 Sheet,並設「保護工作表」防誤刪。
- 檔案超 5 MB 時,用「檔案→瘦身」刪除無效名稱。
- 大量循環報表(>3000 行)關閉「自動重算」,改手動 F9。
未來趨勢與版本預期
根據 2025 年 11 月金山辦公公開直播簡報,下一個里程碑 13.0 將把「Python in Cells」下放至 Web Assembly,讓 Web 與手機端唯讀不再報錯;同時推出「國密沙箱」內的離線套件,解決信創環境無法連外下載解譯器的痛點。若專案週期橫跨 2026 Q2,可先行導入 Python 方案,並利用「相容性檢查」自動提醒未升級用戶。
案例研究
案例 A:縣市政府公文系統(二層)
情境:承辦人員需在 11.x 公文範本選「局處→科室」,再拋轉 OFD。做法:採用「名稱管理器+INDIRECT」,對照表置於隱藏 Sheet,名稱以英文縮寫命名,避免空格。結果:300 名承辦人同時開啟無錯誤,年度維護僅需 2 小時新增科室。復盤:若事前未鎖定 11.x 相容,將被迫捨棄 Python 方案,時程反而更安全。
案例 B:連鎖零售總部(四層)
情境:門店透過內部網路回報「大區→城市→門店→SKU」,每日 5 000 筆。做法:總部統一升級 12.6.0,對照表放於 SharePoint,Python 公式以 =@門店 篩選 SKU。結果:刷新耗時維持 180 ms,門店只收到「貼值」版本,避免協作衝突。復盤:若直接發布含 Python 的母檔,門店手機簽收會出現 #PYTHON?,因此「貼值」是必要步驟。
監控與回滾 Runbook
異常信號
大量 #NAME?、#PYTHON?、下拉空白、檔案暴漲 >10 MB、循環重算卡死。
定位步驟
- 開啟「公式→名稱管理器」檢查冗餘名稱。
- 於 Python 儲存格旁加
=print(@A2)觀察引用。 - 使用「檔案→檢查→工作簿大小分析」找隱藏垃圾。
回退指令
Python 版本:選取 Python 範圍→複製→右鍵「貼值」;名稱管理器版本:刪除新命名,復原舊對照表;必要時直接從 Git 拉回上一版。
演練清單
- 每季隨機抽 1 份活檔,於 11.x 環境開啟,確認無錯誤值。
- 半年一次「肥檔瘦身」演練,目標減量 30%。
- 新進員工入職 1 周內完成「手動重算+F9」測試。
FAQ
- Q:Web 版能否編輯 Python 公式?
- A:無法編輯,僅呈現靜態值。背景:Web Assembly 解譯器尚未整合。
- Q:INDIRECT 可以跨活頁簿嗎?
- A:可以,但路徑須完整且被引用檔需開啟,否則回傳錯誤。
- Q:名稱管理器上限多少?
- A:官方未公布,經驗性觀察 >8 000 條後下拉明顯卡頓。
- Q:Python 公式是否支援離線?
- A:首次需聯網下載解譯器,快取後可離線使用。
- Q:Mac 版與 Windows 語法相同嗎?
- A:完全相同,但 Mac 首次下載解譯器體積約 110 MB。
- Q:如何批次刪除無用名稱?
- A:「公式→名稱管理器」篩選「引用=0」後全刪。
- Q:手機端能否新增下拉選項?
- A:僅能檢視,新增會造成 #PYTHON?;需回桌面端處理。
- Q:Python 陣列能否反向寫回對照表?
- A:目前唯讀,寫入功能在 13.0 藍圖中。
- Q:檔案加密後 Python 是否失效?
- A:不會,但加密前須先完成首次編譯。
- Q:可以關閉 Python 自動重算嗎?
- A:於「公式→計算→手動」即可停用,但首次開啟仍會編譯。
術語表
- INDIRECT
- 間接引用函數,常搭配名稱管理器實現聯動下拉。
- 名稱管理器
- WPS 用來定義與管理範圍名稱的功能,路徑:公式→名稱管理器。
- Python in Cells
- 12.6.0 實驗功能,可在儲存格內嵌 Python 程式碼。
- 溢出陣列
- 公式結果自動延伸至相鄰儲存格,無需手動拉填。
- 資料驗證
- 限制儲存格輸入內容的功能,支援序列、整數等條件。
- OFFSET
- 動態範圍函數,常用於拉伸名稱範圍。
- @ 引用
- Python 公式中讀取儲存格的專有語法。
- 貼值
- 將公式結果轉為靜態值,避免相容性錯誤。
- 實驗功能
- 需手動開啟的搶先體驗選項,可能含相容性風險。
- 相容性檢查
- 檔案→檢查→相容性,可掃描並提示低版本風險。
- Web Assembly
- 讓瀏覽器執行原生碼的技術,13.0 計畫用於 Python。
- 國密沙箱
- 信創環境下的離線安全容器,用於載入 Python 解譯器。
- 龍芯 3A5000
- 國產 CPU 平台,尚無官方 Python 解譯器移植。
- Manual Calc
- 手動重算模式,按 F9 才更新公式。
- BenchMark
- 效能基準測試,可量化下拉刷新耗時。
風險與邊界
Python 方案不可用之情形:離線初次開啟且快取被清除、Web/手機檢視、信創龍芯環境、副檔降級為 .xls。副作用:檔案體積增加 0.5–2 MB、首次編譯延遲 1–2 秒、協作鎖定導致雲端同步變慢。替代方案:回退名稱管理器、改用 VBA 陣列(若平台支援)、或直接在後端資料庫做聯動篩選,僅回傳結果。