2 votes

Syntaxe LinqToExcel

J'utilise le projet LinqToExcel développé par le MIT et hébergé sur Google Code à l'adresse suivante http://code.google.com/p/linqtoexcel/wiki/UsingLinqToExcel .

Cela semble assez simple et élégant. J'ai pu réécrire une méthode qui utilisait la bibliothèque d'interopérabilité MS Excel et le code était environ 1/3 de la taille.

Cependant, j'ai rencontré un problème lorsque j'ai essayé d'interroger une plage de cellules. VS2008 le détecte comme une erreur de syntaxe :

   //These lines are fine
   IEnumerable<string> names = new List<string>();
   var excel = new Excel.ExcelQueryFactory(_excelFilePath);

   //This line shows a syntax error starting from c[0]
    names = from c in excel.WorksheetRange("A1", "AI1", headerName)
                c[0] == "IN"
                select c;

La ligne - c[0] == "IN" - semble tout simplement étrange. Elle devrait saisir la valeur de la cellule A1. Si je supprime "c[0] ==IN", l'erreur de syntaxe disparaît, mais le programme ne renvoie aucun résultat.

Cette syntaxe est-elle correcte ? Le code de la page liée est-il en C# ?


MISE À JOUR : Après avoir obtenu quelques réponses, il semble que le "Où" manquant soit effectivement une faute de frappe. Cependant, même avec le "where", je n'ai pas pu obtenir que c[4] == "IN" pour retourner la cellule A5. J'ai pu accomplir ce dont j'avais besoin en supprimant toute la clause where, ce qui m'a permis d'obtenir la totalité de la plage spécifiée. Dans le message initial, j'essayais juste de retourner une seule valeur - des pas de bébé :)

Dans le but de marquer une réponse, comment puis-je retourner une seule cellule de la plage ? Peut-être que le == "IN" est une sorte de faute de frappe, et non une construction réelle de LinqToExcel ?

Merci pour votre aide !

6voto

Klaus Byskov Pedersen Points 43779

Ça aurait dû l'être :

var names = from c in excel.WorksheetRange("A1", "AI1", headerName) 
            where c[0] == "IN" 
            select c;

2voto

Pharabus Points 4664

Je pense que vous avez besoin d'un where là-dedans, il peut s'agir d'une faute de frappe sur la page de la doc, avez-vous essayé

  //These lines are fine
   //IEnumerable<string> names = new List<string>(); removed this as not really needed
   var excel = new Excel.ExcelQueryFactory(_excelFilePath);

   //This line shows a syntax error starting from c[0]
   var names = from c in excel.WorksheetRange("A1", "AI1", headerName)
                where  c[0] == "IN"
                select c;

édition mise à jour pour ajouter le var également nécessaire

2voto

James Curran Points 55356

Sur cette page, près de la moitié des requêtes affichées ont la mention where et la moitié ne le font pas. Je pense que c'est juste une erreur de copier/coller. Ce n'est pas une partie de la syntaxe sur laquelle LinqToExcel aurait un quelconque contrôle.

Cependant, je note que vous avez dit que, sans cette ligne, aucun résultat n'est renvoyé. C'est un autre problème, puisque, sans cette ligne, chaque ligne aurait dû être retourné (bien que, si je lis correctement, votre plage ne comporte qu'une seule ligne). Cependant, je vais supposer que LinqToExcel fonctionne comme LinqToSql et LinkToObject, et que c'est paresseux évalué c'est-à-dire qu'il n'effectue la requête qu'au moment où vous l'effectuez.

Et un autre point :

 IEnumerable<string> names = new List<string>(); 
 names = from c in excel.WorksheetRange("A1", "AI1", headerName) 
            where c[0] == "IN" 
            select c; 

La première ligne crée une liste de chaînes de caractères, qui est ensuite jetée à la ligne suivante. Beaucoup de nouveaux programmeurs C# semblent penser qu'il est nécessaire de déclarer le type de la variable, mais cela est complètement géré ici par la fonction IEnumerable<string> partie. Le site new n'est pas nécessaire. Cette ligne pourrait être écrite comme suit :

 IEnumerable<string> names = null;

ou simplement

 IEnumerable<string> names;

ou elle peut être combinée avec la deuxième ligne :

 IEnumerable<string> names 
     = from c in excel.WorksheetRange("A1", "AI1", headerName) 
            where c[0] == "IN" 
            select c; 

ou abrégé en :

 var names = from c in excel.WorksheetRange("A1", "AI1", headerName) 
            where c[0] == "IN" 
            select c;

1voto

Alex Reitbort Points 9120

Essayez ça :

   //These lines are fine
   IEnumerable<string> names = new List<string>();
   var excel = new Excel.ExcelQueryFactory(_excelFilePath);

   //This line shows a syntax error starting from c[0]
    names = from c in excel.WorksheetRange("A1", "AI1", headerName)
                where c[0] == "IN"
                select c;

0voto

jpQuint Points 1

Mon problème apparaît lorsque vous voulez juste récupérer certaines colonnes, en passant la lettre de la colonne, je trouve que mettre en condition.

var LetterColumn = {A, C, D}
var clientData = from c in excelFile.WorksheetRangeNoHeader("A1", "G10", "Sheet1")
.Where(c.contains(LetterColumn))
.Select c

Image 1

Image 2

Il est clair que cela ne fonctionnera pas, mais c'est plus ou moins la condition qui, je l'espère, sera remplie. Mon type d'objet est RowNoHeader.

Merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X