• <acronym id="danlv"><form id="danlv"></form></acronym>
  • <dd id="danlv"><rt id="danlv"></rt></dd>
      <var id="danlv"><rt id="danlv"><big id="danlv"></big></rt></var>
      1. <code id="danlv"><ol id="danlv"></ol></code>
        <var id="danlv"><rt id="danlv"></rt></var>
          1. <code id="danlv"></code>
            返回首頁
            當前位置: 主頁 > 網絡編程 > .Net實例教程 >

            C#中對Excel的操作方法詳解

            時間:2010-06-22 11:03來源:知行網www.n1979.com 編輯:麥田守望者

             

            Excel表格文檔由于其簡單易用,普遍應用于不少單位或部門,因而在編寫應用程序過程中,有時會需要對Excel文檔進行操作,最簡單的情況通常有兩種:(1)需要獲取文檔中一些單元格的值;(2)將文檔導入至數據庫。
             
            1).在操作Excel文檔之前,需要添加對Excel對象庫的引用:
            引用—COMMicrosoft Excel 11.0 Object Library(版本號可能不同)
             
            2).以下代碼示意打開一個已有的Excel文檔的第一個sheet頁,獲取單元格“B1的內容,并判斷其值是否為“my”:

             

                    private void Operate(string pFileName)
                    
            {
                        Excel.Application app 
            = new Excel.Application();//打開一個Excel應用
                        if (app == null)
                        
            {
                            
            return;
                        }


                        Workbooks wbs 
            = app.Workbooks;
                        _Workbook wb 
            = wbs.Add(pFileName);//打開一個現有的工作薄
                        Sheets shs = wb.Sheets;
                        _Worksheet sh 
            = (_Worksheet)shs.get_Item(1);//選擇第一個Sheet頁
                        if (sh == null)
                        
            {
                            
            return;
                        }


                        Range r 
            = sh.get_Range("B1", Missing.Value);
                        
            if (System.Convert.ToString(r.Value2).Trim().Equals("my"))
                        
            {
                            
            //Do Something.
                        }

                    }

            不少人在打開Excel應用后,對如何在使用完成后釋放它大感頭痛,在網上我找到一種方法,經過實驗證明是OK的:

             
            3).

             

                    private void ReleaseCOM(object pObj)
                    
            {
                        
            try
                        
            {
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(pObj);
                        }

                        
            catch
                        
            {
                            
            throw new Exception("釋放資源時發生錯誤!");
                        }

                        
            finally
                        
            {
                            pObj 
            = null;
                        }

                    }

             

            有了該方法,則只要在步驟2)代碼之后添加以下代碼,就可以完成對資源的釋放:

             

                    private void Operate(string pFileName)
                    

            ……
            //釋放資源
                        ReleaseCOM(sh);
                        ReleaseCOM(shs);
                        ReleaseCOM(wb);
                        ReleaseCOM(wbs);
                        app.Quit();
                        ReleaseCOM(app);
                    }

            基于Excel中的函數可以編輯出相當復雜的公式,有時候在處理Excel文檔時,希望使用Excel中的公式,以下結合FREQUENCYMATCH函數對B列計算distinct count,將其寫入B100單元格(假定有數據的行不超過100行):


            4).

             

                    string  count = sh.UsedRange.Rows.Count.ToString();
                    Range r 
            = sh.get_Range("B100",Missing.Value);
                    r.Formula 
            = "=SUM(IF(FREQUENCY(MATCH(B1:B" + count + ",B1:B" + count + ",0),MATCH(B1:B" + count + ",B1:B" + count + ",0))>0,1))";
                    Console.WriteLine(System.Convert.ToString(r.Value2));

            Excel導入數據,可以先使用ODBC,以select查詢時使用“[sheet頁名稱$]”作為“表名”,將數據以datatable形式載入到內存中,之后的事就比較簡單了,可以根據datatable逐行構造insert語句,然后插入到目標數據庫中:


            5).

             

                    private DataTable LoadExcel(string pPath)
                    
            {
                        
            string connString = "Driver={Driver do Microsoft Excel(*.xls)};DriverId=790;SafeTransactions=0;ReadOnly=1;MaxScanRows=16;Threads=3;MaxBufferSize=2048;UserCommitSync=Yes;FIL=excel 8.0;PageTimeout=5;";
                        connString 
            += "DBQ=" + pPath;
                        OdbcConnection conn 
            = new OdbcConnection(connString);
                        OdbcCommand cmd 
            = new OdbcCommand();
                        cmd.Connection 
            = conn;
                        
            //獲取Excel中第一個Sheet名稱,作為查詢時的表名
                        string sheetName = this.GetExcelSheetName(pPath);
                        
            string sql = "select * from [" + sheetName.Replace('.''#'+ "$]";
                        cmd.CommandText 
            = sql;
                        OdbcDataAdapter da 
            = new OdbcDataAdapter(cmd);
                        DataSet ds 
            = new DataSet();
                        
            try
                        
            {                
                            da.Fill(ds);
                            
            return ds.Tables[0];
                        }

                        
            catch (Exception x)
                        
            {
                            ds 
            = null;
                            
            throw new Exception("從Excel文件中獲取數據時發生錯誤!");
                        }

                        
            finally
                        
            {
                            cmd.Dispose();
                            cmd 
            = null;
                            da.Dispose();
                            da 
            = null;
                            
            if (conn.State == ConnectionState.Open)
                            
            {
                                conn.Close();
                            }

                            conn 
            = null;
                        }

                    }


                    
            private string GetExcelSheetName(string pPath)
                    
            {
                        
            //打開一個Excel應用
                        Excel.Application app = new Excel.Application();
                        
            if (app == null)
                        
            {
                            
            throw new Exception("打開Excel應用時發生錯誤!");
                        }

                        Excel.Workbooks wbs 
            = app.Workbooks;
                        
            //打開一個現有的工作薄
                        Excel._Workbook wb = wbs.Add(pPath);
                        Excel.Sheets shs 
            = wb.Sheets;
                        
            //選擇第一個Sheet頁
                        Excel._Worksheet sh = (Excel._Worksheet)shs.get_Item(1);
                        
            string sheetName = sh.Name;

                        ReleaseCOM(sh);
                        ReleaseCOM(shs);
                        ReleaseCOM(wb);
                        ReleaseCOM(wbs);
                        app.Quit();
                        ReleaseCOM(app);
                        
            return sheetName;
                    }

             

            (“string sql = "select * from [" + sheetName.Replace('.', '#') + "$]";”如果sheet頁名稱中含有“.”,則要將其替換為“#”,具體原因,沒研究出來-_-。另外貼一張界面截圖:)
             
            6).關于從Excel導入數據,網上應該有很多例子,這里補充一個關于數據導入時的效率問題。最初在從Excel導入數據到MySql中時,當文件達到50000行時,逐行導入花了10余分鐘的時間。大量執行插入操作,逐條執行很慢原因可能在于:
            (1)每執行一條插入語句,客戶端需要與服務器交互一次,這要有代價
            (2)一些數據庫對每一條插入操作都執行事務,這也要有代價
            所以在大量執行插入操作時,應該盡量先多個insert語句拼接好,例如每次拼接好200個insert語句,然后再一次執行它,這樣可以大幅提高效率。
            ------分隔線----------------------------
            標簽(Tag):EXCEL C#
            ------分隔線----------------------------
            推薦內容
            猜你感興趣
            日韩在线av免费视久久