如何能夠高效實現表格中的分權限編輯功能

摘要:本文由葡萄城技術團隊於博客園原創並首發。轉載請註明出處:葡萄城官網,葡萄城爲開發者提供專業的開發工具、解決方案和服務,賦能開發者。

在表格類填報需求中,根據當前登錄用戶的不同等級,能填報的區域會有所不同。本文基於前端表格控件SpreadJS,介紹一種實現前端分權限編輯的實現方案。

(SpreadJS在瀏覽器端的展示效果)

先來看看SpreadJS是什麼?

SpreadJS是一款類Excel的前端表格控件,操作及功能與Excel高度類似,但又完全脫離對Office的依賴。將SpreadJS集成到前端項目並部署發佈後,用戶只需要在PC上安裝了滿足H5標準的瀏覽器(Chrome、Firefox、Edge等),即可在瀏覽器端打開SpreadJS。

如果想更加深入的瞭解SpreadJS,可以打開官方在線體驗地址及學習指南進行學習,接下來我們來介紹分權限編輯的具體實現方案。

爲什麼會想到使用SpreadJS呢?

之所以選擇SpreadJS來做權限編輯的底層表格組件,主要是受業務人員啓發。在Excel中,有一種機制叫做表單保護。表單保護是結合單元格鎖定狀態和工作表的保護狀態,可以用來控制單元格是否可以編輯,這種可編輯控制的最小粒度可以達到單元格級別。

該如何來實現呢?

SpreadJS是一款類Excel的表格控件,具備表單保護的功能。實現編輯控制的核心API主要有單元格鎖定及表單保護。我們將編輯權限控制整體分爲三類,分別如下:

(1)整個工作表不可編輯

一個Excel文件我們稱爲一個工作簿,一個工作簿會包含多個工作表。默認狀態下,工作表的鎖定狀態爲true,此時如果想要設置整個工作表不可編輯,只要執行工作表保護相關代碼即可。

(通過SpreadJS實現整個工作表不可編輯)

通過上圖中紅框所示的代碼,Sheet1中所有單元格就不能再編輯了。如果設置完之後,發現單元格還是可以編輯,可能是因爲原來的excel文件中默認單元格的鎖定狀態被修改成false了,此時可以用代碼或右鍵設置單元格格式→保護來查看單元格的鎖定狀態。

如果需要整個工作簿都不可編輯,只需要循環去設置工作簿中每個工作表的保護狀態即可。

(2)實現部分單元格可以編輯

之前講到,不可編輯的原則是單元格鎖定&表單保護同時生效。只要目標能夠編輯的單元格不滿足這個與條件,即可進行編輯。表單保護是在工作表上的控制參數,無法對應的單元格,因此想要與條件不成立,只需要將對應單元格的鎖定狀態設置爲false即可。

(通過SpreadJS實現部分單元格可以編輯)

通過上圖中黃色區域的代碼即可實現設置A1:C6單元格可以編輯,其它單元格不能編輯的需求,這裏文件默認單元格鎖定狀態爲true,如果不生效,則需要檢查其它單元格的鎖定狀態是否被修改爲false,如果是的話,需要將其它單元格的鎖定狀態變爲true。

(3)實現部分單元格不能編輯

默認單元格鎖定狀態爲true,如果需要少量的單元格不能編輯,建議先將工作表的默認單元格鎖定狀態改爲false,之後設置部分不能編輯的單元格鎖定狀態爲true即可。

(通過SpreadJS實現部分單元格不能編輯)

通過上圖紅框中的代碼,即可實現橙色區域可以編輯,區域區域不能編輯的需求。如果需要設置多個區域可以編輯,可以繼續調用區域鎖定(locked)相關的API即可,更加詳細的UI實現設置及代碼可以參考SpreadJS官方論壇相關教程鏈接。

簡單總結一下

瞭解完單元格編輯的控制之後,接下來需要做的就是將用戶權限與單元格打通,實現基於登錄用戶權限的編輯控制。SpreadJS爲了迎合Web端需求,支持了單元格標籤(Tag)屬性,用於記錄一些和單元格相關的額外不需要展示的信息,我們就可以將單元格編輯權限的相關信息記錄在單元格Tag中。整體實現思路如下:

(1)預先在單元格Tag中設置和權限相關的信息。本方案中,將可以編輯的用戶以字符串的形式寫入單元格當中。例如單元格tag爲'user1',則代表當前單元格一級用戶可以編輯,如果單元格tag爲'user1,user2'則代表當前單元格一級用戶與二級用戶均可編輯。

(2)遍歷查詢當前單元格Tag中是否包含用戶等級標記信息,若包含,表明當前用戶可以編輯此單元格,將單元格對應的鎖定狀態變爲false。

完整的實現Demo點擊此處,跳轉了解詳細的代碼。本文提供的是權限編輯的一種參考實現思路,如果大家有更好的實現方式,歡迎在評論區討論。

擴展鏈接:

Spring Boot框架下實現Excel服務端導入導出

項目實戰:在線報價採購系統(React +SpreadJS+Echarts)

React + Springboot + Quartz,從0實現Excel報表自動化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章