Aller au contenu

Excel LISP (2)


Messages recommandés

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.

Arguments

filename : 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 plus

AdoExcelLisp.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

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

: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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

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)

 

Tramber

Et en installantAccessDatabaseEngine.exe ?

 

@+

 

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité