
# 用户场景
在旧版本的Spread中,如果需要调整单元格格式,需要点击工具栏的单元格格式按钮,然后从弹出的模态窗中选择需要调整的格式。整个过程比较繁琐,作为一个常用的功能,这样的交互带给用户的体验是非常不好的,因此,需要调整该功能的整体交互逻辑,将使用频率较高的百分数、千分位等功能提升到工具栏中,其余使用频率较低的如时间、日期等功能以下拉列表形式展示。
除此之外,业务的小伙伴还想要自行扩展工具栏,比如添加自定义按钮、工具栏按钮分组等等、本次更新我们也实现了这部分功能,今后业务的小伙伴可以定制专属于你们的Spread工具栏啦~
# 功能介绍
## 1、设置单元格格式
常用的几个功能,百分比、千分位、增加/减少小数位数平铺在工具栏中,方便进行快速的单元格格式设置。下拉列表中则是部分使用频率较低的单元格格式,包含货币、时间、日期等,覆盖了大部分的使用场景。需要注意的是,增加/减少小数点只有在格式设置为数值、货币、会计专用、百分比时才可进行设置,否则无效。

单元格中设置的格式,下拉列表也会实时更新显示,如A单元格设置为日期,则下拉列表中选中的便是日期,B单元格设置的为货币,跳转到B单元格时,下拉列表自动选中货币。若无设置,默认显示为常规。

若需进行更多自定义的设置,我们保留了原有的弹窗设置,点击下拉列表的自定义便可以进行更加客制化的设置

## 2、二开-添加自定义按钮
业务的小伙伴进行二开时,常常需要添加一些专属于业务的自定义按钮,在以往的Spread版本是不支持添加自定义按钮的,如果业务需要添加,也只能添加到工具栏控件中,无法添加到Spread控件中。本次更新后,Spread工具栏可以通过指令的方式进行自定义按钮的添加啦,业务可以自行选择添加按钮或者下拉菜单
添加自定义按钮时,业务小伙伴可以自行配置参数,显示的图标、是否显示文字等等,给予二开极高的自由度

添加自定义按钮时,还支持将按钮添加到现有的下拉菜单中,比如,我现在想要在检查公式的下拉菜单里面添加一个自定义功能,便可以通过指令的方式添加

## 3.、二开-隐藏/锁定特定按钮
既然支持添加自定义按钮,我们当然也支持隐藏按钮啦。业务的小伙伴同样可以通过指令的方式对现有的按钮(包括自定义添加的按钮、二级下拉菜单中的按钮)进行隐藏或者锁定。既可以同时锁定全部的按钮,也可以只单独锁定某一个按钮。例如,我现在想要把检查公式下拉菜单中的按钮隐藏,并将新添加的自定义按钮锁定

## 4、二开-工具栏支持分组
以往的Spread工具栏中,所有的功能都在一排,无论是否功能相关,这个对于用户体验实际上并不好,查找功能时没有那么便捷。类似于Excel、WPS等表格工具,都有将功能按照不同种类进行分组。因此,我们也支持了二开扩展进行工具栏分组。工具栏分组提供了最为自由的定制化方案,二开可以通过指令的方式对默认功能、自定义功能进行分组、排列、锁定以及隐藏等等。比如我可以将常用的功能放在常规分组下,将编辑相关的功能放在编辑分组下,将前进、撤销功能前置等等,工具栏分组都可以实现

# 适用版本
金蝶云苍穹BOS_V5.0.013及以上
# 实现代码
## 1、二开-添加自定义按钮
```java
public void addFormulaToolsBar() {
List<Map<String, Object>> lstMap = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
map.put("key", "LockCells");
map.put("icon", "kdfont kdfont-suoding");
map.put("group", "editReport");
map.put("title", "");
map.put("index", "0");
List<Map<String, Object>> lst = new ArrayList<>();
Map<String, Object> mapDetail2 = new HashMap<>();
mapDetail2.put("title", ResManager.loadKDString("锁定含公式的单元格", "SpreadRptBasePlugin_26", "fi-rptcommon"));
mapDetail2.put("callback", "invokeAction");
mapDetail2.put("invokeAction", "lockHasFormulaCells");
mapDetail2.put("key", "lockHasFormulaCells");
mapDetail2.put("icon", "");
mapDetail2.put("showTitle", true);
lst.add(mapDetail2);
Map<String, Object> mapDetail3 = new HashMap<>();
mapDetail3.put("title", ResManager.loadKDString("解锁含公式的单元格", "SpreadRptBasePlugin_27", "fi-rptcommon"));
mapDetail3.put("callback", "invokeAction");
mapDetail3.put("invokeAction", "unLockHasFormulaCells");
mapDetail3.put("key", "unLockHasFormulaCells");
mapDetail3.put("icon", "");
mapDetail3.p