2015-06-16 24 views
5

Nel mio progetto ho avuto l'obbligo di leggere i dati del foglio excel e di convalidare lo stesso. Quindi salvarlo nel database. Funziona bene, in questo modello di Excel row 1 è l'intestazione ei dati inizieranno da row 2.Iniziare a leggere i dati da una riga specifica di excel utilizzando Linq in C#

ad esempio: -

Name  Age  Arabic Name Category 
Jack  30    بيب  A 

var mem = from memRec in excelFile.Worksheet("Addition Form")select memRec; 

allora posso avere i dettagli utilizzando memRec["Age"],memRec["Name"] etc.

Questo sta lavorando bene.

Ora il client ha un modello diverso in cui le prime 3-4 righe vengono unite con i rispettivi loghi e tutto. L'intestazione sarà row 4 ei dati inizieranno da row 5.

es:

row1 
row2 
row3 
row4 Name  Age Arabic Name Category 
row5 Jack  30   بسيب  A 

Ho leggere questo

var mem = from memRec in excelFile.Worksheet("Addition Form")select memRec; 

non è leggendo e dando errore perché l'intestazione è a partire dalla fila 4 soltanto cercato qui sotto code.

Non conosco l'intervallo di dati anche perché dipende dall'utente che riempie i dati .

Quindi non riesco a specificare il foglio di lavoro.

C'è un modo per specificare la riga iniziale per leggere l'Excel tramite Linq. Inoltre, una volta che è fatto possiamo specificare la fila come

memRec["Age"],memRec["Name"] etc.? 

cura

ho usato sottostante Codice

mem = from memRec in excelFile.Worksheet("Addition Form").Skip(2) select memRec; 

ma quando ho provato a chiamare memRec["Age"] sta dando errore dicendo no such column and columns available are Logo1,namecomp.. .etc .. questo è il contenuto della prima riga del foglio excel

il mio foglio excel è così ora

row1  Logo1  namecomp  place  situation 
row2  Name  Age   ArabicName Category 
row3  John  30    يبي  A 

Non voglio row1 come intestazioni di colonna. Le intestazioni di colonna sono nella riga 2 e i dati iniziano da row3.

Ora, quando provo a leggere memrec ["Nome"], si sta dando errore dicendo che nessuna intestazione di colonna. intestazioni delle colonne disponibili sono Logo1, namecomp ecc ..

Ti prego, aiutami a risolvere questo problema ..

+0

Non esattamente sicuro dei dettagli di implementazione, ma potrei saltare i primi 4 risultati e impostare i nomi delle colonne da soli. – ameer

+0

@ameer come impostare i nomi delle colonne da solo? se salto il primo risultato 3 la 4a riga è il nome della colonna..non posso usarlo? – Sachu

+0

A Linq sembra che tutte le colonne siano uguali. Se non riesci a trovare una soluzione a questo, non aver paura di uscire da quel codice e utilizzare il ** loop di base ** per attraversare i tuoi dati. – jp2code

risposta

2

io non sono un esperto di LINQ, ma non credo che LINQ funziona se i dati non sono coerente.

Si consiglia di considerare di usare un Ole Db Provider come in questo post:

Insert DataTable into Excel Using Microsoft Access Database Engine via OleDb

Lei avrebbe bisogno di utilizzare una stringa di connessione in questo formato:

private const string EXCEL_CON = 
     @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};" + 
     @"Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'"; 

Usando questo, si potrebbe estrarre i dati dal file Excel in un DataTable:

public DataTable ExcelToDataTable(string fullFilename, string tableName) 
    { 
     var table = new DataTable(); 
     string strCon = string.Format(EXCEL_CON, fullFilename); 
     using (var con = new System.Data.OleDb.OleDbConnection(strCon)) 
     { 
      ConnectionState initialState = con.State; 
      try 
      { 
       if ((initialState & ConnectionState.Open) != ConnectionState.Open) 
       { 
        con.Open(); 
       } 
       string sql = string.Format("SELECT * FROM `{0}`;", tableName); 
       using (var cmd = new System.Data.OleDb.OleDbCommand(sql, con)) 
       { 
        table.Load(cmd.ExecuteReader()); 
       } 
      } 
      finally 
      { // it seems like Access does not always close the connection 
       if ((initialState & ConnectionState.Open) != ConnectionState.Open) 
       { 
        con.Close(); 
       } 
      } 
     } 
     return table; 
    } 

Sopra, tableName potrebbe essere il nome del foglio di lavoro Excel necessario per accedere ai dati.

È possibile che si stia facendo qualcosa di simile ora con la variabile excelFile. Non so cosa sia.

Una volta che avete i vostri dati in un oggetto DataTable, si potrebbe semplicemente ciclo sui dati utilizzando una base ciclo for, in questo modo:

public DataTable CustomTable(DataTable excelTable) 
    { 
     var table = new DataTable(); 
     var col0 = table.Columns.Add("Name", typeof(String)); 
     var col1 = table.Columns.Add("Age", typeof(int)); 
     var col2 = table.Columns.Add("Arabic Name", typeof(String)); 
     var col3 = table.Columns.Add("Category", typeof(String)); 
     var ok = false; 
     for (var index = 0; index < excelTable.Rows.Count; index++) 
     { 
      DataRow excelRow = excelTable.Rows[index]; 
      if (ok) 
      { 
       DataRow row = table.NewRow(); 
       row[col0] = String.Format("{0}", excelRow["Name"]); 
       row[col1] = Convert.ToInt32(excelRow["Age"]); 
       row[col2] = String.Format("{0}", excelRow["Arabic Name"]); 
       row[col3] = String.Format("{0}", excelRow["Category"]); 
       table.Rows.Add(row); 
      } 
      else 
      { 
       ok = (excelRow[0].ToString() == "Name"); 
      } 
     } 
     return table; 
    } 

non so se questo si dove si ottiene voglio essere o no, ma spero che almeno aiuti.

Problemi correlati