You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在C#开发的Excel VSTO插件中阻止用户增删列?

阻止Excel VSTO插件用户增删列的实现需求与问题

我正在维护一款仅适配特定文件的Excel VSTO插件,该插件不支持列的插入/删除操作。为保障文件数据安全,我希望阻止用户执行此类操作。

已尝试的方案及存在的问题

  • 通过C#调用Protect()方法保护工作表,但该方法仅在锁定内容的情况下才能限制列的增删,而我无法锁定内容;
  • 使用AppEvents中的SheetChange事件,但未找到取消变更的方法,我认为该事件不支持此功能,若有误请指正;
  • 了解到存在Undo package,但因偏好避免外部依赖,且Undo()会触发SheetChange事件连锁反应,增加复杂度,暂未尝试。

请问是否存在一种简单的C#实现方式,可在不锁定其他内容的前提下阻止用户增删Excel工作表中的列?


临时解决方案更新

我目前搭建了一个临时解决方案,代码如下:

AppEvents_SheetChangeEventHandler EventSheetChangeHwnd;

private void ThisAddin_Startup(object sender, EventArgs e)
{
    Application.SheetChange -= EventSheetChangeHwnd;
    EventSheetChangeHwnd = new AppEvents_SheetChangeEventHandler(SheetChange_Event);
    Application.SheetChange += EventSheetChangeHwnd;
}

private void SheetChange_Event(Object Sh, Range Target)
{
    if(!Target.Address.Equals(Target.EntireColumn.Address)) // Can use Target.Row != 1 too to check faster and remove unwanted occurences
        return;

    Application.EnableEvents = false; // Prevents event from re-firing after undo
    Application.Undo();               // Native undo method
    Application.EnableEvents = true;

}

但该方案存在以下问题:

  • 每次单元格值变更都会触发事件,逐单元格写入数据时会影响处理速度;
  • 复制粘贴整列或整张工作表时也会触发事件,无法精准检测列增删操作;
  • 使用Application.EnableEvents可能存在副作用,且需要额外代码处理。

内容的提问来源于stack exchange,提问作者Cedt

火山引擎 最新活动