C#读取Excel的三种方式以及比较分析

2019-12-30 11:04:22王冬梅

2. 取出的名称中,包括了FilterDatabase后缀的, 这是XL用来记录Filter范围的。

对于第一点比较简单, 删除已有命名管理器中的内容即可;第二点处理起来比较麻烦, Filter删除后这些名称依然保留着,简单的做法是新增Sheet然后将原Sheet Copy进去。但实际情况并不能为每个Excel做以上检查。下面给出了过滤的方案。(此问题我们有验证过,大家自己验证一下吧)

 

 
  1. //objConn为读取Excel的链接,下面通过过滤来获取有效的Sheet页名称集合  System.Data.DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null); 
  2. List<string> lstSheetNames = new List<string>();  for (int i = 0; i < schemaTable.Rows.Count; i++) 
  3. {  string strSheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"]; 
  4. if (strSheetName.Contains("$") && !strSheetName.Replace("'", "").EndsWith("$"))  { 
  5. //过滤无效SheetName完毕....  continue; 
  6. }  if (lstSheetNames != null && !lstSheetNames.Contains(strSheetName)) 
  7. lstSheetNames.Add(strSheetName);  } 

因为读取出来无效SheetName一般情况最后一个字符都不会是$。如果SheetName有一些特殊符号,读取出来的SheetName会自动加上单引号。比如在Excel中将SheetName编辑成MySheet(1),此时读取出来的SheetName就为:'MySheet(1)$',所以判断最后一个字符是不是$之前最好过滤一下单引号。

---------------------------------

(2)Com组件的方式(通过添加 Microsoft.Office.Interop.Excel引用实现)