CSharp Tips:使用OleDb操纵Excel文件(1)

0、前言

在进行数据操作的时候经常会碰到这样的要求,“将从数据从Excel文件导入到数据库中”或者“将数据导出到Excel文件中”,这时我们不得不对Excel文件进行操作。

一般情况下我们使用Excel自带的一套COM对象对Excel文件进行操作,这套对象模型的功能非常强大,不仅可以通过WorkBookWorkSheet等一系列对象操纵每一个Cell的数据,而且还可以操作Excel界面中的窗口、脚本等。Excel应用程序的这套对象模型功能是强大,但在使用的时候我们不得不面临这样几个小小的缺陷:要在工程中引用Excel的类型库,但是Excel版本众多,如果开发环境和部署环境中Excel版本不一致,就会有问题;Excel对象模型的使用逻辑和一般ADO等的数据库模型不一致,我们不得不熟悉一套新的接口对象。

幸运的是,Microsoft Jet引擎为提供了针对Excel文件的支持,这样我们就可以利用ADO/OleDb接口像操作Access数据库一样,操作Excel文件。本文简要介绍了利用在DotNET开发环境中,利用OleDb数据访问接口读取和创建Excel文件。

 

 

1、创建数据连接

OleDb中访问数据源,非常简单,只要是安装了相应数据源的Provider,并且正确书写了连接字符串(Connection String)即可创建数据连结。创建Excel连接的示例如下:

 

         public  Boolean Open(String dataFile)
        {
            String sConnString 
=   null ;
            Boolean fRet 
=   false ;

            
if  (dataFile  ==   null   ||  dataFile  ==  String.Empty)
                
return   false ;
            
if  ( ! System.IO.File.Exists(dataFile))
                
return   false ;

            
/*
            1: Excel 8.0 针对EXCEL 2000 或更高版本;Excel 5.0 FOR EXCEL 97
            2:  HDR == HEADER ROW    表示第一行是否为字段名。Yes为首行字段,No为无首行字段
            3: IMEX 表示对同一列中有混合数据类型的列,是统一按字符型处理,还是将个别不同类型的值读为DBNULL。为混合,为不混合
             
*/
            sConnString 
=  String.Format( " Provider=Microsoft.Jet.OleDb.4.0;Data Source={0};Extended Properties='Excel {1}; HDR={2}; IMEX={3};'; " ,
                dataFile, m_sExcelVersion, m_fHasHeaderRow 
?   " Yes "  :  " No " , m_fMixRow  ?   1  :  2 );

            
try
            {
                m_connExcel 
=   new  OleDbConnection(sConnString);
                
if  (m_connExcel  !=   null )
                {
                    m_connExcel.Open();
                    fRet 
=   true ;
                }
            }
            
catch  (Exception e)
            {
                fRet 
=   false ;
                Trace.WriteLine(
" COleDbExcelWrapper.Open: Open excel file failed! "   +  e.Message);
            }

            
return  fRet;
        }

 

 

2、获取Excel文件中表单的名称

Excel文件中的每一个表单(Sheet)相当于一般数据库中的表,通过下面的示例我们可以获得一个Excel文件中包含的所有表单的名称。

         /// 
        
/// 获得所有表单的名称
    
/// 

        
/// 

         public  ArrayList GetSheetNameList()
        
{
            DataTable schemaTableView;
            ArrayList alData 
= null;
            DataTableReader rsResult 
= null;

            
//'得到全部的表、视图
      schemaTableView = m_connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            
if (schemaTableView != null)
            
{
                rsResult 
= schemaTableView.CreateDataReader();
                
if (rsResult != null)
                
{
                    alData 
= new ArrayList();
                    
if (alData != null)
                    
{
                        
while (rsResult.Read())
                        
{
                            alData.Add(rsResult.GetString(
2));  // Table Name;
                        }

                    }

                    rsResult.Close();
                    rsResult 
= null;
                }

                schemaTableView 
= null;
            }

            
return alData;
        }


 

 

3、获取Excel文件中某一个表单的数据

Excel表单中的每一行相当于一条记录,每一列相当于一个字段,所以和数据库一样可以通过SELECT语句获得一个表单中的数据。获取整个表单中所有数据的示例如下:

 

         public  OleDbDataReader GetData(String sheetName)
        {
            OleDbCommand oCommand 
=   null ;
            OleDbDataReader rsResult 
=   null ;

            
if  (sheetName  ==   null   ||  sheetName  ==   string .Empty)
                
return   null ;

            
if  (sheetName.Substring(sheetName.Length  -   1 1 !=   " $ " )
                sheetName 
=  sheetName  +   " $ " ;

            oCommand 
=   new  OleDbCommand();
            Debug.Assert(oCommand 
!=   null );
            
try
            {
                oCommand.Connection 
=  m_connExcel;
                oCommand.CommandType 
=  CommandType.Text;
                oCommand.CommandText 
=  String.Format( " SELECT * FROM [{0}] " , sheetName);
                rsResult 
=  oCommand.ExecuteReader(CommandBehavior.SequentialAccess);
            }
            
catch  (Exception e)
            {
                rsResult 
=   null ;
                Trace.WriteLine(
" COleDbExcelWrapper.GetData: Error! "   +  e.Message);
            }

            oCommand 
=   null ;
            
return  rsResult;
        }

 

 

 

你可能感兴趣的:(开发心得)