在线表格编辑器实现批量插入功能
需求:1.在线表格编辑器中实现批量插入功能(批量插入10行,50行,100行)
2.插入后支持复制之前的样式及公式。
3.插入的操作支持撤销和重做。
实现:
实现批量插入功能:
首先需要对右键菜单做自定制:
我们先做一个批量插入的菜单组:
config.commandMap.batchInsertRowContextMenu = {
text: '批量插入',
commandName: "batchInsertRowContextMenu",
visibleContext: "ClickRowHeader",
subCommands: [
"batchInsertRows10",
"batchInsertRows50",
"batchInsertRows100"
]
};该菜单组包含三个菜单,分别为插入10行,50行和100行。
下面构建每个菜单的command:
config.commandMap.batchInsertRows10 = {
text: '插入 10 行',
commandName: "batchInsertRows10",
execute: async (context, propertyName, fontItalicChecked) => {
}
};
config.commandMap.batchInsertRows50 = {
text: '插入 50 行',
commandName: "batchInsertRows50",
execute: async (context, propertyName, fontItalicChecked) => {
}
};
config.commandMap.batchInsertRows100 = {
text: '插入 100 行',
commandName: "batchInsertRows100",
execute: async (context, propertyName, fontItalicChecked) => {
}
};这里面的execute为菜单点击之后的执行逻辑,留到与后续需求一起完成。
以上就构建好了菜单的雏形,效果如下:
2.插入后支持复制之前的样式及公式。
SpreadJS只提供了插入功能,但是用户习惯像Excel一样,插入之后复制上一行的样式及公式。这个时候就需要对已有的插入进行改造。
又由于插入的操作需要支持撤销和重做,所以需要封装命令来完成:
创建一个命令,在命令中进行插入,并且通过clipboardPaste命令进行复制(该命令在批量复制操作的情况下性能优于copyto)
config.commandMap["gc.spread.contextMenu.insertRows"] = {
commandName: "myInsertRows",
enableContext: "AllowInsertRows && selectFullRows",
text: "插入",
visibleContext: "ClickRowHeader && !AllowInsertCopiedCutCells",
execute: async (context, propertyName) => {
var commandManager = context.Spread.commandManager();
commandManager.execute({cmd: "insertRowAndCopyContent", sheetName: context.Spread.getActiveSheet().name(),rowCount:1});
}
};var commandManager = spread.commandManager();
var insertRowAndCopyContent = {
canUndo: true,
execute: function (context, options, isUndo) {
var Commands = GC.Spread.Sheets.Commands;
options.cmd = "insertRowAndCopyContent";
if (isUndo) {
Commands.undoTransaction(context, options);
return true;
} else {
Commands.startTransaction(context, options);
context.suspendPaint();
context.suspendEvent();
var sheet = context.getSheetFromName(options.sheetName);
var selections = sheet.getSelections();
for(var i = 0; i < selections.length; i++){
var row = selections.row;
sheet.addRows(row,options.rowCount);
var fromRange = ;
var toRanges = ;
spread.commandManager().execute({cmd: "clipboardPaste", sheetName: options.sheetName, fromSheet: sheet, fromRanges: fromRange, pastedRanges: toRanges, isCutting: false, clipboardText: "", pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.formulasAndFormatting});
}
context.resumeEvent();
context.resumePaint();
Commands.endTransaction(context, options);
return true;
}
}
};
var commandManager = spread.commandManager();
commandManager.register("insertRowAndCopyContent", insertRowAndCopyContent);这里将rowCount参数提了出来,为了方便批量插入能够公用。同理批量插入的execute也是调用上述的命令指示传入的rowCount参数不同。例如插入10行:
config.commandMap.batchInsertRows10 = {
text: '插入 10 行',
commandName: "batchInsertRows10",
execute: async (context, propertyName, fontItalicChecked) => {
var commandManager = context.Spread.commandManager();
commandManager.execute({cmd: "insertRowAndCopyContent", sheetName: context.Spread.getActiveSheet().name(),rowCount:10});
}
};
完整demo见附件:
页:
[1]