2011-09-06 25 views
5

Estoy usando OLEDB para conectar y leer datos de una hoja de cálculo de Excel. Tengo IMEX = "1" y todo funciona bien. Mi problema es que las hojas de las que estoy leyendo pueden comenzar con varias filas vacías y la cantidad de filas vacías es importante. Por ejemplo, si yo estaba leyendo una cuadrícula de 5x5 como:Cómo contar filas vacías al leer desde Excel

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

donde '-' representa una celda vacía. El hecho de que las dos primeras filas estén vacías es importante. El tamaño de la grilla es dinámico. Mi código parece estar ignorando las primeras filas vacías. Pero se ocupa de la fila vacía en la línea 4 de acuerdo.

¿Cómo puedo contar el número de filas vacías al comienzo de una hoja de Excel usando OLEDB?

estoy restringido a usar OLEDB, yo no se si yo no tenía a ;-)

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

cadena de conexión:

"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\"" 

ACTUALIZACIÓN

Especificar '.xls' como la extensión de archivo en la cadena de conexión solucionó este problema y lee correctamente las filas vacías al inicio.

+0

Además, el uso '-' o '0' para representar una celda vacía no es una opción, las células debe estar vacío. Los datos son en realidad más complejos que el ejemplo que he dado y no tenemos control sobre el formato. – RandomDev

+0

no estoy seguro si esto ayuda: http://stackoverflow.com/questions/1138197/oledb-connection-to-excel-how-do-i-select-fixed-width-unbounded-height –

+0

¿Cuál es su 'ConnectionString'? – NaveenBhat

Respuesta

1

Creo que su problema es con su cadena de conexión. He probado el código de abajo y funcionó para mí:

 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]); 
     } 
    } 

Mi cadena de conexión es:

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

He actualizado la pregunta con mi cadena de conexión – RandomDev

0

Según lo indicado por @Knvn

Necesitas specifiy la extensión de archivo .xls con el archivo nombre en su cadena de conexión.

1

de verificación a continuación código: Se devolverá las filas vacías ..

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(); 
Cuestiones relacionadas