VSTO:使用C#开发Excel、Word【14】
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VSTO:使⽤C#开发Excel、Word【14】
操作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();
}
}
获取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();
//通过传递⼯作簿的名称获取相同的⼯作簿。
Excel.Workbook wb2 = workbooks.get_Item();
MessageBox.Show();
}
}
您也可以使⽤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();
}
关闭所有打开的⼯作簿
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属性返回当⽂档就位时使⽤的
mandBars集合。
Container属性返回⼀个可⽤于访问包含应⽤程序的对象模型的对象。
创建和激活Windows
Workbook类有⼀个NewWindow⽅法,可⽤于在⼯作簿上创建⼀个新窗⼝。
虽然您可能希望创建新窗⼝的⽅式将涉及在Windows集合上调⽤Add,但是它不会。
创建新窗⼝的唯⼀⽅法是使⽤此⽅法。
还有⼀种激活⽅法,通过将与⼯作簿关联的第⼀个窗⼝设置为活动窗⼝来激活⼯作簿。
您可以通过使⽤Windows集合和Window对象来激活与⼯作簿关联的第⼀个窗⼝以外的窗⼝。
有关Windows和Window对象的更多信息,请参阅本章后⾯的“使⽤窗⼝对象”⼀节。
打印⼯作簿
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}", ));
}
foreach (Excel.Chart chart in this.Charts)
{
MessageBox.Show(String.Format(
"Chart {0}", ));
}
foreach (object sheet in this.Sheets)
{
Excel.Worksheet worksheet = sheet as Excel.Worksheet;
if (worksheet != null)
{
MessageBox.Show(String.Format(
"Worksheet {0}", ));
}
Excel.Chart chart = sheet as Excel.Chart;
if (chart != null)
{
MessageBox.Show(String.Format(
"Chart {0}", ));
}
}
}
在⼯作簿集合中访问⼯作表
要访问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将创建⼀个新的⼯作簿,并将⼯作表移动到新的⼯作簿。