2011-09-06 18 views
5

Używam OLEDB do łączenia i odczytu danych z arkusza kalkulacyjnego Excel. Mam IMEX = "1" i wszystko działa poprawnie. Moim problemem jest to, że arkusze, które czytam, mogą zaczynać się od kilku pustych wierszy, a liczba pustych wierszy jest ważna. Na przykład, gdy czytałem siatkę 5x5, taką jak:Jak liczyć puste wiersze podczas czytania z Excela

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

gdzie "-" reprezentuje pustą komórkę. Ważny jest fakt, że dwa pierwsze rzędy są puste. Rozmiar siatki jest dynamiczny. Mój kod wydaje się ignorować pierwsze puste wiersze. Ale zajmuje się pustym wierszem na linii 4 w porządku.

Jak zliczyć liczbę pustych wierszy na początku arkusza programu Excel przy użyciu OLEDB?

jestem ograniczony do korzystania z bazy danych OLE, nie będę, gdybym nie musiał ;-)

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

ciąg połączenia:

"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

Określenie ".xls" jako rozszerzenia pliku w łańcuchu połączenia rozwiązało ten problem i poprawnie odczytało puste wiersze na początku.

+0

Ponadto, używając „-” lub „0” do reprezentowania pusta komórka nie jest opcją, komórki muszą być puste. Dane są w rzeczywistości bardziej złożone niż podany przeze mnie przykład i nie mamy kontroli nad formatowaniem. – RandomDev

+0

nie wiesz, czy to pomaga: http://stackoverflow.com/questions/1138197/oledb-connection-to-excel-how-do-i-select-fixed-width-unbounded-ethight –

+0

Co to jest 'ConnectionString'? – NaveenBhat

Odpowiedz

1

Myślę, że Twój problem dotyczy ciągu połączenia. Testowałem poniższy kod i pracował dla mnie:

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

My Connection String jest:

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

Zaktualizowałem pytanie za pomocą mojego ciągu połączenia – RandomDev

0

Jak stwierdził @Knvn

Trzeba specifiy rozszerzenie pliku .xls z plikiem imię i nazwisko w ciągu połączenia.

1

check poniżej kodu: Będzie zwrotu pustych wierszy ..

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(); 
Powiązane problemy