当前位置: 首页 > news >正文

VSTO(C#)Excel开发10:启动和卸载顺序 事件处理 监视变化

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


        上一篇 VSTO(C#)Excel开发9:处理格式和字体-CSDN博客

        我们已经能够对内容和格式进行简单的处理,但是如果涉及到外部的连接和未保存的数据,我们应该在哪里处理呢?这就需要了解启动和卸载的顺序。为了在用户修改时能及时更新,也需要监测事件。

目录

一、整个加载项的启动和卸载

二、工作簿打开和关闭

三、监视单元格变化 变化通知

3.1 用Application的SheetChange

3.2  用Worksheet的Change

3.2 以上两种方法都不能监测格式改变


一、整个加载项的启动和卸载

        ThisAddin.cs很简单,就是定义了加载项启动和卸载时被调用的函数:

         很容易看明白。注意我在ThisAddIn_Shutdown里面加了一个消息框,可以用来判断被调用的时机,实测证明,Shutdown事件是在提示是否保存之后发生的,也就是执行到Shutdown整个Excel的关闭是不可避免的了。

二、工作簿打开和关闭

        Application对象还有很多事件可供处理,与工作簿相关的都以Workbook开头:

        打开工作簿触发WorkbookOpen(注意不是新建),关闭工作簿前触发WorkbookBeforeClose,我们可以为感兴趣的事件编写处理代码:

		private void ThisAddIn_Startup(object sender, System.EventArgs e)
		{

			this.Application.WorkbookBeforeClose += Application_WorkbookBeforeClose;
			this.Application.WorkbookOpen += Application_WorkbookOpen;
			this.Application.SheetChange += Application_SheetChange;

			Log.LogI("ThisAddIn_Startup");
		}

		private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
		{
			MessageBox.Show("ThisAddIn_Shutdown");
		}
		private void Application_WorkbookBeforeClose(Microsoft.Office.Interop.Excel.Workbook workbook, ref bool Cancel)
		{
			MessageBox.Show("Application_WorkbookBeforeClose");
		}
		private void Application_WorkbookOpen(Microsoft.Office.Interop.Excel.Workbook workbook)
		{
			MessageBox.Show("Application_WorkbookOpen");
		}

         每个事件的委托的参数都是不一样的,以上代码演示了工作簿打开和关闭的写法,通过实测弹出消息框的先后可以知道触发的时机和顺序。

三、监视单元格变化 变化通知

3.1 用Application的SheetChange

        代码:

		private void ThisAddIn_Startup(object sender, System.EventArgs e)
		{
。。。。。。
			this.Application.SheetChange += Application_SheetChange;
。。。。。。
		}

		private void Application_SheetChange(object Sh, Range Target)
		{
			MessageBox.Show("Application_SheetChange "+ Target.Address);
		}

        修改单元格的内容就会弹出消息框:

        注意是编译完毕,鼠标点到其它单元格时才触发的,如果是批量操作只弹出一次:

3.2  用Worksheet的Change

        前面用Application的SheetChange有点复杂,因为可能有多个工作簿和多个工作表,虽然从Range对象是可以找到所属的工作簿和工作表的,毕竟多了几步。

        用工作表的Change事件就比较直接了,代码如下:

workSheet.Change += ActiveSheet_Change;

		private void ActiveSheet_Change(Range Target)
		{
			......
		}

        重点是委托类型(也就是参数写法)。

3.2 以上两种方法都不能监测格式改变

        我还没找到方法。


(这里是文档结束)

相关文章:

  • A SURVEY ON POST-TRAINING OF LARGE LANGUAGE MODELS——大型语言模型的训练后优化综述——第2部分
  • Java8计算集合属性的最大值
  • C# 表达式树详解
  • SpringBoot的并行SQL任务并完成所有任务之后返回操作
  • Shell条件判断
  • PortSwigger——OAuth 2.0 authentication vulnerabilities
  • JavaScript代码性能优化
  • NPU、边缘计算与算力都是什么啊?
  • 应用层之网络应用模型,HTTP/HTTPS协议
  • ChatGPT、DeepSeek、Grok:AI 语言模型的差异与应用场景分析
  • 图神经网络学习笔记—纯 PyTorch 中的多 GPU 训练(专题十二)
  • (七)Spring Boot学习——Redis使用
  • 安卓编译问题
  • 人工智能之数学基础:如何将线性变换转换为矩阵?
  • BUG 详解 [软件测试]
  • Celery在Django中的作用
  • 【Python+HTTP接口】POST请求不同请求头构造
  • Certbot实现SSL免费证书自动续签(CentOS 7版 + Docker部署的nginx)
  • 【MySQL篇】基本查询实战OJ
  • [Hello-CTF]RCE-Labs超详细WP-Level13Level14(PHP下的0/1构造RCE命令简单的字数限制RCE)
  • 公元1058年:柳永词为什么时好时坏?
  • “女硕士失踪13年生两孩”案进入审查起诉阶段,哥哥:妹妹精神状态好转
  • 中国创面修复学科发起者之一陆树良教授病逝,享年64岁
  • 极限拉扯上任巴西,安切洛蒂开启夏窗主帅大挪移?
  • 马上评丨75万采购300元设备,仅仅终止采购还不够
  • 中美日内瓦经贸会谈联合声明