如何在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




