2013-01-03 23 views
2

我創建了一個程序來從75張電子表格中將數據導入到oracle表中。我能夠連接,遍歷表單,抓取單元格和行看起來很好。問題是,如果excel工作表保存爲分組行,則會跳過行。 如果有擴展屬性或區域設置允許我擴展入口組時可以找到任何地方?不知道如何繞過摺疊組(不是合併的單元格,我可以在沒有問題的情況下進行處理)。使用OLEDB導入Excel而不引入摺疊組

碼位:

//Starting where I iterate through a particular sheet 

var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0; data source={0}; Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1;ReadOnly=0\"", fileName); 
OleDbConnection objConn = new OleDbConnection(connectionString); 

try 
{ 
objConn.Open(); 
System.Data.DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 

if (dt != null) 
{ 
    foreach (DataRow row in dt.Rows) 
    { 
     var adapter = new OleDbDataAdapter("SELECT F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12 FROM [" + row["TABLE_NAME"].ToString() + "]", connectionString); 
     var ds = new DataSet(); 
     try 
     { 
      adapter.Fill(ds, "anyname"); 
     } 
     catch 
     { 
      break; 
     } 
     DataTable data = ds.Tables[0]; 
     int rownum = 0; 

     // <a bunch of variable declarations> 

     foreach (DataRow row_b in data.Rows) 
     { 
      // start slogging through the rows 
      rownum = rownum++; 
      // <reset some variables> 
      if (rownum == 1) // Catch valid scripts that contain a number 
      { 
       foreach (DataColumn column in data.Columns) 
       { 
        if (column.ToString() == "F1") 
        { 
        // <processing code for this column> 
        } 
        if (column.ToString() == "F2") 
        { 
        // <processing code for this column> 
        } 
        if (column.ToString() == "F3") 
        { 
        // <you get the picture> 
        } 
       } 
     } 
      if (rownum == 3) 
      { 
       // <moving along through the rows...different processing> 
      } 
       // <..rows 4-11..> 

      if (rownum > 12) 
      { 
       // <more value assignment> 
      } 

      string allvals = APPLICATION + E_USER + STEP_DESC + VARIATIONS + STATUS + STOPS_TESTING + ISSUE_NUM + ISSUE_COMMENTS + ADDITIONAL_INFO; 
      allvals = allvals.Trim(); 

      //Don't want sheets that come across as Print Area this shouldn't affect the row processing 
      isPrintArea = 0; 
      if (BOOKSHEET.Contains("Print_Area")) 
      { 
       isPrintArea = 1; 
      } 

      Boolean addornot=false; 
      if (cb_forallscripts.Checked == true) 
      { 
       addornot = (STEP_NUM != 0 && 
       allvals != "" && 
       isPrintArea == 0 && 
       SCRIPT_NUM != 0); 
      } 
      else 
      { 
       addornot = (STEP_NUM != 0 && 
       allvals != "" && 
       isPrintArea == 0 && 
       SCRIPT_NUM != 0 && 
       runScripts.Contains(SCRIPT_NUM.ToString())); 
      } 
      if (addornot) 
      { 
       //<connect to our Oracle db, I set up oCmd outside this> 
       OracleCommand oCmd = new OracleCommand(); 
       oCmd.Connection = oConn; 
       oCmd.CommandType = CommandType.Text; 
       oCmd.Parameters.Add("STEP_NUM", STEP_NUM); 
       // <... bunch of parameters ...> 
       oCmd.Parameters.Add("script", SCRIPT); 
       oCmd.CommandText = "<My insert statement> "; 
       oCmd.ExecuteNonQuery(); 
       } 
      } 
     } 
    } 
} 
catch (<error processing>) 
{ } 

回答

0

Rows.OutlineLevel應該是你正在尋找的VBA屬性。它可以被讀取或設置。請參閱this page瞭解微軟的簡要說明。如上所述,Range.ClearOutline將按照here的解釋清除指定範圍的輪廓。