使用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[21], xlResSheet.Cells[23]);
 37    rng.Merge(Type.Missing);       //合并单元格
 38    rng.Value2 = "节点位移";
 39    rng.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
 40    //为单元格赋值
 41    ExcelTools.WriteToCell(xlResSheet, 31"节点编号");
 42    ExcelTools.WriteToCell(xlResSheet, 32"x-Disp");
 43    ExcelTools.WriteToCell(xlResSheet, 33"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 
posted @ 2008-01-21 11:04  吴碧宇  阅读(1296)  评论(4编辑  收藏  举报