2012-08-31 14 views
6

Ich verwende die LinqToExcel library. Bis jetzt funktioniert das großartig, außer dass ich die Abfrage in einer bestimmten Zeile starten muss. Dies liegt daran, dass die Excel-Tabelle des Clients einige Bilder und "Header" -Informationen am Anfang der Excel-Datei verwendet, bevor die Daten tatsächlich gestartet werden.LinqToExcel - Muss in einer bestimmten Zeile beginnen

Die Daten selbst wird einfach zu lesen sein und ist ziemlich generisch, ich muss nur wissen, wie man die ExcelQueryFactory an einer bestimmten Zeile zu starten.

Ich kenne die WorksheetRange<Company>("B3", "G10") Option, aber ich möchte nicht eine Endzeile angeben, nur wo starten Lesen der Datei.

die neuesten v Verwendung. Von LinqToExcel mit C#

Antwort

1

Haben Sie WorksheetRange<Company>("B3", "G") versuchten

+0

Ja, Unfortuantly es mir ein Fehler „endrange Argument‚G‘für Zellenname ist ungültig Format“ gibt – contactmatt

0

Unforunatly, in diesem Moment und Iteration im LinqToExcel Rahmen, scheint es keine Möglichkeit, dies zu tun.

Um dies zu umgehen, müssen die Daten vom Kunden in ein eigenes "Sheet" innerhalb des Excel-Dokuments hochgeladen werden. Die Kopfzeile in der ersten Zeile und die Daten darunter. Wenn sie irgendwelche "Metadaten" wollen, müssen sie dies in ein anderes Blatt einfügen. Im Folgenden finden Sie ein Beispiel aus der LinqToExcel documentation zum Abfragen eines bestimmten Blattes.

var excel = new ExcelQueryFactory("excelFileName"); 
var oldCompanies = from c in repo.Worksheet<Company>("US Companies") //worksheet name = 'US Companies' 
        where c.LaunchDate < new DateTime(1900, 0, 0) 
        select c; 
2

Ich habe gerade versucht, diesen Code und es schien ganz gut zu funktionieren:

var book = new LinqToExcel.ExcelQueryFactory(@"E:\Temporary\Book1.xlsx"); 

var query = 
    from row in book.WorksheetRange("A4", "B16384") 
    select new 
    { 
     Name = row["Name"].Cast<string>(), 
     Age = row["Age"].Cast<int>(), 
    }; 

ich die Zeilen mit Daten nur zurückkamen.

4

Ich nehme an, dass Sie dies bereits gelöst, aber vielleicht für andere - sieht aus wie Sie

var excel = new ExcelQueryFactory(path); 
var allRows = excel.WorksheetNoHeader(); 

//start from 3rd row (zero-based indexing), length = allRows.Count() or computed range of rows you want 
for (int i = 2; i < length; i++) 
{ 
    RowNoHeader row = allRows.ElementAtOrDefault(i); 
    //process the row - access columns as you want - also zero-based indexing 
} 

nicht so einfach, wie die Angabe eines bestimmten Bereichs („B3“, ...) verwenden können, sondern auch die Art und Weise . Hoffe, das hilft zumindest jemand;)

+0

, wo Sie die 'length' Variablen zuweisen? – CodeArtist

+0

Nun, normalerweise wäre es 'allRows.Count' oder' allRows.Count() 'oder' allRows.Length' (weiß es jetzt nicht, tut mir leid), wenn Sie alle Zeilen lesen wollen. Oder als eine Ersetzung zu spezifizieren (nicht existierende) 'Range (" B3 "," G10 ")' Sie müssen es berechnen. 'Länge' wurde nur zum Anzeigen verwendet. Damals gab es keine einfache Lösung AFAIK ... Guter Punkt, bearbeiteter Originalbeitrag. – podvlada

2

Ich hatte das versucht, funktioniert gut für mein Szenario.

//get the sheets info 
     var faceWrksheet = excel.Worksheet(facemechSheetName); 
     // get the total rows count. 
     int _faceMechRows = faceWrksheet.Count(); 

     // append with End Range. 
    var faceMechResult = excel.WorksheetRange<ExcelFaceMech>("A5", "AS" + _faceMechRows.ToString(), SheetName). 
         Where(i => i.WorkOrder != null).Select(x => x).ToList(); 
+0

Ich fand das gerade sehr nützlich, wollte aber darauf hinweisen, dass Sie den Startzeilenwert zur Anzahl der Datensätze hinzufügen müssen oder dass Sie die Anzahl der Zeilen am Ende vermissen, also sollte es int sein _faceMechRows = faceWrksheet.Count() + 5; –

+0

@DavidMolyneux Ich bin mir nicht sicher, das war 2 Jahre zurück, aber in meinem Fall war es einige Header-Datensätze zu überspringen. – Eldho

+0

Hallo, Sie haben Recht, ich habe mir ein bisschen mehr angesehen, wenn Sie Daten in den oberen Zeilen haben, dann funktioniert es gut. Wenn sie wie ich sind, sind sie nur leere Zeilen, dann werden sie nicht geladen, und die Gesamtzahl der Zeilen ist um die Anzahl der leeren Zeilen kurz.Wenn Sie also 5 leere Zeilen und 15 Zeilen mit Daten (20 Zeilen insgesamt) haben, beträgt die Gesamtzahl der Zeilen 15, sodass Ihr Bereich von Zeile 5 nach Zeile 15 wechselt. Die letzten 5 Zeilen, die in den übersprungenen Zeilen hinzugefügt werden, bringen Sie zurück in die korrekte Summe –

Verwandte Themen