介绍 本篇为Office文档模型深入系列第2篇,主要介绍Excel文档模型中最重要4个类中的Workbook和Worksheet,这两个类分别对应Excel中的工作薄和工作表,本篇介绍了他们常用的属性和Excel操作常见功能的实现,并且给出一个简单的示例。
一.Workbook类:
虽然标题叫Workbook类,但严格来说这样是不正确的,通过查询MSDN上的命名空间我们可以发现 Workbook和Worksheet都只是接口,我们平常所调用的其实是WorkbookClass和WorksheetChass,叙述习惯,继续沿用,但希望大家能了解到这一点。
Workbook对应于Excel中的工作薄,在这里我们可以实现对工作薄的几乎所有操作。WorkBook类提供有大约90多个属性,其中有不少开发人员没有必要理会,下面介绍下可能用到的的属性和其对应的操作。
0.打开Excel文档
这一部分不属于Workbook内容,但COM组件引用很多地方与大家习惯不同,为方便大家尽快上手,先贴出些代码
2 // ........
3 // 初始化应用程序
4 Excel.Application xapp = new Microsoft.Office.Interop.Excel.Application();
5 if (xapp == null )
6 {
7 Console.WriteLine( " No Excel File " );
8 return ;
9 }
10 string FilePath = Environment.CurrentDirectory + @" \ExcelFile\Demo1.xls " ;
11
12 // 初始化方法Workbook
13 Excel.Workbook xbook = xapp.Workbooks.Open(FilePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
14 Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
15
16 // 获取其他WorkBook
17 Excel.WorkbookClass CurrentWorkBook = ((Excel.WorkbookClass)xapp.Workbooks[ 1 ]);
这里面可以看出来Workbook初始化时候参数非常多,达到十几个,而且C#不像VB一样可以留空参数,所以得使用反射中的Missing.Value。而且在最后一行中Workbooks[1] 其实代表的是第一个工作薄,在Office COM组件里,集合的索引都是从1开始的,否则会引发异常COMException。此外,没有调用COM组件的朋友会发现类库中各种属性返回的值几乎都是object类型,需要有强制的类型转换,这点刚开始不会很习惯。
1.文档属性(Name,FullName,Path)
Name返回文件名,Path返回文件路径,FullName返回完整路径与文件名
2 Console.WriteLine( " {0}:{1} " , " 文件完整路径 " ,CurrentWorkBook.FullName);
3 Console.WriteLine( " {0}:{1} " , " 文件路径 " , CurrentWorkBook.Path);
2.样式(Style)
Excel为大家提供了丰富多彩的样式,如下图所示:
我们平常所见的数字类型,对齐格式,字体,边框,填充,保护都属于样式的范畴,在这里可以充分地自定义。WorkBook中提供对本工作薄中出现样式的索引,考虑到知识的连贯性,样式具体的讲解我们放到第三篇Range类中进行详细介绍,这里贴出来一段代码以作示范
2 // 样式类型
3 const String STYLE_NAME = " PropertyBorder " ;
4 Excel.Range rng = xapp.get_Range(xapp.Cells[ 1 , 1 ],xapp.Cells[ 4 , 4 ]);
5 Excel.Style TempStyle ;
6 try
7 {
8 TempStyle = CurrentWorkBook.Styles[STYLE_NAME];
9 }
10 catch
11 {
12 TempStyle = CurrentWorkBook.Styles.Add(STYLE_NAME, Type.Missing);
13 }
14 TempStyle.Font.Name = " Verdana " ;
15 TempStyle.Font.Size = 14 ;
16 TempStyle.Interior.Pattern = Excel.XlPattern.xlPatternSolid;
17 rng.Style = TempStyle;
18 #endregion
上述代码将(1,1)到(4,4)单元格的样式设置为字体"Verdana", 字号14,并且设置了内部线条样式。
3.密码
通过Password属性可以获取与设置密码,当设置密码后,HasPassword会做相应的改变,不过获取的Password值总是为********,想直接通过这个属性来做Excel密码破解工具的朋友得换个思路了。
2 if ( ! xbook.HasPassword)
3 {
4 xbook.Password = " 12345 " ;
5 }
6 Console.WriteLine( " {0}:{1} " , " 密码 " , xbook.Password);
7 #endregion
4.其他属性
在上面之外,有一些属性并不需要开发人员在意的,如AutoUpdateFrequency (工作薄自动更新的时间),Date1904 (是否采用1904日期系统),PasswordEncryptionAlgorithm (设置加密的具体算法),RevisionNumber(返回共享后的版本号,如果设置为私有的话,会返回0)。
也有一些属性用于获取当前的对象,如ActiveChart,ActiveSheet,还有最常用的Sheets,用以返回当前Workbook的WorkSheet,稍后我们就开始Worksheet的内容。
5.方法
其实在这里面,了解了属性,也就了解了一大半方法了,“最经常的是一个属性允许该行为,而由一个方法来提供该行为”(MSDN)。去除这些属性相关的方法外,还有些方法会经常用到的如下:
- Active() :激活一个工作薄,并且打开第一个工作表
- Close():关闭工作薄,不过此方法没法真正的关闭工作薄。
- Protect():调用此方法以保护工作薄,从而保护工作薄不能新增Worksheet,此方法可以选用参数来设置密码和是否保护工作薄结构(保护后不能移动工作薄),如果把保护工作表里的数据的话还需要针对工作表来进行保护。
- UnProtect():与Potect( )相对应的,必然会有一个UnProtect()
- Save(): 保存工作薄
- SaveAs():另存工作薄,不过这个方法较Save()的参数明显复杂得多,有文件名,文件格式,密码,是否为本地等选项。
- SaveCpoyAs():将工作表的一个副本保存到文件,这个方法在做备份时十分好用
- SendMail():顾名思义,将本工作薄发出来,不过之前要设置一系列配置,后面计划有专题。
2 // 激活该工作薄
3 CurrentWorkBook.Activate();
4 // 关闭该工作薄
5 CurrentWorkBook.Close();
6 // 保护该工作薄
7 CurrentWorkBook.Protect( " password " , Type.Missing, Type.Missing);
8 // 保存该工作薄
9 CurrentWorkBook.Save();
10 CurrentWorkBook.SaveAs( " C:\\MyWorkbook.xml " , Excel.XlFileFormat.xlXMLSpreadsheet, Type.Missing,
11 Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
12 CurrentWorkBook.SaveCopyAs( " C:\\MyWorkbook.bac " );
13 #endregion
二.Worksheet类
通过Workbook类,我们已经了解到Worksheet的大部分功能了,他们的属性大多是相同的,只是worksheet将工作簿中的属性限制在一个特定的工作表中。
1.WorkBook的sheets属性
我们先接着Workbook中刚才跳过去的sheets属性开始,Workbook为sheet属性提供了常用的操作,这些也是使用频率比较高的:
1)Visible:
通过Visible属性来设置工作表的可视状态,设定的范围为XlSheetVisibility 枚举值(XlSheetHidden、XlSheetVeryHidden、xlSheetVisible)其中XISheetHidden为用户可设置的隐藏,而XISheetVeryHidden为编程设置的隐藏,用户无法操作。
2)Add(),Delete():
Add方法用于新增worksheet,提供参数有四个,其中两个限制的表的位置(before,after),此外还有表的数目和表的类型(worksheet还是chart)
Delete方法功能简单,调用更简单,无参数
3)Copy(),Move():
Copy方法提供一个表的副本并将其插入工作薄的指定位置,如果没有手动设置位置,Excel会创建一个新的Workbook来储存之。
Move方法与Copy方法就像复制和剪切一样,其余相同
4)FillAcrossSheet()
用这个方法将工作表内的一部分数据复制到另一个表中,可以设置的参数包括范围 (Range对象),是否复制数据和复制时的格式(XlFillWith枚举,可以设置全部复制还是只复制格式
或内容).
5) PrintPreview(),PrintOut()
PrintPreview()函数设定打印预览,可以通过参数来设置禁止更改页面格局。
PrintOut直接调用打印,这个函数可以设置打印时的绝大多数参数,包括,打印的起始截止页码,副本数量,打印前是否预览,打印机名等
6) Select()
Select方法用于设置用户的选择,许多对象都有这个方法。
相关代码示例:
3 #region Sheets操作
4 // 新增工作表
5 CurrentWorkBook.Sheets.Add(Type.Missing, Type.Missing, 1 , Type.Missing);
6 // 删除新获取的工作表
7 Excel.Worksheet TodeleteWorksheet = (Excel.Worksheet)CurrentWorkBook.Sheets[ 3 ];
8 TodeleteWorksheet.Delete();
9 // 复制工作表
10 CurrentWorksheet.Copy( 3 , 2 );
11 // 复制工作表中数据到另一工作表
12 CurrentWorkBook.Sheets.FillAcrossSheets(rng, Excel.XlFillWith.xlFillWithAll);
13 // 打印工作表
14 CurrentWorkBook.Sheets.PrintOut(Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
15 // 设置工作表可见性
16 CurrentWorksheet.Visible = Excel.XlSheetVisibility.xlSheetVisible;
17 #endregion
2.工作表的保护
在Workbook中我们也提到了工作表的保护,不过那里的保护是针对工作薄的结构,以限制新增修改移动工作表。而WorkSheet的保护是针对具体单元格内数据的,Excel程序中支持保护的内容如下图
在程序里我们自然也可以做相关限定。
WorkSheet的保护方法自带的参数有 有密码,保护范围和具体的保护内容。密码可以留空,保护内容与图中所列一一对照,以bool值传入。保护范围包括保护是否保护形状(DrawingObjects),是否保护内容(Contents), 是否保护方案(Scenarios),是否仅允许界面修改(UserInterfaceOnly),需要注意的是这个如果设置为true的话,是只能程序修改,设为false的话是都不能修改....后面Allow开头的就是各种限制
3 [In, Optional] object Password,
4 [In, Optional] object DrawingObjects,
5 [In, Optional] object Contents,
6 [In, Optional] object Scenarios,
7 [In, Optional] object UserInterfaceOnly,
8 [In, Optional] object AllowFormattingCells,
9 [In, Optional] object AllowFormattingColumns,
10 [In, Optional] object AllowFormattingRows,
11 [In, Optional] object AllowInsertingColumns,
12 [In, Optional] object AllowInsertingRows,
13 [In, Optional] object AllowInsertingHyperlinks,
14 [In, Optional] object AllowDeletingColumns,
15 [In, Optional] object AllowDeletingRows,
16 [In, Optional] object AllowSorting,
17 [In, Optional] object AllowFiltering,
18 [In, Optional] object AllowUsingPivotTables
19 );
与Protect相对应的,也必然有个UnProtect(),解除保护的方法比较简单,不再做介绍
但是还没有结束,Excel又很温馨地为大家提供了Protection对象和 AllowEditRanges 对象,他们分别封装了调用保护方法时的设置的信息和允许编辑区域的信息。
Protection中有各种Allow开头属性的bool值。AllowEditRanges对象包括了一个AllowEditRange对象集合,AllowEditRange对象包含了诸如Range,Title,Users等有用的数据
3. 批注
批注可以在Excel中的指定区域提供文字描述信息。这个属性通常由Range来添加,WorkSheet自带用Comments属性用以返回Comment对象,可以实现对WorkSheet中各个批注的遍历
3 {
4 rng.Comment.Delete();
5 }
6 rng.AddComment( " Comment added " + DateTime.Now);
7
8 // 遍历显示批注
9 for ( int i = 1 ; i <= CurrentWorksheet.Comments.Count; i ++ )
10 {
11 CurrentWorksheet.Comments[i].Visible = true ;
12 }
4.分组
Excel允许通过分组来合并数据,当然我们也可以在代码中使用这个功能,下面是Excel分组功能的一个简单的效果
在这里面是一个二级的分组,我们现在来看下Excel为我们提供了什么属性:
WorkSheet的Outline属性会返回一个Outline对象,这个对象相对简单,他主要用到四个成员,AutomaticStyles,SummaryColumn,SummaryRow,
接下来我们需要 创建一个组,用以将几个Range对象合并
2 // 建立分组
3 rng.Group(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
4 // 显示折叠线
5 CurrentWorksheet.Outline.ShowLevels( 3 , Type.Missing);
WorkBook和WorkSheet的介绍告一段落,接下来会介绍最常用的类 Range 以及拓展的功能如图表,邮件,希望能够对大家有帮助。
Example下载:提供本篇内容示例