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


(这里是文档结束)

相关推荐
hello_simon4 小时前
免费在线文档工具,在线PDF添加空白页,免费在任意位置插入空白页,多样化的文件处理
pdf·html·excel·pdf转html·excel转pdf格式
chenchihwen5 小时前
常用 Excel VBA 技巧,简单好学易上手
excel
夔8886 小时前
Excel通过VBA脚本去除重复数据行并保存
java·服务器·excel
啊波次得饿佛哥7 小时前
excel中的VBA指令示例(一)
excel·vba
inxunoffice7 小时前
批量将 JSON 转换为 Excel/思维导入等其它格式
json·excel
忘忧记8 小时前
如何在 Excel 中处理并拆分你提供的这种混合单位的库存数据。
excel
CAT_cwds1 天前
EasyExcel-一款好用的excel生成工具
excel·easy
Eiceblue1 天前
C# 设置Excel中文本的对齐方式、换行、和旋转
开发语言·c#·excel
刘大猫.1 天前
java导入excel更新设备经纬度度数或者度分秒
java·excel·导入excel·经纬度·度分秒·经纬度 度数·经纬度 度分秒