用Visual Studio .NET自动化MS Excel
介绍
我写这篇文章是为了回应那些我在的e-mail中得到的要求,就是如何自动化MS Excel。许多正在看这篇文章的人也许也对下面关于如何自动化MS Word文档有兴趣,这儿有链接Automating MS Word using C#, 还有另外一个链接 Automating MS Word using C++.
回到主题,在商业世界中有许多电子表格,越来越我们不会只创建和使用简单的Excel,例如存储敏感和非常重要的试验数据等等……
作为开始,在这篇文章中我们不会探究非常高级的在Excel中可用的自动化,但它会给出一个有望供其他人使用的框架,以便能改进和让它更加具有可扩展性。该框架允许你创建一个Excel对象,并控制一些基本功能例如得到工作表信息,还有从给定范围的工作表中提取数据。
我们不得不开发的程序有更大的范围,我将集中精力在Excel部分。但是有少数几个我们为文件系统导航使用到线程而开发的简洁的类,如果对这篇文章有足够多的响应,或则我有机会去做它,我会继续把它发布,期间我希望下面的文章对你有用。
背景
充分理解OOP思想,熟悉C#编程语言。
用到的代码
我将提供一个能用在你的项目中的Excel外覆类。这些代码将在下面讨论。我将不会太深入Excel对象模型,因为,首先它将是一个巨大的任务,第二已经存在一些Microsoft写的类似文档了,这只是一个对想了解如何建立一个Office自动化工程的初学者的快速入门教程:
建立一个新工程,为了简便起见,建立一个Windows应用程序,建好后,右键单击“解决方案资源管理器”,选择“添加引用”,等添加引用窗口出现后,选择“COM”标签,这将显示你机器上所有可用的组件名称。既然我们将使用MS Excel,你就向下移动滚动条直到找到: Microsoft Excel 11.0 Object Library.
注意:你的也许是不同的版本,这将取决于你机器上安装的Office的版本。这是MS Excel 2003.
1
using System;
2
3
using System.IO;
4
5
using System.Collections;
6
7
using System.Threading;
8
9
using Office = Microsoft.Office.Core;
10
11
using Excel = Microsoft.Office.Interop.Excel;
12
13
using System.Diagnostics;
14
15
16
17
namespace ATPMain
18
19

{
20
21
/**//// <summary>
22
23
/// Project: Code Project Demo
24
25
/// Author: Vahe Karamian
26
27
/// Date: 03/01/2005
28
29
/// Version: 1.0
30
31
/// </summary>
32
33
public class VkExcel
34
35
{
36
37
private Excel.Application excelApp = null;
38
39
private Excel.Workbook excelWorkbook = null;
40
41
private Excel.Sheets excelSheets = null;
42
43
private Excel.Worksheet excelWorksheet = null;
44
45
46
47

48
49
using Office = Microsoft.Office.Core;
50
51
using Excel = Microsoft.Office.Interop.Excel;
52
53
你要想能够在你的代码中使用Excel 对象,需要包含上面两个名称空间。我们需要一个Excel.Application 对象,一个Excel.Workbook 对象,一个 Excel.Sheets 对象, 还有一个Excel.Worksheet 对象。这些对象将用来控制和从Excel中提取数据,因此我们声明如下的一些变量来代表提及到的对象:excelApp, excelWorkbook, excelSheets, 和 excelWorksheet.
1
.
2
3
4
5
private static object vk_missing = System.Reflection.Missing.Value;
6
7
8
9
private static object vk_visible = true;
10
11
private static object vk_false = false;
12
13
private static object vk_true = true;
14
15
16
17
private bool vk_app_visible = false;
18
19
20
21
private object vk_filename;
22
23
24
25
OPEN WORKBOOK VARIABLES#region OPEN WORKBOOK VARIABLES
26
27
private object vk_update_links = 0;
28
29
private object vk_read_only = vk_true;
30
31
private object vk_format = 1;
32
33
private object vk_password = vk_missing;
34
35
private object vk_write_res_password = vk_missing;
36
37
private object vk_ignore_read_only_recommend = vk_true;
38
39
private object vk_origin = vk_missing;
40
41
private object vk_delimiter = vk_missing;
42
43
private object vk_editable = vk_false;
44
45
private object vk_notify = vk_false;
46
47
private object vk_converter = vk_missing;
48
49
private object vk_add_to_mru = vk_false;
50
51
private object vk_local = vk_false;
52
53
private object vk_corrupt_load = vk_false;
54
55
#endregion
56
57
58
59
CLOSE WORKBOOK VARIABLES#region CLOSE WORKBOOK VARIABLES
60
61
private object vk_save_changes = vk_false;
62
63
private object vk_route_workbook = vk_false;
64
65
#endregion
66
67
68
69
/**//// <summary>
70
71
/// Vahe Karamian - 03/04/2005 - Excel Object Constructor.
72
73
/// </summary> 74
75
public VkExcel()
76
77
{
78
79
this.startExcel();
80
81
}
82
83
84
85
/**//// <summary>
86
87
/// Vahe Karamian - 03/04/2005 - Excel Object Constructor
88
89
/// visible is a parameter, either TRUE or FALSE, of type object.
90
91
/// </summary>
92
93
/// Visible parameter, true for visible, false for non-visible 94
95
public VkExcel(bool visible)
96
97
{
98
99
this.vk_app_visible = visible;
100
101
this.startExcel();
102
103
}
104
105

106
107
在上面的代码块中,我们预先定义了一些常量,将会使用这些来打开一个给定的Excel文件,要找出更多关于每个参数代表什么,能做什么,你应该查询与Excel一起的文档。
我们有两个构造函数: VkExcel() ,默认构造函数将启动一个隐藏的Excel,而另外一个VkExcel(bool visible) 构造函数,将给你一个选择,确认Excel应用程序是否可见。
1

2
3
/**//// <summary>
4
5
/// Vahe Karamian - 03/04/2005 - Start Excel Application
6
7
/// </summary> 8
9
START EXCEL#region START EXCEL
10
11
private void startExcel()
12
13
{
14
15
if( this.excelApp == null )
16
17
{
18
19
this.excelApp = new Excel.ApplicationClass();
20
21
}
22
23
24
25
// Make Excel Visible
26
27
this.excelApp.Visible = this.vk_app_visible;
28
29
}
30
31
#endregion
32
33
34
35
/**//// <summary>
36
37
/// Vahe Karamian - 03/23/2005 - Kill the current Excel Process
38
39
/// </summary>40
41
STOP EXCEL#region STOP EXCEL
42
43
public void stopExcel()
44
45
{
46
47
if( this.excelApp != null )
48
49
{
50
51
Process[] pProcess;
52
53
pProcess = System.Diagnostics.Process.GetProcessesByName("Excel");
54
55
pProcess[0].Kill();
56
57
}
58
59
}
60
61
#endregion
62
63

64
65
上面的代码启动和停止Excel应用程序。startExcel() 检查excelApp 对象是否初始化,如果已经初始化,仅确认设定在visible属性的可见性;如果没有初始化,就继续向前,初始化对象。stopExcel() 也检查对象是否正在使用,如果是就关闭该进程。
注意:pProcess[0].Kill() 将确认Excel正常运行!有些做Excel自动化的人总是抱怨,在他们退出应用程序后,Excel消失了,但是Excel进程仍然在任务监视器里,这代码将为你处理好那情况!
1

2
3
/**//// <summary>
4
5
/// Vahe Karamian - 03/09/2005 - Open File function for Excel 2003
6
7
/// The following function will take in a filename, and a password
8
9
/// associated, if needed, to open the file.
10
11
/// </summary>12
13
OPEN FILE FOR EXCEL#region OPEN FILE FOR EXCEL
14