VSTO(C#)Excel开发2:Excel对象模型和基本操作

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

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

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

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


前一篇:VSTO(C#)Excel开发1:起步 示例项目-CSDN博客

前一篇已经能够运行excel扩展并能够使用按钮事件来显示消息,现在我们了解如果访问Execl里面的东西。

目录

一、Excel对象模型

二、程序如何访问对象模型

三、示例代码

四、基本操作

[4.1 Application](#4.1 Application)

[4.2 Workbook](#4.2 Workbook)

[4.3 Worksheet](#4.3 Worksheet)

[4.4 Range](#4.4 Range)


一、Excel对象模型

Excel提供了一个对象模型,外接程序通过对象模型来访问功能。对象模型里面最重要的四个对象是:

  • Application 总入口,表示整个Excel程序
  • Workbook 工作簿,也就是文件
  • Worksheet 工作表
  • Range 这个好麻烦,可以代表一个单元格、一行、一列、连续区域,以及多个连续区域甚至多张工作表的多个连续区域

每个对象都有一些属性和方法供操作。

二、程序如何访问对象模型

Excel对象模型位于Microsoft.Office.Interop.Excel下,可以添加using以简化访问:

cs 复制代码
using Microsoft.Office.Interop.Excel;//直接使用Worksheet Range
或者
using Excel = Microsoft.Office.Interop.Excel;//使用Excel.Worksheet

Application对象是默认生成的类ThisAddIn的成员,在ThisAddIn类里面可以直接访问:

不加"this"也可以。(上面增加的代码来自微软的教程,没什么意思)

在其他类不能直接访问,但可以使用Globals.ThisAddIn.Application来访问:

后面详细介绍这段代码。

三、示例代码

我们现在修改上次编写的button1_Click函数:

cs 复制代码
		private void button1_Click(object sender, RibbonControlEventArgs e)
		{
			string str = "Application 版本:" + Globals.ThisAddIn.Application.Version + "\n";
			try
			{
				str += "原始Caption:" + Globals.ThisAddIn.Application.Caption + "\n";
				Globals.ThisAddIn.Application.Caption = "1234567";
				str += "工作簿总数:" + Globals.ThisAddIn.Application.Workbooks.Count + "\n";
				str += "当前工作簿:" + Globals.ThisAddIn.Application.ActiveWorkbook.Name + "\n";
				str += "工作表总数:" + Globals.ThisAddIn.Application.Worksheets.Count + "\n";
				Worksheet activeSheet = Globals.ThisAddIn.Application.ActiveSheet;
				str += "当前工作表:" + activeSheet.Name + "\n";
				str += "列总数:" + (null != activeSheet.Columns ? activeSheet.Columns.Count : -1)
					+ " 行总数:" + (null != activeSheet.Rows ? activeSheet.Rows.Count : -1)
					+ " UsedRange:" + activeSheet.UsedRange.Address
					+ "\n";

				Range currentCell = Globals.ThisAddIn.Application.ActiveCell;
				str += "当前单元格:" + currentCell.Address + " 内容:" + currentCell.Text+"\n";

				//str += "Cells:" + activeSheet.Cells.Count;//新建或有数据或保存过的都触发异常

				activeSheet.get_Range("A1:B1").Value = new string[2] { "Value", "2" };
				activeSheet.get_Range("A2:A3").Value = new string[2] { "Value", "2" };//竖着是无效的,只会重复第一个数据
				activeSheet.get_Range("B5").Value2 = "Value2";
				activeSheet.get_Range("C5:C10").Value2 = "Value2";
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.ToString());
			}
			MessageBox.Show(str);
		}

直接执行应该是没问题的(注释掉的那句会引发异常,我们先回避,以后再搞清楚到底怎么回事,数据模型的设计本身也未必很久严谨,毕竟是很多年逐渐改出来的)。

先点击运行,会自动打开Excel,选择空新建工作簿,然后点击"加载项",最后点击我们写的按钮"button1",效果如下图(注意内容都是代码添加上去的):

由于代码中添加内容是在消息框之后执行的,所以消息框显示的是无数据时的状态。再点一次"button1"显示的就不一样了:

四、基本操作

4.1 Application

  • Version 获取Excel的版本
  • Caption 获取完整的标题栏(包括工作簿名称)或者设置标题栏的后半部(不包括工作簿名称)
  • Workbooks 所有的工作簿的集合
  • ActiveWorkbook 当前工作簿
  • ActiveSheet 当前工作表
  • ActiveCell 当前单元格

4.2 Workbook

  • Name 工作簿的名称

4.3 Worksheet

  • Name 工作表的名称
  • Columns 列的集合,从示例看行和列的Count和实际用到的没关系
  • Rows 行的集合
  • Cells 这个看起来是单元格的集合但是调用它的Count就会抛出异常,所以先别用吧
  • UsedRange 使用的单元格,示例代码多尝试几次中可以看出来是有内容的矩形范围,注意示例代码的消息框显示的是点击按钮之前的状态,有人说删除数据不影响这个值,从这个测试代码看不出来,或许还有别的原因吧,比如设置格式之类
  • get_Range 获取单元格或一组单元格,这个才是我们用来操作单元格的对象

4.4 Range

  • Address 单元格或很多单元格的地址
  • Value 单元格的值,如果是一组单元格就要传入数组,获取的时候也是得到数组,实话说我挺困惑的,不是很适应这种过于灵活的编程语言的思路
  • Value2 按照别人的说法,跟Value的区别是不会处理某些复杂格式
  • Text 获取文本,如果是很多单元格,会拼接在一起,这个属性是只读的

下一篇:VSTO(C#)Excel开发3:Range对象 处理列宽和行高-CSDN博客


(这里是文档结束)

相关推荐
wtsolutions2 小时前
Excel-to-JSON本地化Excel插件发布 - 在Excel中安全离线转换数据
安全·json·excel
用户298698530142 小时前
Python 实现 Excel 与 TXT 文本的高效转换与导出
后端·python·excel
VBA63372 天前
数组与字典解决方案第二十九讲 数组的创建方法小结及回填的注意事项
vba
AI导出鸭PC端2 天前
告别导出难题:AI 导出鸭助力 Claude 输出 excel 一站式实现
人工智能·ai·excel·豆包·ai导出鸭
Am-Chestnuts2 天前
DeepSeek 表格如何导出 Word/Excel:Markdown 表格、CSV 与 DS随心转方案对比
word·excel
城数派2 天前
2000-2026年我国省市县三级逐月NDVI数据(Shp/Excel格式)
excel
许彰午3 天前
74_Python自动化办公之Excel操作
python·自动化·excel
E_ICEBLUE3 天前
在 Python 中快速锁定 Excel 单元格与行列
python·安全·excel
Non-existent98720 天前
WPS批量清理单元格空白字符的4种方法-异常数字格式处理-实战
excel·wps
Channing Lewis20 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel