使用C#操作MS-Excel表格COM
1使用C#操作MS-Excel表格
2
3 最近用C#写了一个有限元的计算程序,其中涉及到大量数据的输入输出问题。由于其中数据不仅量大,而且数据项比较杂,使用一般的txt和dat文件操作起来比较麻烦,不直观,不便于手动修改,而且不数据文件页不具有通用性,于是想到使用界面友好的Excel电子表格来编写数据文件,通过查阅相关文档,尝试了一下,发现效果还不错。其使用方法如下:
4
51.添加引用
6 使用Visual Studio .net 添加两个COM组件:
7 Microsoft Excel 12.0 Object Library
8 Microsoft Office 12.0 Object Library
9
102.添加命名空间:
11 using Microsoft.Office.Interop.Excel ;
12 using Microsoft.Office.Core;
13
143.用到的一些基本对象和方法,属性:
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
604.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
1675.对于Excel中一些常用的操作,比如合并单元格,要想在Excel对象模型和相关文档中找到其对应的方法不太容易,我找到了解决这个问题的一种比较简单的方法:借助于VBA宏。可以先在Excel中录制一段VBA宏,然后查看相应的宏代码,就可以轻松的找到相关对象和方法了,(学C#正是爽,VB中的东西基本上可以直接搬过来,哈哈)
168
1696.不足之处:
170 程序在读写Excel文件的时候速度比较慢,不知道有没有相关的优化方法,寻求中……
171
2
3 最近用C#写了一个有限元的计算程序,其中涉及到大量数据的输入输出问题。由于其中数据不仅量大,而且数据项比较杂,使用一般的txt和dat文件操作起来比较麻烦,不直观,不便于手动修改,而且不数据文件页不具有通用性,于是想到使用界面友好的Excel电子表格来编写数据文件,通过查阅相关文档,尝试了一下,发现效果还不错。其使用方法如下:
4
51.添加引用
6 使用Visual Studio .net 添加两个COM组件:
7 Microsoft Excel 12.0 Object Library
8 Microsoft Office 12.0 Object Library
9
102.添加命名空间:
11 using Microsoft.Office.Interop.Excel ;
12 using Microsoft.Office.Core;
13
143.用到的一些基本对象和方法,属性:
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
604.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
1675.对于Excel中一些常用的操作,比如合并单元格,要想在Excel对象模型和相关文档中找到其对应的方法不太容易,我找到了解决这个问题的一种比较简单的方法:借助于VBA宏。可以先在Excel中录制一段VBA宏,然后查看相应的宏代码,就可以轻松的找到相关对象和方法了,(学C#正是爽,VB中的东西基本上可以直接搬过来,哈哈)
168
1696.不足之处:
170 程序在读写Excel文件的时候速度比较慢,不知道有没有相关的优化方法,寻求中……
171