1
使用C#操作MS-Excel表格
2
3
最近用C#写了一个有限元的计算程序,其中涉及到大量数据的输入输出问题。由于其中数据不仅量大,而且数据项比较杂,使用一般的txt和dat文件操作起来比较麻烦,不直观,不便于手动修改,而且不数据文件页不具有通用性,于是想到使用界面友好的Excel电子表格来编写数据文件,通过查阅相关文档,尝试了一下,发现效果还不错。其使用方法如下:
4
5
1.添加引用
6
使用Visual Studio .net 添加两个COM组件:
7
Microsoft Excel 12.0 Object Library
8
Microsoft Office 12.0 Object Library
9
10
2.添加命名空间:
11
using Microsoft.Office.Interop.Excel ;
12
using Microsoft.Office.Core;
13
14
3.用到的一些基本对象和方法,属性:
15
//创建Excel应用程序对象
16
Application xlApp = new Application();
17
18
//获取工作簿集合
19
Workbooks xlWorkbooks = xlApp.Workbooks;
20
21
Workbook xlBook, xlResBook;
22
Worksheet xlSheet, xlResSheet;
23
//打开已有的数据文件
24
xlBook = ExcelTools.OpenWorkbook(xlWorkbooks, dataFileDir,true );
25
xlSheet = (Worksheet)xlBook.Sheets["sheet1"];
26
27
//新建一个工作簿
28
xlResBook = xlWorkbooks.Add(XlWBATemplate.xlWBATWorksheet);
29
xlResSheet =(Worksheet)xlResBook.Sheets["sheet1"];
30
31
//从Excel表格中读取数据值,其中ExcelTools为自己手动编写的Excel工具箱类,见后文
32
int number = ExcelTools.ReadInt(xlSheet, RowIndex, 4);
33
double x = ExcelTools.ReadDouble(xlSheet, RowIndex, 5);
34
35
//获取单元格(区域)对象
36
Range rng = xlResSheet.get_Range(xlResSheet.Cells[2, 1], xlResSheet.Cells[2, 3]);
37
rng.Merge(Type.Missing); //合并单元格
38
rng.Value2 = "节点位移";
39
rng.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
40
//为单元格赋值
41
ExcelTools.WriteToCell(xlResSheet, 3, 1, "节点编号");
42
ExcelTools.WriteToCell(xlResSheet, 3, 2, "x-Disp");
43
ExcelTools.WriteToCell(xlResSheet, 3, 3, "y-Disp");
44
45
rng.Columns.AutoFit(); //列宽自动调整
46
47
//清理应用程序对象
48
xlSheet = null;
49
ExcelTools.CloseWorkbook(xlBook, false);
50
xlBook = null;
51
xlResSheet = null;
52
ExcelTools.SaveWorkbookAs(xlResBook, currentDir+"\\ResultData");
53
ExcelTools.CloseWorkbook(xlResBook, true);
54
xlResBook = null;
55
xlApp.Quit(); //关闭Excel程序
56
xlApp = null;
57
Console.WriteLine("\n按任意键结束本程序,从ResultData.xls数据文件中察看计算结果。");
58
Console.ReadKey();
59
60
4.Excel工具类:
61
由于MS-Office对象模型是为VBA设计的,其中的很多方法要使用缺省参数,并且有些方法的缺省参数有十多个,而C#不支持缺省参数,只能使用System.Type.Missing来代替,当遇到那些缺省参数很多的方法时,代码写起来比较罗嗦。为简化这些方法的使用,最好是自己手动为一些常用方法编写自己的简化的包装方法:
62
63
///
64
/// 用于简化Excel操作的Excel工具类
65
///
66
static class ExcelTools
67
{
68
///
69
/// 读取单元格中的整型值
70
///
71
/// 工作表
72
/// 单元格行索引
73
/// 单元格列索引
74
/// 返回单元格整型值
75
public static int ReadInt(Worksheet xlSheet, int rowIndex, int colIndex)
76
{
77
Range rng = (Range)xlSheet.Cells[rowIndex, colIndex];
78
int data = int.Parse((rng.Value2).ToString());
79
return data;
80
}
81
///
82
/// 读取单元格中的单精度值
83
///
84
/// 工作表
85
/// 单元格行索引
86
/// 单元格列索引
87
/// 返回单元格单精度值
88
public static float ReadFloat(Worksheet xlSheet, int rowIndex, int colIndex)
89
{
90
Range rng = (Range)xlSheet.Cells[rowIndex, colIndex];
91
float data =float.Parse((rng.Value2).ToString());
92
return data;
93
}
94
///
95
/// 读取单元格中的双精度值
96
///
97
/// 工作表
98
/// 单元格行索引
99
/// 单元格列索引
100
/// 返回单元格双精度值
101
public static double ReadDouble(Worksheet xlSheet, int rowIndex, int colIndex)
102
{
103
Range rng = (Range)xlSheet.Cells[rowIndex, colIndex];
104
double data = double.Parse((rng.Value2).ToString());
105
return data;
106
}
107
///
108
/// 将对象信息写入Excel单元格中
109
///
110
/// 工作表对象
111
/// 单元格行索引
112
/// 单元格列索引
113
/// 所要写入单元格的对象
114
public static void WriteToCell(Worksheet xlSheet, int rowIndex, int colIndex,
115
object objectWriteToCell)
116
{
117
Range rng = (Range)xlSheet.Cells[rowIndex, colIndex];
118
rng.Value2 = objectWriteToCell;
119
}
120
///
121
/// 用于打开工作簿的方法
122
///
123
/// 工作簿集合对象
124
/// 工作簿文件路径
125
/// 以只读方式打开
126
/// 工作簿对象
127
public static Workbook OpenWorkbook(Workbooks xlWorkbooks, string fileDirection,
128
bool readOnly)
129
{
130
Workbook xlBook=null;
131
try
132
{
133
xlBook = xlWorkbooks.Open(fileDirection,
134
Type.Missing, readOnly, Type.Missing, Type.Missing,
135
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
136
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
137
Type.Missing, Type.Missing);
138
}
139
catch (System.Exception )
140
{
141
throw;
142
}
143
return xlBook;
144
}
145
///
146
/// 保存工作簿文件
147
///
148
/// 工作簿对象
149
/// 工作簿文件保存路径
150
public static void SaveWorkbookAs(Workbook xlWorkbook,string fileDirection)
151
{
152
xlWorkbook.SaveAs(fileDirection, XlFileFormat.xlWorkbookNormal, Type.Missing,
153
Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange,
154
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
155
}
156
///
157
/// 关闭工作簿文件
158
///
159
/// 工作簿对象
160
/// 保存对工作簿的修改
161
public static void CloseWorkbook(Workbook xlWorkbook,bool saveChanges)
162
{
163
xlWorkbook.Close(saveChanges, Type.Missing, Type.Missing);
164
}
165
}
166
167
5.对于Excel中一些常用的操作,比如合并单元格,要想在Excel对象模型和相关文档中找到其对应的方法不太容易,我找到了解决这个问题的一种比较简单的方法:借助于VBA宏。可以先在Excel中录制一段VBA宏,然后查看相应的宏代码,就可以轻松的找到相关对象和方法了,(学C#正是爽,VB中的东西基本上可以直接搬过来,哈哈)
168
169
6.不足之处:
170
程序在读写Excel文件的时候速度比较慢,不知道有没有相关的优化方法,寻求中……
171

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171
