使用C#操作MS-Excel表格COM
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
使用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 Library9
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 ExcelTools67
{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
try132
{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

浙公网安备 33010602011771号