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博客


(这里是文档结束)

相关推荐
kylezhao201911 小时前
C# Excel开源操作库MiniExcel使用教程
开发语言·c#·excel
初级代码游戏14 小时前
VSTO(C#)Excel开发3:Range对象 处理列宽和行高
excel·vba·vsto
trabecula_hj15 小时前
SpreadVue实现内置excel在线编辑并保存为后端可以接受的json格式
json·excel·spreadjs·spreadvue
烟图黛螺17 小时前
VBA 数据库同一表的当前行与其他行的主键重复判断实现方案
数据库·oracle·vba
西西弗Sisyphus18 小时前
使用 Python pandas操作 Excel 文件
python·excel·pandas
我不是彭于晏丶1 天前
蓝桥杯 Excel地址
职场和发展·蓝桥杯·excel
剪刀石头布啊2 天前
exceljs导入导出excel
前端·excel
梨轻巧2 天前
excel 数据透视表的创建、快速更新、格式修改
excel
冱洇2 天前
171. Excel 表列序号
算法·leetcode·excel