(gile) Posté(e) le 2 août 2010 Posté(e) le 2 août 2010 Salut, J'avais défini deux fonctions LISP en .NET pour lire et écrire des feuilles Excel (voir ici). Je veux essayer quelque chose de plus performant en utilisant ADO.NET (gestion de base de données) pour faire la même chose sans démarrer de processus Excel. Je pense avoir réussi en lecture, mais je n'ai pas encore eu le temps d'implémenter la fonction pour l'écriture. La fonction gc-XlDbRead fonctionne comme gc-XlRead et retourne les données sous forme d'une liste de sous-listes de chaînes (une sous-liste par rangée) (gc-XlDbRead filename [sheet])Lit une feuille Excel et retourne les données sous forme d'une liste de sous-listes dont les éléments sont de chaînes.Argumentsfilename : le nom complet du fichier (chemin compris)sheet : (optionnel) le nom de la feuille (lit la feuille "Feuil1" si omis, retourne nil si la feuille n'existe pas) Il y a deux versions suivant la version d'Excel :AdoExcel2007Lisp.dll pour Excel 2007 ou plusAdoExcelLisp.dll pour les versions antérieures Merci pour les éventuels retours (positifs ou négatifs) AdoExcelLisp.zip Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 3 août 2010 Posté(e) le 3 août 2010 Salut Cela fonctionne correctement chez moi (office 2000).Juste une chose. Si on omet le 2em argument et que la "Feuil1" n'existe pas, on a un message d'erreur.Cela peut-être évité en pointant sur la 1er feuille du classeur sans la nommer obligatoirement "Feuil1" ? Juste une chose. Ta dll pourrait aussi fonctionner avec OpenOffice ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Patrick_35 Posté(e) le 3 août 2010 Posté(e) le 3 août 2010 Comme tu es dans les outils de programmation, juste une idée qui me vient.Il ne serait pas plus simple de retourner une cellule Excel et qu'ensuite on décide de ce que l'on veut faire. Par exemple(setq Ma_feuille (Ma_fonction_1_net "c:/rep1/fichier.xls" "Feuil1")) (setq Ma_cellule (Ma_fonction_2_net Ma_feuille "A1C1"))puis(vla-put... Ma_cellule)ou(vla-get... Ma_cellule) Sans oublier la possibilité de sauvegarder ou pas la/les modif(s) sur la feuille Excel @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 3 août 2010 Auteur Posté(e) le 3 août 2010 Salut et merci pour le retour, Juste une chose. Si on omet le 2em argument et que la "Feuil1" n'existe pas, on a un message d'erreur.Cela peut-être évité en pointant sur la 1er feuille du classeur sans la nommer obligatoirement "Feuil1" ? La méthode utilisée ici permet de ne pas ouvrir Excel (c'est pour ça que c'est plus rapide), mais utilise la syntaxe des requêtes dans une base de données.Il n'est donc pas possible de savoir par avance si la feuille existe ou non. Juste une chose. Ta dll pourrait aussi fonctionner avec OpenOffice ? Je ne suis pas sûr qu'il existe les pilotes pour utiliser Le tableur d'Open Office comme une base de données (ici j'utilise OleDb de Microsoft qui n'est certainement pas compatible). Comme tu es dans les outils de programmation, juste une idée qui me vient.Il ne serait pas plus simple de retourner une cellule Excel et qu'ensuite on décide de ce que l'on veut faire. Il est certainement possible de limiter le 'SELECT' à certaine conditions dans la table (cellule ou groupe de cellules) mais ça demande de traduire les arguments LISP en instructions SQL, un développement plus complexe que je n'ai pas trop le temps de faire en ce moment (mais je laisse murir dans un coin...). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 3 août 2010 Posté(e) le 3 août 2010 :D Ben dommage, chez moi, ca gaze pas.Tu m'étonnes, je traine un vieux Excel 2002... Erreur: Le fournisseur 'Microsoft.Jet.OLEDB.4.0' n'est pas inscrit sur l'ordinateur local. Dis-moi si je peux t'aider à corriger ou compléter. Sinon, en effet, j'avais la même question que Patrick_35 à propos d'OpenOffice. D'ailleurs l'un d'entre vous a-t-il déjà essayé l'écriture-lecture dans ce tableur comme on siat le faire avec le Vlisp ? A vous lire... Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 4 août 2010 Auteur Posté(e) le 4 août 2010 Salut et merci pour le retour. J'ai peut-être trouvé la cause ici : Ce problème se produit car il n'aucune version 64 bits du fournisseur Microsoft.Jet.OLEDB.4.0 de base de données. . J'essayerai la solution proposée ce soir. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 4 août 2010 Posté(e) le 4 août 2010 Bonjour Gile, Ca marche nickel chez moi Autocad 2010 et Excel 2003 sur Vista.Ca prend un peu de temps avec beaucoup de points à traiter (environ 4000) mais ca va quand même (1min pas plus)Donc si je comprends bien, pas besoin d'ouvrir Excel et pas de problème de gestion de mémoire ou d'application avec Excel. Le seul hic cependant, c'est qu'il faut connaitre (ou au moins avoir ouvert avant le fichier) le nom de la feuille Excel.Si on peut retourner dans une liste le nom de toutes les feuilles d'un fichier Excel sans devoir l'ouvrir, ca serait énorme. Ca rejoindrai un peu ma demande dans l'autre post. En tout cas, ta fonction marche nickel.Bravo encore. John
(gile) Posté(e) le 4 août 2010 Auteur Posté(e) le 4 août 2010 Salut, Tramber, J'ai recompilé les dll en ciblant sur x86 comme conseillé dans l'aide Microsoft, merci de me dire si ça fonctionne maintenant. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 4 août 2010 Posté(e) le 4 août 2010 Commande: netload Impossible de charger l'assemblage. Détails de l'erreur: System.BadImageFormatException: Impossible de charger le fichier ou l'assembly 'file:///P:\V-ACAD univers, lisps et cours\Programmes\AdoExcelLisp\AdoExcelLisp.dll' ou une de ses dépendances. Tentative de chargement d’un programme de format incorrect. Nom du fichier : 'file:///P:\V-ACAD univers, lisps et cours\Programmes\AdoExcelLisp\AdoExcelLisp.dll' à System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) à System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) à System.Reflection.Assembly.LoadFrom(String assemblyFile) à Autodesk.AutoCAD.Runtime.ExtensionLoader.Load(String fileName) à loadmgd() AVT : le journal de liaison d'assembly est désactivé. Pour activer le journal des échecs de liaison d'assembly, attribuez la valeur 1 à la valeur de Registre [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD). Remarque : une certaine perte de performance est associée à l'enregistrement dans le journal des échecs de liaison d'assembly. Pour désactiver cette fonctionnalité, supprimez la valeur de Registre [HKLM\Software\Microsoft\Fusion!EnableLog]. Voilà (sans résumer) ce que me dit maintenant la ligne de commande :o Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 5 août 2010 Auteur Posté(e) le 5 août 2010 Salut, Bon, bien il semblerait que l'utilisation de ADO.NET pour lire une feuille Excel ne soit pas une si bonne idée...Pas évident la programmation de Windows avec le passage aux 64 bits... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 5 août 2010 Posté(e) le 5 août 2010 Je pense aussi que ca diversifie encore la palette de possibilités.Je suis en 64bits sur le tout dernier W7 et j'ai un office qui date de 2002 ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 19 août 2010 Posté(e) le 19 août 2010 Salut Il n'est donc pas possible de savoir par avance si la feuille existe ou non. Salut J'ai une solution en vlisp et utilisant ADO; Connexion sur le fichier Excel ; Retourne la connexion si tout s'est bien passé, sinon nil ; ; 1er argument --> Nom du fichier ; ; Pour ceux qui ont la version antérieur à Office 2007 ; il faut que AccessDatabaseEngine.exe (25.3Mo) soit installé pour lire les fichiers xlsx ; http://www.microsoft.com/downloads/fr-fr/confirmation.aspx?familyId=7554f536-8c28-4598-9b72-ef94e038c891&displayLang=fr (defun Connexion_Xls(fichier / adoconnect data) (setq adoconnect (vlax-create-object "ADODB.Connection")) (if (eq (strcase (vl-filename-extension fichier)) ".XLSX") (setq data (strcat "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" fichier ";Extended Properties='Excel 12.0;HDR=No;IMEX=1'" ) ) (setq data (strcat "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" fichier ";Extended Properties=;Excel 8.0;HDR=No;IMEX=1" ) ) ) (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke-method (list adoconnect 'Open data "" "" nil ) ) ) nil adoconnect ) ) ; Liste des onglets ; Retourne la liste des onglets si tout s'est bien passé, sinon nil ; ; 1er argument --> Connexion excel (obtenu avec Connexion_Xls) (defun Liste_Onglets(Connexion / resultat) (if (and (not (vl-catch-all-error-p (setq resultat (vl-catch-all-apply 'vlax-invoke-method (list Connexion 'OpenSchema 20))))) (not (vl-catch-all-error-p (setq resultat (vl-catch-all-apply 'vlax-invoke-method (list resultat 'GetRows 65535))))) ) (mapcar '(lambda(x) (vl-string-right-trim "$" x)) (vl-remove-if-not '(lambda(x) (wcmatch x "*$")) (caddr (mapcar '(lambda(x) (mapcar 'vlax-variant-value x)) (vlax-safearray->list (vlax-variant-value resultat)) ) ) ) ) nil ) ) (defun Fermer_Xls(Connexion) (vl-catch-all-apply 'vlax-invoke (list Connexion 'Close)) (vl-catch-all-apply 'vlax-release-object Connexion) ) (setq fil (getfiled "Sélectionner le fichier Excel" "" "xls;xlsx" 0))(setq mon_xls (connexion_xls fil))(fermer_xls mon_xls) TramberEt en installantAccessDatabaseEngine.exe ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 19 août 2010 Auteur Posté(e) le 19 août 2010 Bien joué Patrick (ActiveX master) ;) ADO me semble aussi une piste prometteuse pour accéder à Excel mais semble parsemée d'embuches. Un fichier Excel n'a pas forcément la rigueur d'une véritable base de données et en plus, on est confronté à diverses versions à plusieurs niveaux (versions d'Office, systèmes d'exploitation et processeurs...) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 19 août 2010 Posté(e) le 19 août 2010 Merci (gile) Mais je n'ai pas un grand mérite, c'est Elpanov Evgeniy qui m'a mis sur la piste des onglets C'est vrai que jouer avec les activex est passionnant, mais on y laisse des cheveux ;)Je suis en ce moment en plein ADO, et ce n'est pas facile, c'est le moins que l'on puisse dire.Je trouve des routines (tous langage sauf vlisp, trop facile :cool: ) qu'il faut comprendre. Je suis aussi de ton avis, ADO semble très prometteur si on n'a pas peur de relever les manches. Je songe à des routines qui pourront lire/écrire aussi bien des documents Excel que des Documents OpenOffice et je pense qu'ADO pourrait-être la passerelle. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 19 août 2010 Auteur Posté(e) le 19 août 2010 Je n'ai pas trop de temps à consacrer à ça en ce moment, mais je pense vraiment qu'on aborde là des sujet où .NET est bien mieux "armé" que Visual LISP. De plus avec Link (Language Integrated Query) on a une sorte de SQL intégré au langage ce qui permet d'utiliser des méthodes (et l'aide de l'intellisense de Visual Studio) à la place des chaîne de requête. À bientôt sur les forums .NET... ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 20 août 2010 Posté(e) le 20 août 2010 Je songe à des routines qui pourront lire/écrire aussi bien des documents Excel que des Documents OpenOffice et je pense qu'ADO pourrait-être la passerelle. A,h, un élément de réponse à mes questionnements distants. Un jour, j'apprendrai un peu .NET... Une question ADO quezako ? c'est fourni par qui ? Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 20 août 2010 Auteur Posté(e) le 20 août 2010 Salut, ADO (ActiveX Data Objects) est un module d'accès aux bases de données utilisé, entre autre, en Visual Basic 6. ADO.NET est un peu l'équivalent amélioré pour .NET. Il s'agit d'un ensemble de classes agissant comme une interface ente la base de données et le programme. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 20 août 2010 Posté(e) le 20 août 2010 Salut Un sujet à lire. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant