CSharp Tips:使用OleDb操縱Excel檔案(1)

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.