初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
前一篇:VSTO(C#)Excel开发1:起步 示例项目-CSDN博客
前一篇已经能够运行excel扩展并能够使用按钮事件来显示消息,现在我们了解如果访问Execl里面的东西。
目录
一、Excel对象模型
二、程序如何访问对象模型
三、示例代码
四、基本操作
4.1 Application
4.2 Workbook
4.3 Worksheet
4.4 Range
一、Excel对象模型
Excel提供了一个对象模型,外接程序通过对象模型来访问功能。对象模型里面最重要的四个对象是:
- Application 总入口,表示整个Excel程序
- Workbook 工作簿,也就是文件
- Worksheet 工作表
- Range 这个好麻烦,可以代表一个单元格、一行、一列、连续区域,以及多个连续区域甚至多张工作表的多个连续区域
每个对象都有一些属性和方法供操作。
二、程序如何访问对象模型
Excel对象模型位于Microsoft.Office.Interop.Excel下,可以添加using以简化访问:
using Microsoft.Office.Interop.Excel;//直接使用Worksheet Range
或者
using Excel = Microsoft.Office.Interop.Excel;//使用Excel.Worksheet
Application对象是默认生成的类ThisAddIn的成员,在ThisAddIn类里面可以直接访问:
不加“this”也可以。(上面增加的代码来自微软的教程,没什么意思)
在其他类不能直接访问,但可以使用Globals.ThisAddIn.Application来访问:
后面详细介绍这段代码。
三、示例代码
我们现在修改上次编写的button1_Click函数:
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博客
(这里是文档结束)