2015-06-16 3 views
5

In meinem Projekt hatte ich eine Anforderung zum Lesen Excel-Sheet-Daten und validieren Sie die gleichen. Dann speichern Sie es in der Datenbank. Es funktioniert gut, in diesem Excel-Vorlage row 1 ist Header und Daten werden von row 2 starten.Starten Sie das Lesen von Daten aus einer bestimmten Reihe von Excel mit Linq in C#

zB: -

Name  Age  Arabic Name Category 
Jack  30    بيب  A 

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

Dann kann ich die Details erhalten mit memRec["Age"],memRec["Name"] etc.

Dies funktioniert gut.

Nun hat der Client eine andere Vorlage, in der die ersten 3-4 Zeilen mit ihren Logos und allen zusammengeführt werden. Der Header wird auf row 4 und Daten werden von row 5 starten.

zB:

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

ich unten Code versucht, diese

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

zu lesen ist es nicht lesen und Fehler geben, weil die Überschrift aus Zeile 4 nur gestartet wird.

Ich kenne den Datenbereich auch nicht, weil es darauf ankommt, dass der Benutzer Daten ausfüllt.

So kann ich den Worksheet-Bereich nicht angeben.

Gibt es eine Möglichkeit, die Startzeile zum Lesen der Excel über Linq anzugeben. Auch sobald es fertig ist, können wir die Zeile als

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

Edited

I unten Code verwendet angeben

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

aber als ich versuchte memRec["Age"] zu nennen es geben Fehler no such column and columns available are Logo1,namecomp. sagen. .etc .. das ist der Inhalt der ersten Zeile der Excel-Tabelle

mein Excel-Blatt ist wie folgt jetzt

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

Ich möchte nicht row1 als meine Spaltenüberschriften. Die Spaltenüberschriften befinden sich in Zeile 2 und die Daten beginnen in Zeile3.

Jetzt, wenn ich versuche Memrec zu lesen [ „Namen“] es Fehler geben sagen, dass keinen solchen Spaltenkopf. Verfügbare Spaltenüberschriften sind Logo1, namecomp etc ..

Bitte helfen Sie mir, dieses Problem zu lösen ..

+0

Nicht genau über die Implementierungsdetails, aber ich könnte Sie die ersten 4 Ergebnisse überspringen und die Spaltennamen selbst setzen. – ameer

+0

@ame Wie setze ich die Spaltennamen selbst? Wenn ich das erste 3 Ergebnis überspringe, ist die vierte Zeile der Spaltenname..so kann ich das nicht benutzen? – Sachu

+0

Linq scheint alle Spalten gleich zu sein. Wenn Sie keine Lösung dafür finden, haben Sie keine Angst davor, diesen Code zu verlassen und die grundlegende ** for-Schleife ** zum Durchlaufen Ihrer Daten zu verwenden. – jp2code

Antwort

2

Ich bin kein Linq Experte, aber ich glaube nicht, Linq funktioniert, wenn die Daten nicht ist konsistent.

Möglicherweise möchten Sie schauen ein Ole Db Provider wie in diesem Beitrag mit:

Insert DataTable into Excel Using Microsoft Access Database Engine via OleDb

Sie würden eine Verbindungszeichenfolge in diesem Format verwenden müssen:

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

dass Verwenden Sie könnte die Daten aus der Excel-Datei zu einem DataTable extrahieren:

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

Oben, tableName wäre der Name des Excel-Arbeitsblattes, auf das Sie auf Ihre Daten zugreifen müssen.

Sie können etwas ähnliches jetzt mit Ihrer excelFile Variable tun. Ich weiß nicht, was das ist.

Sobald Sie Ihre Daten in einem Datatable-Objekt haben, können Sie einfach Schleife über die Daten unter Verwendung einer basischen für Schleife, etwa so:

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

Ich weiß nicht, ob dies Sie bekommt, wo man will sein oder nicht, aber ich hoffe es hilft zumindest.

Verwandte Themen