本帖最后由 Wilson.Zhang 于 2025-6-30 11:16 编辑
背景:跨电子表格应用复制粘贴,右键菜单复制后,SpreadJS无法读取到系统剪贴板中的内容。针对该问题,申请系统剪贴板权限,读取内容。
问题原帖:https://gcdn.grapecity.com.cn/showtopic-238884-1-1.html
在Microsoft Excel中,ctrl+c复制时将复制内容写入操作系统剪贴板,Microsoft Excel和SpreadJS都能够通过ctrl+v从操作系统剪贴板中读取复制内容进而粘贴,如图1所示。
图1. Microsoft Excel ctrl+c复制
Microsoft Excel右键菜单复制功能最终也将内容写入操作系统剪贴板,在不同的Microsoft Excel应用中,右键菜单粘贴功能均能正常读取操作系统剪贴板中存储的复制内容,如图2所示。
图2. Microsoft Excel 右键菜单复制
在SpreadJS中,ctrl+c写入数据至操作系统剪贴板,其他电子表格应用通过ctrl+v读取操作系统剪贴板内容。除SpreadJS应用外,其他电子表格应用也可以通过右键菜单粘贴读取操作系统剪贴板内容。如图3所示。
图3. SpreadJS ctrl+c复制
SpreadJS右键菜单复制功能将数据写入内部剪贴板,无权限写入操作系统剪贴板。相应地,SpreadJS右键菜单粘贴功能也从内部剪贴板读取内容,无权限读取操作系统剪贴板。那么,其他电子表格应用从操作系统剪贴板也就读取不到SpreadJS的复制内容。如图4所示。
图4. SpreadJS 右键菜单复制
SpreadJS右键菜单复制粘贴功能默认无权限访问操作系统剪贴板,因此,对于Microsoft Excel右键菜单复制功能写入操作系统剪贴板的内容,SpreadJS无法获取。同理,对于SpreadJS右键菜单复制功能写入内部剪贴板的内容,其他电子表格应用也无法获取,包括其他SpreadJS实例。这便是SpreadJS在跨电子表格应用场景中复制粘贴受限的原因所在。如果SpreadJS能够访问操作系统剪贴板,那就可以增强数据流通了。
既然SpreadJS无权限访问操作系统剪贴板,那我们就在程序内部通过navigator.clipboard.read()读取操作系统剪贴板中的内容,根据业务需要处理内容,之后通过Worksheet:setValue()或Worksheet:setArray()填充在单元格中。同理,将SpreadJS内部数据通过navigator.clipboard.write()写入操作系统剪贴板中,可根据需要组织数据。需要注意的是,为了确保在不同SpreadJS应用之间能够畅通无阻,写入和读取内容的逻辑应该互反,以此闭环。如图5所示,在不同的SpreadJS应用之间通过操作系统剪贴板传递数据。
图5. 访问操作系统剪贴板
同理,在Microsoft Excel中通过右键菜单复制功能,数据被写入操作系统剪贴板,然后在业务程序中先读取了操作系统剪贴板中的内容,再解析后将其按序填充至SpreadJS单元格中,如图6所示。
图6. 读取操作系统剪贴板
以上仅是一个思路,实际场景更复杂,仅供参考。另外,该方案只支持纯文本复制粘贴,公式、形状等均不支持。
附上demo,以供参考。
|