chris_mtp Posté(e) le 18 août 2010 Partager Posté(e) le 18 août 2010 C'est compliqué de comprendre le VB Net.J'ai essayé et sérieux c'est difficle. Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 18 août 2010 Auteur Partager Posté(e) le 18 août 2010 Salut, Ta demande est complexe, il faut lire Excel qui possède ses propres formats, par exemple les dates qu'on peut afficher sous divers format mais qui sont stockées sous forme d'un nombre (appelé "numéro de série") qui correspond au nombre de jours écoulés depuis le premier janvier 1900 (avec un erreur en plus : 1990 est considéré comme année bissextile). On essaye de le faire en mixant deux langages : AutoLISP faiblement typé (hors les types spécifiques à AutoCAD, il ne connait que les entiers, les réels et les chaînes de caractères) et .NET qui est très fortement typé. Les fonctions gc-XlRead et gc-XlBdRead utilisent deux méthodes différentes. La première ouvre Excel et récupère les données "brutes" (comme si toutes les cellules avaient le format Standard) c'est pourquoi les dates sont retournées sous la forme de leur "numéro de série".La seconde lit une feuille Excel comme si c'était une table d'une base de donnée, or dans une table de base de données, les données de chaque colonne doivent être du même type (entier, réel, chaîne, date, etc.), c'est pourquoi il reconnaitra soit les entiers soit les chaînes comme type de ta première colonne mais pas les deux. Si j'ai un peu de temps, je vais voir si je peux faire une routine qui convertit les "numéros de série" des dates Excel en chaîne avec un format lisible. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 20 août 2010 Partager Posté(e) le 20 août 2010 Bonjour, Si tu veux, pour te simplifier, il suffit avec la fonction gc-XlDbRead en lisant la première colonne comme une chaîne non ?Que j'ai dans ma première colonne un point du type A325, PT56 ou 25, il retournera le tout comme une chaîne de caractères non ?Le format Date de gc-XlDbRead me va très bien avec un (substr (nth 10 num) 1 10) , j'ai pu contourner le problème. Merci encore de ton aide.John Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 20 août 2010 Auteur Partager Posté(e) le 20 août 2010 Salut, Non, ce n'est pas moi qui décide comment est lue la table, mais ADO.NET qui qui lit la table comme une table de base données valide dans laquelle chaque champ (colonne) doit être du même type.La seule chose que je peux faire (et que je fait) c'est de convertir les données en chaînes pour les retourner dans le LISP, ce qui permet entre autre de retourne les données de type DateTime sous forme de chaîne, AutoLISP n'ayant pas de type pour les dates. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 20 août 2010 Partager Posté(e) le 20 août 2010 Ok alors, je voulais te proposer une solution pas trop longue.De mon côté, j'ai voulu faire une fonction qui avec un nombre de jours retourne la date réelle depuis l'année 1990 mais avec les années bissextile, c'est difficile voir impossible.Ya des trucs sur le net à ce sujet mais pas de formule concrète.Merci encore de ton aide. Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 20 août 2010 Auteur Partager Posté(e) le 20 août 2010 Salut, Tu peux essayer ça. Ça a l'air de fonctionner ;; ExcelDate ;; Retourne une date sous forme de chaîne au format : JJ/MM/AAAA ;; ;; Argument ;; num : un entier représentant un "numéro de série" Excel (defun ExcelDate (num / foo y d b s) (defun foo (n) (if ( (strcat "0" (itoa n)) (itoa n) ) ) (if ( (if (= 60 num) "29/02/1900" (progn (setq num (if ( (1- num) num ) y (fix (/ num 365.2425)) d (rem (- num (/ y 4) (/ y -100) (/ (+ 300 y) 400)) 365) ) (if (= 0 (rem (+ 300 y) 400)) (setq d (1+ d)) ) (setq b (if (and (/= 0 y) (= 0 (rem y 4)) (or (= 0 (rem (+ 300 y) 400)) (/= 0 (rem y 100))) ) 29 28 ) s (itoa (+ 1900 y)) ) (cond ((= 0 d) (strcat "31/12/" s)) (( (( (( (( (( (( (( (( (( (( (( (T (strcat (foo (- d (+ 306 b))) "/12/" s)) ) ) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 20 août 2010 Partager Posté(e) le 20 août 2010 Ca marche nickel Gile.Essayez avec plusieurs dates sur plusieurs feuilles ou sur une même feuille.gc-XlDbRead est quand même beaucoup plus rapide que gc-XlRead.Merci encore de ton aide et Bravo. John Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 20 août 2010 Auteur Partager Posté(e) le 20 août 2010 gc-XlDbRead est quand même beaucoup plus rapide que gc-XlRead. Oui, mais gc-XlDbRead a ses limites, et ne fonctionnera sans problème qu'avec des feuilles Excel remplies comme des tabels de base de données. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
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