2012-08-31 4 views
6

J'utilise le LinqToExcel library. Bon travail jusqu'à présent, sauf que j'ai besoin commencer la requête à une ligne spécifique. En effet, la feuille de calcul Excel du client utilise des images et des informations "en-tête" en haut du fichier Excel avant que les données ne commencent réellement.LinqToExcel - Nécessité de démarrer à une ligne spécifique

Les données elles-mêmes seront simples à lire et sont assez génériques, j'ai juste besoin de savoir comment dire au ExcelQueryFactory de commencer à une ligne spécifique.

Je suis conscient de l'option WorksheetRange<Company>("B3", "G10"), mais je ne veux pas spécifier une ligne de fin, juste où commencer lecture du fichier.

En utilisant la dernière v. De LinqToExcel avec C#

Répondre

1

Avez-vous essayé WorksheetRange<Company>("B3", "G")

+0

Oui, unfortuantly il me donne une erreur "argument fin d'une fourchette 'G' est format non valide pour le nom de cellule" – contactmatt

0

Unforunatly, en ce moment et itération dans le cadre LinqToExcel, il ne semble pas être une façon de le faire. Pour contourner cela, nous demandons au client d'avoir les données à télécharger dans sa propre "feuille" dans le document Excel. La ligne d'en-tête à la première rangée et les données en dessous. S'ils veulent des "méta-données", ils devront les inclure dans une autre feuille. Ci-dessous un exemple du LinqToExcel documentation sur comment interroger une feuille spécifique.

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

Je viens d'essayer ce code et il semble fonctionner très bien:

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>(), 
    }; 

Je ne suis revenu avec les lignes de données.

4

Je suppose que vous avez déjà résolu ce problème, mais peut-être pour d'autres - ressemble, vous pouvez utiliser

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 
} 

pas aussi simple que spécifiant une plage (« B3 », ...), mais aussi la manière . J'espère que cela aide au moins quelqu'un;)

+0

où vous attribuez la variable 'length'? – CodeArtist

+0

Eh bien, habituellement ce serait 'allRows.Count' ou' allRows.Count() 'ou' allRows.Length' (ne sais pas maintenant, désolé), si vous voulez lire toutes les lignes. Ou en tant que substitution à la spécification (non existante) 'Range (" B3 "," G10 ")' vous devez le calculer. 'Length' a été utilisé uniquement à des fins d'affichage. À l'époque, il n'y avait pas de solution simple. AFAIK ... Bon point, article original édité. – podvlada

2

J'avais essayé ceci, fonctionne bien pour mon scénario.

//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

Je viens de trouver cela très utile, mais je voulais souligner que vous devez ajouter la valeur de ligne de début au nombre d'enregistrements ou vous manquez ce nombre de lignes à la fin, donc il devrait être int _faceMechRows = faceWrksheet.Count() + 5; –

+0

@DavidMolyneux Je ne suis pas sûr qu'il y a 2 ans, mais dans mon cas, c'était pour ignorer certains enregistrements d'en-tête. – Eldho

+0

Salut, vous avez raison, j'ai regardé dans un peu plus, si vous avez des données dans vos lignes supérieures alors ça fonctionne bien. Si, comme moi, ils ne sont que des lignes vides, ils ne sont pas chargés et le nombre total de lignes est inférieur au nombre de lignes vides.Ainsi, si vous avez 5 lignes vides et 15 lignes de données (20 lignes au total), le nombre total de lignes est de 15, donc votre plage ira de la ligne 5 à la ligne 15, les 5 dernières lignes ajoutées aux lignes sautées vous ramèneront au total correct. –

Questions connexes