Aller au contenu

Lire et écrire des feuilles Excel


Messages recommandés

Posté(e)

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

Posté(e)

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

 

Posté(e)

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

Posté(e)

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.

Posté(e)

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

Posté(e)

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

Posté(e)

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

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é