• 使用C#操作MSExcel表格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 
  • 相关阅读:
    数据存储大小端验证
    Python之路【第二十三篇】爬虫
    Python之路【第二十篇】Tornado框架
    Python之路【第二十二篇】CMDB项目
    Python之路【第二十一篇】Django ORM详解
    Python之路【第二十篇】其他WEB框架
    Python之路【第十九篇】自定义分页实现(模块化)
    Python之路【第十八篇】Django小项目webQQ实现
    Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点
    Python之路【第十七篇】Django进阶篇
  • 原文地址:https://www.cnblogs.com/wubiyu/p/1046951.html
Copyright © 2020-2023  润新知