现在的位置: 首页 > 综合 > 正文

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

2013年07月01日 ⁄ 综合 ⁄ 共 3866字 ⁄ 字号 评论关闭

0、前言

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

一般情况下我们使用Excel自带的一套COM对象对Excel文件进行操作,这套对象模型的功能非常强大,不仅可以通过WorkBook、WorkSheet等一系列对象操纵每一个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文件中包含的所有表单的名称。

        /**//// <summary>
        /// 获得所有表单的名称
    /// </summary>
        /// <returns></returns>
        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;
        }

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Mittermeyer/archive/2008/04/05/2253152.aspx

抱歉!评论已关闭.