操作 workbooks 集合
可从 Application 对象的 Workbooks 属性中获取的 Workbooks 集合包含当前在应用程序中打开的 Workbook 对象的集合. 它还具有用于管理开放工作簿, 创建新工作簿以及打开现有工作簿文件的方法.
迭代开放式工作簿
集合实现一个称为 GetEnumerator 的特殊方法, 允许它们被迭代. 您不必直接调用 GetEnumerator 方法, 因为 C#中的 foreach 关键字使用此方法遍历一组工作簿. 有关使用 foreach 的示例, 请参见清单 5-8.
清单 5-8 使用 foreach 迭代工作簿收集的 VSTO 定制
- private void Sheet1_Startup(object sender, System.EventArgs e)
- {
- Excel.Workbooks workbooks = this.Application.Workbooks;
- foreach (Excel.Workbook workbook in workbooks)
- {
- MessageBox.Show(workbook.Name);
- }
- }
获取 workbooks 中的 workbook
要获取 Workbooks 集合中的 Workbook, 可以使用返回 Workbook 对象的 get_Item 方法. get_Item 方法具有 Index 对象类型的 Index 参数. 您可以在要访问的集合中传递表示 Workbook 的基于单一索引的 int. (Office 对象模型中几乎所有的集合都是基于 1.)
或者, 您可以传递一个表示您要访问的工作簿名称的字符串. 工作簿的名称是保存文件的名称(例如 "Book1.xls"). 如果工作簿尚未保存, 则它将是 Excel 为新工作簿创建的临时名称, 通常为 Book1, 无需扩展名. 清单 5-9 显示了使用两种索引调用 get_Item 的示例.
清单 5-9 使用带有 int 和 string Index 的 get_Item 获取工作簿的 VSTO 自定义
- private void Sheet1_Startup(object sender,System.EventArgs e)
- {
- Excel.Workbooks workbooks = this.Application.Workbooks;
- if(workbooks.Count> 0)
- {
- // 获取集合中的第一个工作簿(基于 1)
- Excel.Workbook wb = workbooks.get_Item(1);
- MessageBox.Show(wb.Name);
- // 通过传递工作簿的名称获取相同的工作簿.
- Excel.Workbook wb2 = workbooks.get_Item(wb.Name);
- MessageBox.Show(wb2.Name);
- }
- }
您也可以使用 Workbooks 集合的 Count 属性来确定打开的工作簿的数量. 您应该在通过索引访问工作簿之前检查 Count 属性, 以确保您的索引位于集合的边界内.
创建新的工作簿
要创建新的工作簿, 可以使用 Workbooks 集合的 Add 方法. Add 方法返回新创建的 Workbook 对象. 它将可选参数作为可以设置为指定用作模板的现有工作簿的文件名的字符串的对象. 或者, 您可以传递 XlWBATemplate 枚举 (xlWBATChart 或 xlWBATWorksheet) 的成员, 以指定 Excel 应使用单个图表工作表或单个工作表创建工作簿. 如果通过传递 Type.Missing 来省略参数, Excel 将创建一个新的空白工作簿, 其中包含 Application.SheetsInNewWorkbook 属性指定的工作表数. 清单 5-10 显示了创建新工作簿的几种方法.
清单 5-10 使用 Workbook 创建新工作簿的 VSTO 自定义
- private void Sheet1_Startup(object sender,System.EventArgs e)
- {
- Excel.Workbook workbooks = this.Application.Workbooks;
- // 使用 mytemplate.xls 作为模板创建一个新的工作簿
- Excel.Workbook workbook1 = workbooks.Add(@"C:\ mytemplate.xls");
- // 用一张图表表创建一个新的工作簿
- Excel.Workbook workbook2 = workbooks.Add(Excel.XlWBATemplate.xlWBATChart);
- // 设置要在其中创建的新工作表的默认数量
- // 新的空白工作簿到 10
- this.Application.SheetsInNewWorkbook = 10;
- // 创建一个带有 10 个工作表的空白工作簿
- Excel.Workbook workbook3 = workbooks.Add(missing);
- }
打开已存在的工作簿
要打开现有的工作簿, 可以使用 Workbook 集合的 Open 方法, 该方法返回已打开的 Workbook 对象. 打开一个必需的 parametera 字符串表示要打开的工作簿的文件名. 它还有 14 个可选参数, 如果不想使用任何这些参数, 您可以传递 Type.Missing. 清单 5-11 显示了调用 Open 方法的最简单的可能方法.
清单 5-11 VSTO 定制方法: 使用 Workbooks.Open 方法打开工作簿
- private void ThisWorkbook_Startup(object sender, EventArgs e)
- {
- Excel.Workbook workbook = this.Application.Workbooks.Open(
- @"c:\myworkbook.xls", missing, missing, missing,
- missing, missing, missing, missing, missing,
- missing, missing, missing, missing, missing, missing);
- MessageBox.Show(workbook.Name);
- }
关闭所有打开的工作簿
Excel 在 Workbooks 集合上提供了一个 Close 方法来关闭所有打开的工作簿. 提示用户保存任何未保存的工作簿, 除非 Application.DisplayAlerts 设置为 false. 与 Application.Quit 一样, 不能保证所有的工作簿将被实际关闭, 因为当提示保存工作簿时, 用户可以按取消按钮, 而从其他加载项中加载的其他事件处理程序可以处理 BeforeClose 事件并将 cancel 参数设置为 true.
操作工作簿对象
Workbook 对象表示 Excel 中的打开的工作簿. 该工作簿具有一个 Name 属性, 它以一个字符串的形式返回工作簿的名称(例如 "book1.xls"). 如果工作簿尚未保存, 则该属性返回文档的临时名称, 通常为 Book1. 该名称可以传递给 Workbook 集合上的 get_Item, 以通过该集合的名称访问工作簿. 如果工作簿已被保存(例如,"c:\ my documents \ book1.xls"),Workbook 还有一个 FullName 属性可返回工作簿的完整文件名. 对于新的未保存的工作簿, 它返回 Excel 给工作簿的默认名称, 如 Book1.
返回活动或选定对象的属性
Workbook 对象有一些属性返回活动的 objectsobjects 表示在 Excel 工作簿中选择的东西. 表 5-4 显示了这两个属性.
表 5-4 返回活动对象的工作簿属性
返回重要收藏的属性
Workbook 对象具有许多返回您将经常使用的集合的属性. 表 5-5 显示了其中的一些属性
表 5-5 返回重要集合的工作簿属性
访问文档属性
Workbook 有一个 BuiltinDocumentProperties 属性, 返回一个可以转换为 Microsoft.Office.Core.DocumentProperties 集合的对象, 该集合表示与工作簿关联的内置文档属性. 这些是您从 "文件" 菜单中选择 "属性" 时单击 "摘要" 选项卡, 包括 "标题","主题","作者" 和 "公司" 等属性的属性. 与工作簿关联的内置文档属性的名称如表 5-6 所示.
表 5-6 Excel 中内置文档属性的名称
Workbook 还具有一个 CustomDocumentProperties, 它返回一个可以转换为 Microsoft.Office.Core.DocumentProperties 集合的对象, 该集合表示与工作簿关联的任何自定义文档属性. 这些是您从 "文件" 菜单中选择 "属性" 时单击 "自定义" 选项卡时看到的自定义属性. 自定义属性可以由代码创建, 并用于在工作簿中存储名称和值对. DocumentProperties 集合在本章后面的 "使用文档属性" 一节中有更详细的讨论.
保存 Excel 工作簿
Workbook 对象有许多用于保存工作簿的属性和方法, 检测工作簿是否已保存, 并获取工作簿的路径和文件名.
Saved 属性返回一个 bool 值, 它告诉您工作簿的最新更改是否已保存. 如果关闭文档将导致 Excel 提示用户保存, Saved 属性将返回 false. 如果用户创建一个空白的新工作簿而不修改它, 则 "已保存" 属性将返回 true, 直到用户或代码更改文档为止. 您可以将 Saved 属性设置为 true 以防止保存工作簿, 但请注意: 由于在关闭文档时不会提示用户保存该文档所做的任何更改.
"保存" 属性的一个更常见的用途是尝试保持 "已保存" 属性的状态与代码运行前相同. 例如, 您的代码可能设置或创建一些自定义文档属性, 但如果用户在文档打开时未对文档进行任何更改, 则可能不希望用户被提示保存. 您的代码可以获取 Saved 属性的值, 对文档属性进行更改, 然后在代码更改工作簿之前将 "已保存" 值设置为该值. 这样, 您的代码所做的更改只有在用户对需要保存的文档进行其他更改时才会保存. 清单 5-12 显示了这种方法.
清单 5-1 在不影响保存的属性的情况下操作文档属性的 VSTO 自定义
- private void ThisWorkbook_Startup(object sender, EventArgs e)
- {
- bool oldSaved = this.Saved;
- try
- {
- Office.DocumentProperties props = this.
- BuiltinDocumentProperties as Office.DocumentProperties;
- props["Author"].Value = "Mark Twain";
- }
- finally
- {
- this.Saved = oldSaved;
- }
- }
要保存工作簿, 可以使用保存方法. 如果工作簿已经被保存, Excel 就会覆盖上一个保存的文件. 如果新创建的工作簿尚未保存, Excel 会尝试创建一个文件名(例如, 如果新工作簿名为 Book2, 则为 Book2.xls), 并将其保存到由 Application.DefaultFilePath 设置的默认文件路径.
如果要指定保存工作簿的文件名, 必须使用 SaveAs 方法. SaveAs 将文件名作为字符串参数. 它还需要一些可选参数, 您可以通过传递 Type.Missing 来省略它.
如果要保存工作簿的副本, 请使用 SaveCopyAs 方法, 并将其作为字符串参数传递给副本的文件名. SaveCopyAs 创建工作簿的备份副本. 它不影响所调用的工作簿的文件名或保存位置.
您还可以使用关闭方法关闭工作簿来保存该工作簿. 如果省略所有可选参数, 则在创建或打开工作簿后, 将提示用户保存工作簿. 如果将 false 传递给 SaveChanges 参数, 它将关闭工作簿而不保存更改. 如果将 SaveChanges 参数设置为 TRue, 并将文件名作为 Filename 参数的字符串传递, 则会将工作簿保存到指定的文件名.
使用几个附加属性来访问 Workbook 的文件名和位置, 如表 5-7 所示.
表 5-7 返回文件名和路径信息的工作簿属性
表 5-8 显示了与保存有关的一些其他属性.
表 5-8 与保存 Excel 工作簿相关的工作簿属性
给单元格命名
Excel 可以将名称 (字符串标识符) 与任何单元格范围相关联. 您可以通过编写代码或使用从 Excel 菜单栏中选择 "插入">"名称">"定义" 时显示的 "定义名称" 对话框来定义单元格范围的名称. 您还可以选择要将名称关联的单元格或单元格范围, 然后在公式栏左侧的名称框中键入名称, 如图 5-2 所示. 当您在名称框中键入名称时, 您需要在输入名称后按 Enter 键设置名称.
图 5-2 使用名称框命名一系列单元格 myCells
Names 属性返回可用于访问在工作簿中命名的任何范围的 Names 集合. "名称" 集合还使您能够创建新的命名范围. Names 集合在本章后面的 "使用名称集合和名称对象" 一节中有更详细的讨论.
当 Excel 嵌入另一个应用程序时
CommandBars,Container 和 IsInPlace 是在另一个应用程序 (如 Internet Explorer 或 Word) 中打开工作簿时使用的属性. IsInPlace 是一个返回一个 bool 值的属性, 它告诉您工作簿是否已经在另一个应用程序中打开. CommandBars 属性返回当文档就位时使用的 Microsoft.Office.Core.CommandBars 集合. Container 属性返回一个可用于访问包含应用程序的对象模型的对象.
创建和激活 Windows
Workbook 类有一个 NewWindow 方法, 可用于在工作簿上创建一个新窗口. 虽然您可能希望创建新窗口的方式将涉及在 Windows 集合上调用 Add, 但是它不会. 创建新窗口的唯一方法是使用此方法.
还有一种激活方法, 通过将与工作簿关联的第一个窗口设置为活动窗口来激活工作簿. 您可以通过使用 Windows 集合和 Windows 对象来激活与工作簿关联的第一个窗口以外的窗口. 有关 Windows 和 Windows 对象的更多信息, 请参阅本章后面的 "使用窗口对象" 一节.
打印工作簿
PrintOut 方法打印工作簿. 需要 8 个可选参数, 如表 5-9 所示.
表 5-9 PrintOut 方法的可选参数
保护工作簿
Excel 允许您在工作簿级别保护两件事: 工作簿中工作表的顺序以及与工作簿关联的窗口的大小和位置. Protect 方法采用三个可选参数: 密码, 结构和 Windows. 密码是一个可选参数, 您可以传递用于工作簿密码的字符串. 结构是一个可选参数, 可以设置为 true 以保护工作表顺序, 以便用户无法重新排列工作簿中工作表的顺序.
Windows 是一个可选参数, 可以设置为 true, 以保护与工作簿关联的窗口不被移动或调整大小. 例如, 您可以有两个 "平铺" 窗口显示工作簿; 锁定它们防止用户将它们从平铺位置移动. (有关平铺窗口的详细信息, 请参阅本章后面的 "安排 Windows" 一节.)
虽然所有这些参数都是可选的, 但是除非将 Structure 或 Windows 参数设置为 true, 否则工作簿保护不会真的做任何事情. 如果要保护工作簿中的单元格不被编辑, 则必须使用 Worksheet.Protect 方法.
使用工作表, 图表和表格集合
工作表, 图表和表格集合都非常相似, 因此本节将一起介绍. 它们的区别主要在于它们是否包含工作表 (工作表) 或图表 (图表) 或两者(表格). 在本节中, 如本章的其余部分, 我们使用单词表来引用图表表或工作表.
迭代打开的表格
这些集合有一个 GetEnumerator 方法, 它可以使用 C#中的 foreach 关键字进行迭代, 如清单 5-13 所示.
清单 5-13 在工作表, 图表和表格集合上重新编写的 VSTO 定制
- private void ThisWorkbook_Startup(object sender, EventArgs e)
- {
- Excel.Application App = this.Application;
- this.Charts.Add(missing, missing, missing, missing);
- foreach (Excel.Worksheet sheet in this.Worksheets)
- {
- MessageBox.Show(String.Format(
- "Worksheet {0}", sheet.Name));
- }
- foreach (Excel.Chart chart in this.Charts)
- {
- MessageBox.Show(String.Format(
- "Chart {0}", chart.Name));
- }
- foreach (object sheet in this.Sheets)
- {
- Excel.Worksheet worksheet = sheet as Excel.Worksheet;
- if (worksheet != null)
- {
- MessageBox.Show(String.Format(
- "Worksheet {0}", worksheet.Name));
- }
- Excel.Chart chart = sheet as Excel.Chart;
- if (chart != null)
- {
- MessageBox.Show(String.Format(
- "Chart {0}", chart.Name));
- }
- }
- }
在工作簿集合中访问工作表
要访问 Worksheets,Charts 和 Sheets 集合中的工作表, 您可以使用一个名为 get_Item 的方法, 该方法返回一个对象. 您需要将返回的对象转换为工作表或图表. 可以将从 Worksheets 集合返回的对象转换为 Worksheet. 从图表集合返回的对象总是可以转换为图表. 应使用 is 运算符来测试从 Sheets 集合返回的对象, 以确定返回的对象是 Worksheet 还是 Chart. 然后可以将其转换为适当的对象.
get_Item 方法使用类型为对象的 Index 参数. 您可以传递一个表示工作表或图表表的名称的字符串, 或者您可以将基于 1 的索引传递到集合中. 您可以使用 Count 属性来检查给定集合中的多少项.
添加工作表或图表表
要将工作表或图表工作表添加到工作簿, 请使用 "添加" 方法. "工作表" 和 "工作表" 集合上的 "添加" 方法使用四个可选参数:"前","后","计数" 和 "类型". 图表集合添加方法只需要前三个参数.
Before 参数可以设置为工作表或图表, 表示要添加新工作表的工作表. After 参数可以设置为工作表或图表, 表示要添加新工作表的工作表. Count 参数可以设置为要添加的新工作表的数量. Type 参数设置为 XlSheetType.xlWorksheet 以添加工作表或 XlSheetType.xlChart 来添加图表表. 请注意, 如果您在使用 Worksheets.Add 时尝试使用 xlChart 作为 Type 参数, 则 Excel 将抛出异常, 因为 Worksheets 是仅 Worksheet 对象的集合. 您可以指定 Before 或 After, 但不能同时指定两个参数. 如果省略了之前和之后的参数, Excel 将添加所有现有工作表后的新工作表.
清单 5-14 显示了在各种集合中使用 Add 方法的几种不同方法.
清单 5-14 在图表, 工作表和工作表集合中使用添加方法的 VSTO 定制
- private void ThisWorkbook_Startup(object sender, EventArgs e)
- {
- Excel.Chart chart1 = this.Charts.Add(missing,
- missing, missing, missing) as Excel.Chart;
- Excel.Chart chart2 = this.Sheets.Add(missing,
- missing, missing, Excel.XlSheetType.xlChart) as Excel.Chart;
- Excel.Worksheet sheet1 = this.Sheets.Add(chart1,
- missing, 3, missing) as Excel.Worksheet;
- Excel.Worksheet sheet2 = this.Worksheets.Add(missing,
- chart2, missing, missing) as Excel.Worksheet;
- }
表的复制
您可以使用复制方法制作工作表副本, 该方法需要两个可选参数: 前后. 您可以指定 Before 或 After, 但不能同时指定两个参数.
Before 参数可以设置为工作表或图表, 表示该表应该复制到的工作表. After 参数可以设置为表格中的工作表或图表, 然后将其复制到新的工作表. 如果省略了之前和之后的参数, Excel 将创建一个新的工作簿, 并将工作表复制到新的工作簿.
移动工作表
Move 方法将工作表移动到工作簿中的不同位置(即将工作簿移动到工作表选项卡中的不同选项卡位置), 并具有两个可选参数: 前后. 您可以指定 Before 或 After, 但不能同时指定两个参数. 如果省略了两个参数, Excel 将创建一个新的工作簿, 并将工作表移动到新的工作簿.
来源: http://www.bubuko.com/infodetail-3158847.html