2011-09-06 18 views
5

sto usando OLE DB per connettersi e leggere i dati da un foglio di calcolo Excel. Ho IMEX = "1" e tutto funziona bene. Il mio problema è che i fogli che sto leggendo potrebbero iniziare con diverse righe vuote e il numero di righe vuote è importante. Ad esempio, se stavo leggendo una griglia 5x5 come:Come contare righe vuote durante la lettura da Excel

- - - - - 
- - - - - 
2 - 3 3 8 
- - - - - 
- - 5 2 2 

dove "-" rappresenta una cella vuota. Il fatto che le prime due righe siano vuote è importante. La dimensione della griglia è dinamica. Il mio codice sembra ignorare le prime righe vuote. Ma si occupa della riga vuota alla riga 4 ok.

Come posso contare il numero di righe vuote all'inizio di un foglio di Excel utilizzando OLE DB?

sto costretti ad usare OLE DB, non vorrei se io non dover ;-)

using (var adapter = new OleDbDataAdapter("SELECT * FROM [" + worksheetName + "]", connString)) { 
    var ds = new DataSet(); 
    adapter.Fill(ds, "FareChart"); 
    table = ds.Tables["FareChart"]; 
} 

stringa di connessione:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Windows\\TEMP\\e1842f90-74a7-42f2-a6fa-208396a1072e;Extended Properties=\"Excel 8.0;IMEX=1;HDR=No\"" 

UPDATE

Specificando '.xls' come estensione di file nella stringa di connessione risolto questo problema e legge correttamente le righe vuote all'inizio.

+0

Inoltre, usando '-' o '0' per rappresentare una cella vuota non è un'opzione, le celle deve essere vuoto. I dati sono in realtà più complessi rispetto all'esempio che ho fornito e non abbiamo il controllo sulla formattazione. – RandomDev

+0

non so se questo aiuta: http://stackoverflow.com/questions/1138197/oledb-connection-to-excel-how-do-i-select-fixed-width-unbounded-height –

+0

Qual è il tuo 'ConnectionString'? – NaveenBhat

risposta

1

Credo che il problema è con la stringa di connessione. Ho provato il codice qui sotto e ha funzionato per me:

 DataSet Contents = new DataSet(); 
    using (OleDbDataAdapter adapter = new OleDbDataAdapter("select FirstName,LastName,Email,Mobile from [" + mySheet + "]", connection)) 
    { 
     adapter.Fill(Contents,"MyTable"); 
    } 

    foreach (DataRow content in Contents.Tables["MyTable"].Rows) 
    { 
     if (content[0].ToString() == "" && content[0].ToString() == "" && content[0].ToString() == "" && content[0].ToString() == "") 
     { 
      Console.WriteLine("Empty Row"); 
     } 
     else 
     { 
      Console.WriteLine(content[0] + " | " + content[1] + " | " + content[2] + " | " + content[3]); 
     } 
    } 

mia stringa di connessione è:

string cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"C:\\Untitled 1.xls\";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\""; 
+0

Ho aggiornato la domanda con la mia stringa di connessione – RandomDev

0

Come affermato da @Knvn

È necessario specifiy il file di estensione .xls con il file nome nella stringa di connessione.

1

controllo sottostante codice: Rinvierà le righe vuote ..

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + strFileName + "; Extended Properties = \"Excel 8.0;HDR=NO;IMEX=1\";"); /*for office 2007 connection*/ 
        conn.Open(); 
string strQuery = "SELECT * FROM [" + Table + "]"; 
System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(strQuery, conn); 
System.Data.DataTable ExcelToDataTable = new System.Data.DataTable(); 
adapter.Fill(ExcelToDataTable); 

DT = ExcelToDataTable.Copy(); 

int count = DT.Rows.Cast<DataRow>().Where(row => row.ItemArray.All(field => field is System.DBNull || string.Compare((field as string).Trim(), string.Empty) == 0)).ToList().Count(); 
Problemi correlati