Aller au contenu

Excel + champs


azrael

Messages recommandés

Bonjour à tous,

Je cherche depuis quelques jours à remplir les cartouches à partir d'un fichiers Excel. J'ai créer des champs à partir des propriétés du dessin - personnaliser (Date - N° de plan - titre1 - titre2 - Site …)

J'ai un fichier Excel dont :

la 1er colonne = Date

la 2ème colonne = N° de plan

la 3ème colonne = titre1

Etc.

J'ai le fichier lisp qui permet de copier des valeurs dans les propriétés déjà créées.

Dans le meilleur des mondes, je souhaiterai pourvoir ouvrir un fichier excel - choisir une feuille - une ligne et copier les valeurs de la ligne dans les propriétés du dessin.

J'ai cherché sur le site mais sans résultat.

Cela est-il possible ?

Maxime

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je pensais avoir déjà postées ces routines sur CADxp, mais je ne les retrouve pas.

 

;;-------------------------------------------------------------------------------
;; gc:WriteExcel
;; Ecrit dans un fichier Excel
;;
;; Arguments : 4
;;   filename   : chemin complet du fichier
;;   sheet      : nom de la feuille (ou nil pour la feuille courante)
;;   startRange : nom de la cellule de départ (ou nil pour "A1")
;;   dataList   : liste de sous-listes contenant les données (une sous liste par rangée)
;;-------------------------------------------------------------------------------
(defun gc:WriteExcel (filename sheet	startRange	  dataList /	    *error*  xlApp
	      wBook    save	sheets	 active	  start	   row	    col	     cells
	      n	       cell
	     )
 (vl-load-com)

 (defun *error* (msg)
   (and msg
 (/= msg "Fonction annulée")
 (princ (strcat "\nErreur: " msg))
   )
   (and wBook (vlax-invoke-method wBook 'Close :vlax-False))
   (and xlApp (vlax-invoke-method xlApp 'Quit))
   (and reg (vlax-release-object reg))
   (mapcar (function (lambda (obj) (and obj (vlax-release-object obj))))
    (list cell cells wBook xlApp)
   )
   (gc)
 )

 (setq xlapp (vlax-get-or-create-object "Excel.Application"))

 (if (findfile filename)
   (setq wBook	(vlax-invoke-method (vlax-get-property xlapp 'WorkBooks) 'Open filename)
  save	T
   )
   (setq wBook (vlax-invoke-method (vlax-get-property xlapp 'WorkBooks) 'Add))
 )

 (if sheet
   (progn
     (setq sheets (vlax-get-property xlApp 'Sheets))
     (vlax-for	s sheets
(if (= (strcase (vlax-get-property s 'Name)) (strcase sheet))
  (progn
    (vlax-invoke-method s 'Activate)
    (setq active T)
  )
)
     )
     (or active
  (vlax-put-property (vlax-invoke-method sheets 'Add) 'Name sheet)
     )
   )
 )

 (if startRange
   (setq start	(gc:ColumnRow startRange)
  col	(car start)
  row	(cadr start)
   )
   (setq col 1
  row 1
   )
 )

 (setq cells (vlax-get-property xlApp 'Cells))
 (or startRange (vlax-invoke-method cells 'Clear))
 (foreach sub dataList
   (setq n col)
   (foreach data sub
     (setq cell (vlax-variant-value (vlax-get-property cells 'Item row n)))
     (if (= (type data) 'STR)
(vlax-put-property cell 'NumberFormat "@")
     )
     (vlax-put-property cell 'Value2 data)
     (setq n (1+ n))
   )
   (setq row (1+ row))
 )

 (vlax-invoke-method
   (vlax-get-property
     (vlax-get-property xlApp 'ActiveSheet)
     'Columns
   )
   'AutoFit
 )

 (if save
   (vlax-invoke-method wBook 'Save)
   (if	(and
  (< "11.0" (vlax-get-property xlapp "Version"))
  (= (strcase (vl-filename-extension filename) T) ".xlsx")
)
     (vlax-invoke-method wBook 'SaveAs filename 51 "" "" :vlax-false :vlax-false 1 1)
     (vlax-invoke-method wBook 'SaveAs filename -4143 "" "" :vlax-false :vlax-false 1 1)
   )
 )

 (*error* nil)
)

;;-------------------------------------------------------------------------------
;; gc:ReadExcel
;; Retourne une liste de sous-listes contenant les données (une sous liste par rangée)
;; d'un fichier Excel
;;
;; Arguments : 4
;;   filename   : chemin complet du fichier
;;   sheet      : nom de la feuille (ou nil pour la feuille courante)
;;   startRange : nom de la cellule de départ (ou nil pour "A1")
;;   maxRange   : nom de la cellule où doit s'arrêter la lecture,
;;                ou "*" pour toute la feuille, ou nil ou "" pour la région courante
;;-------------------------------------------------------------------------------
(defun gc:ReadExcel (filename  sheet	 startRange	     maxRange  /	 *error*
	     xlApp     wBook wSheet	 startCell startCol  startRow  maxCell	 maxCol
	     maxRow    reg	 cells	   col	     row       data	 sub
	     lst
	    )

 (defun *error* (msg)
   (and msg
 (/= msg "Fonction annulée")
 (princ (strcat "\nErreur: " msg))
   )
   (and wBook (vlax-invoke-method wBook 'Close :vlax-False))
   (and xlApp (vlax-invoke-method xlApp 'Quit))
   (mapcar (function (lambda (obj) (and obj (vlax-release-object obj))))
    (list reg cells wSheet wBook xlApp)
   )
   (gc)
 )

 (setq	xlapp (vlax-get-or-create-object "Excel.Application")
wBook (vlax-invoke-method (vlax-get-property xlApp 'WorkBooks) 'Open filename)
 )

 (if sheet
   (vlax-for ws (vlax-get-property xlapp 'Sheets)
     (if (= (vlax-get-property ws 'Name) sheet)
(vlax-invoke-method (setq wSheet ws) 'Activate)
     )
   )
   (setq wSheet (vlax-get-property wBook 'ActiveSheet))
 )

 (if startRange
   (setq startCell (gc:ColumnRow startRange)
  startCol  (car startCell)
  startRow  (cadr startCell)
   )
   (setq startRange
   "A1"
  startCol 1
  startRow 1
   )
 )

 (if (and maxRange (setq maxCell (gc:ColumnRow maxRange)))
   (setq maxCol (1+ (car MaxCell))
  maxRow (1+ (cadr MaxCell))
   )
   (setq reg	 (if (= maxRange "*")
	   (vlax-get-property wSheet 'UsedRange)
	   (vlax-get-property
	     (vlax-get-property wSheet 'Range startRange)
	     'CurrentRegion
	   )
	 )
  maxRow (+ (vlax-get-property reg 'Row)
	    (vlax-get-property (vlax-get-property reg 'Rows) 'Count)
	 )
  maxCol (+ (vlax-get-property reg 'Column)
	    (vlax-get-property (vlax-get-property reg 'Columns) 'Count)
	 )
   )
 )

 (setq	cells (vlax-get-property xlApp 'Cells)
row maxRow
 )
 (while (< startRow row)
   (setq sub nil
  col maxCol
  row (1- row)
   )
   (while (< startCol col)
     (setq col	(1- col)
    sub	(cons
	  (vlax-variant-value
	    (vlax-get-Property
	      (vlax-variant-value (vlax-get-property cells 'Item row col))
	      'Value2
	    )
	  )
	  sub
	)
     )
   )
   (setq lst (cons sub lst))
 )

 (*error* nil)

 lst
)

;;-------------------------------------------------------------------------------
;; gc:ColumnRow - Retourne une liste des indices de colonne et rangée
;; Arguments: 1
;;   Cell = Référence de la cellule
;; Exemple de syntaxe : (gc:ColumnRow "IV987") -> (256 987)
;;-------------------------------------------------------------------------------
(defun gc:ColumnRow (cell / col char row)
 (setq col "")
 (while (< 64 (ascii (setq char (strcase (substr cell 1 1)))) 91)
   (setq col  (strcat col char)
  cell (substr cell 2)
   )
 )
 (if (and (/= col "") (numberp (setq row (read Cell))))
   (list (gc:Alpha2Number col) row)
 )
)

;;-------------------------------------------------------------------------------
;; gc:Alpha2Number - Convertit une chaîne alphabétique en nombre entier
;; Function By: Gilles Chanteau from Marseille, France
;; Arguments: 1
;;   str = Chaîne à convertir
;; Exemple de syntaxe : (gc:Alpha2Number "BU") = 73
;;-------------------------------------------------------------------------------
(defun gc:Alpha2Number (str / num)
 (if (= 0 (setq num (strlen str)))
   0
   (+ (* (- (ascii (strcase (substr str 1 1))) 64)
  (expt 26 (1- num))
      )
      (gc:Alpha2Number (substr str 2))
   )
 )
)

;;-------------------------------------------------------------------------------
;; gc:Number2Alpha - Convertit un nombre entier en chaîne alphabétique
;; Function By: Gilles Chanteau from Marseille, France
;; Arguments: 1
;;   num = Nombre à convertir
;; Exemple de syntaxe : (gc:Number2Alpha 73) = "BU"
;;-------------------------------------------------------------------------------
(defun gc:Number2Alpha (num / val)
 (if (< num 27)
   (chr (+ 64 num))
   (if	(= 0 (setq val (rem num 26)))
     (strcat (gc:Number2Alpha (1- (/ num 26))) "Z")
     (strcat (gc:Number2Alpha (/ num 26)) (chr (+ 64 val)))
   )
 )
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile,

Désolé mais l'entreprise est en audit ACI toute la semaine et nous sommes très sollicités. Je vais tester le programme ce soir à la maison.

Déjà un grand merci pour ta réponse rapide ;) J'en profite également pour te remercier pour l'ensemble des solutions déposé sur CadXP. J'en utilise certaines depuis déjà quelques années avec toujours le même bonheur.

Maxime

Lien vers le commentaire
Partager sur d’autres sites

Il s'agit de fonctions LISP, pas de commandes définies en LISP.

Elles s'utilisent comme les fonctions natives en leur passant les arguments requis (lis les commentaires en en-tête).

 

Par exemple, pour récupérer tout le contenu de la feuille courante du fichier C:\Temp\toto.xls, tu fais :

(gc:ReadExcel "C:\\Temp\\toto.xls" nil nil "*")

pour récupérer le contenu de la feuille courante depuis la cellule "A2" jusqu'à la fin de la plage :

(gc:ReadExcel "C:\\Temp\\toto.xls" nil "A2" nil)

pour récupérer le contenu de la feuille nommée "PropDess" depuis la cellule "A2" jusqu'à la cellule "E3" :

(gc:ReadExcel "C:\\Temp\\toto.xls" "PropDess" "A2" "E3")

Attention, dans tous les cas, AutoCAD va se figer le temps de démarrer un processus Excel (s'il n'y en pas déjà un de lancé) avant de renvoyer une liste de sous listes (une sous-liste par rangée). Il est donc préférable, s'il y a plusieurs requêtes à faire, de récupérer tout le contenu de la feuille et de traiter las liste renvoyée ensuite.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

J'ai trouvé une routine de Terry Miller qui permet de retrouver facilement la valeur d'une cellule (GetCell "E19") = valeur de la cellule E19.

Malheureusement, il n'est pas possible de sélectionner de A2500 à F2500 mais de A1 à F2500. Le PC du bureau est trop lent.

La routine de gille est plus rapide mais je n'arrive ^pas à extraire les valeurs.

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

La routine de Terry Miller

 

GetExcel is a general purpose function for (Excel to AutoCAD) and (AutoCAD to Excel) applications. Special credit to Gilles Chanteau from Marseille, France for his sub-functions ColumnRow, Alpha2Number and Number2Alpha. The syntax for the functions are easy to follow and include documentation of the conditions of each argument in the function headings.

 

 

;-------------------------------------------------------------------------------
; Program Name: GetExcel.lsp [GetExcel R4]
; Created By:   Terry Miller (courriel: terrycadd@yahoo.com)
;               (URL: http://web2.airmail.net/terrycad)
; Date Created: 9-20-03
; Function:     Several functions to get and put values into Excel cells.
;-------------------------------------------------------------------------------
; Revision History
; Rev  By     Date    Description
;-------------------------------------------------------------------------------
; 1    TM   9-20-03   Initial version
; 2    TM   8-20-07   Rewrote GetExcel.lsp and added several new sub-functions
;                     including ColumnRow, Alpha2Number and Number2Alpha written
;                     by Gilles Chanteau from Marseille, France.
; 3    TM   12-1-07   Added several sub-functions written by Gilles Chanteau
;                     including Cell-p, Row+n, and Column+n. Also added his
;                     revision of the PutCell function.
; 4    GC   9-20-08   Revised the GetExcel argument MaxRange$ to accept a nil
;                     and get the current region from cell A1.
;-------------------------------------------------------------------------------
; Overview of Main functions
;-------------------------------------------------------------------------------
; GetExcel - Stores the values from an Excel spreadsheet into *ExcelData@ list
;   Syntax:  (GetExcel ExcelFile$ SheetName$ MaxRange$)
;   Example: (GetExcel "C:\\Folder\\Filename.xls" "Sheet1" "L30")
; GetCell - Returns the cell value from the *ExcelData@ list
;   Syntax:  (GetCell Cell$)
;   Example: (GetCell "H15")
; Function example of usage:
; (defun c:Get-Example ()
;   (GetExcel "C:\\Folder\\Filename.xls" "Sheet1" "L30");<-- Edit Filename.xls
;   (GetCell "H21");Or you can just use the global *ExcelData@ list
; );defun
;-------------------------------------------------------------------------------
; OpenExcel - Opens an Excel spreadsheet
;   Syntax:  (OpenExcel ExcelFile$ SheetName$ Visible)
;   Example: (OpenExcel "C:\\Folder\\Filename.xls" "Sheet1" nil)
; PutCell - Put values into Excel cells
;   Syntax:  (PutCell StartCell$ Data$) or (PutCell StartCell$ DataList@)
;   Example: (PutCell "A1" (list "GP093" 58.5 17 "Base" "3'-6 1/4\""))
; CloseExcel - Closes Excel session
;   Syntax:  (CloseExcel ExcelFile$)
;   Example: (CloseExcel "C:\\Folder\\Filename.xls")
; Function example of usage:
; (defun c:Put-Example ()
;   (OpenExcel "C:\\Folder\\Filename.xls" "Sheet1" nil);<-- Edit Filename.xls
;   (PutCell "A1" (list "GP093" 58.5 17 "Base" "3'-6 1/4\""));Repeat as required
;   (CloseExcel "C:\\Folder\\Filename.xls");<-- Edit Filename.xls
;   (princ)
; );defun
;-------------------------------------------------------------------------------
; Note: Review the conditions of each argument in the function headings
;-------------------------------------------------------------------------------
; GetExcel - Stores the values from an Excel spreadsheet into *ExcelData@ list
; Arguments: 3
;   ExcelFile$ = Path and filename
;   SheetName$ = Sheet name or nil for not specified
;   MaxRange$ = Maximum cell ID range to include or nil to get the current region from cell A1
; Syntax examples:
; (GetExcel "C:\\Temp\\Temp.xls" "Sheet1" "E19") = Open C:\Temp\Temp.xls on Sheet1 and read up to cell E19
; (GetExcel "C:\\Temp\\Temp.xls" nil "XYZ123") = Open C:\Temp\Temp.xls on current sheet and read up to cell XYZ123
;-------------------------------------------------------------------------------
(defun GetExcel (ExcelFile$ SheetName$ MaxRange$ / Column# ColumnRow@ Data@ ExcelRange^
 ExcelValue ExcelValue ExcelVariant^ MaxColumn# MaxRow# Range$ Row# Worksheet)
 (if (= (type ExcelFile$) 'STR)
   (if (not (findfile ExcelFile$))
     (progn
       (alert (strcat "Excel file " ExcelFile$ " not found."))
       (exit)
     );progn
   );if
   (progn
     (alert "Excel file not specified.")
     (exit)
   );progn
 );if
 (gc)
 (if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
   (progn
     (alert "Close all Excel spreadsheets to continue!")
     (vlax-release-object *ExcelApp%)(gc)
   );progn
 );if
 (setq ExcelFile$ (findfile ExcelFile$))
 (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
 (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
 (if SheetName$
   (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
     (if (= (vlax-get-property Worksheet "Name") SheetName$)
       (vlax-invoke-method Worksheet "Activate")
     );if
   );vlax-for
 );if
 (if MaxRange$
   (progn
     (setq ColumnRow@ (ColumnRow MaxRange$))
     (setq MaxColumn# (nth 0 ColumnRow@))
     (setq MaxRow# (nth 1 ColumnRow@))
   );progn
   (progn
     (setq CurRegion (vlax-get-property (vlax-get-property
       (vlax-get-property *ExcelApp% "ActiveSheet") "Range" "A1") "CurrentRegion")
     );setq
     (setq MaxRow# (vlax-get-property (vlax-get-property CurRegion "Rows") "Count"))
     (setq MaxColumn# (vlax-get-property (vlax-get-property CurRegion "Columns") "Count"))
   );progn
 );if
 (setq *ExcelData@ nil)
 (setq Row# 1)
 (repeat MaxRow#
   (setq Data@ nil)
   (setq Column# 1)
   (repeat MaxColumn#
     (setq Range$ (strcat (Number2Alpha Column#)(itoa Row#)))
     (setq ExcelRange^ (vlax-get-property *ExcelApp% "Range" Range$))
     (setq ExcelVariant^ (vlax-get-property ExcelRange^ 'Value))
     (setq ExcelValue (vlax-variant-value ExcelVariant^))
     (setq ExcelValue
       (cond
         ((= (type ExcelValue) 'INT) (itoa ExcelValue))
         ((= (type ExcelValue) 'REAL) (rtosr ExcelValue))
         ((= (type ExcelValue) 'STR) (vl-string-trim " " ExcelValue))
         ((/= (type ExcelValue) 'STR) "")
       );cond
     );setq
     (setq Data@ (append Data@ (list ExcelValue)))
     (setq Column# (1+ Column#))
   );repeat
   (setq *ExcelData@ (append *ExcelData@ (list Data@)))
   (setq Row# (1+ Row#))
 );repeat
 (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
 (vlax-invoke-method *ExcelApp% 'Quit)
 (vlax-release-object *ExcelApp%)(gc)
 (setq *ExcelApp% nil)
 *ExcelData@
);defun GetExcel
;-------------------------------------------------------------------------------
; GetCell - Returns the cell value from the *ExcelData@ list
; Arguments: 1
;   Cell$ = Cell ID
; Syntax example: (GetCell "E19") = value of cell E19
;-------------------------------------------------------------------------------
(defun GetCell (Cell$ / Column# ColumnRow@ Return Row#)
 (setq ColumnRow@ (ColumnRow Cell$))
 (setq Column# (1- (nth 0 ColumnRow@)))
 (setq Row# (1- (nth 1 ColumnRow@)))
 (setq Return "")
 (if *ExcelData@
   (if (and (>= (length *ExcelData@) Row#)(>= (length (nth 0 *ExcelData@)) Column#))
     (setq Return (nth Column# (nth Row# *ExcelData@)))
   );if
 );if
 Return
);defun GetCell
;-------------------------------------------------------------------------------
; OpenExcel - Opens an Excel spreadsheet
; Arguments: 3
;   ExcelFile$ = Excel filename or nil for new spreadsheet
;   SheetName$ = Sheet name or nil for not specified
;   Visible = t for visible or nil for hidden
; Syntax examples:
; (OpenExcel "C:\\Temp\\Temp.xls" "Sheet2" t) = Opens C:\Temp\Temp.xls on Sheet2 as visible session
; (OpenExcel "C:\\Temp\\Temp.xls" nil nil) = Opens C:\Temp\Temp.xls on current sheet as hidden session
; (OpenExcel nil "Parts List" nil) =  Opens a new spreadsheet and creates a Part List sheet as hidden session
;-------------------------------------------------------------------------------
(defun OpenExcel (ExcelFile$ SheetName$ Visible / Sheet$ Sheets@ Worksheet)
 (if (= (type ExcelFile$) 'STR)
   (if (findfile ExcelFile$)
     (setq *ExcelFile$ ExcelFile$)
     (progn
       (alert (strcat "Excel file " ExcelFile$ " not found."))
       (exit)
     );progn
   );if
   (setq *ExcelFile$ "")
 );if
 (gc)
 (if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
   (progn
     (alert "Close all Excel spreadsheets to continue!")
     (vlax-release-object *ExcelApp%)(gc)
   );progn
 );if
 (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
 (if ExcelFile$
   (if (findfile ExcelFile$)
     (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
     (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
   );if
   (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
 );if
 (if Visible
   (vla-put-visible *ExcelApp% :vlax-true)
 );if
 (if (= (type SheetName$) 'STR)
   (progn
     (vlax-for Sheet$ (vlax-get-property *ExcelApp% "Sheets")
       (setq Sheets@ (append Sheets@ (list (vlax-get-property Sheet$ "Name"))))
     );vlax-for
     (if (member SheetName$ Sheets@)
       (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
         (if (= (vlax-get-property Worksheet "Name") SheetName$)
           (vlax-invoke-method Worksheet "Activate")
         );if
       );vlax-for
       (vlax-put-property (vlax-invoke-method (vlax-get-property *ExcelApp% "Sheets") "Add") "Name" SheetName$)
     );if
   );progn
 );if
 (princ)
);defun OpenExcel
;-------------------------------------------------------------------------------
; PutCell - Put values into Excel cells
; Arguments: 2
;   StartCell$ = Starting Cell ID
;   Data@ = Value or list of values
; Syntax examples:
; (PutCell "A1" "PART NUMBER") = Puts PART NUMBER in cell A1
; (PutCell "B3" '("Dim" 7.5 "9.75")) = Starting with cell B3 put Dim, 7.5, and 9.75 across
;-------------------------------------------------------------------------------
(defun PutCell (StartCell$ Data@ / Cell$ Column# ExcelRange Row#)
 (if (= (type Data@) 'STR)
   (setq Data@ (list Data@))
 )
 (setq ExcelRange (vlax-get-property *ExcelApp% "Cells"))
 (if (Cell-p StartCell$)
   (setq Column# (car (ColumnRow StartCell$))
         Row# (cadr (ColumnRow StartCell$))
   );setq
   (if (vl-catch-all-error-p
         (setq Cell$ (vl-catch-all-apply 'vlax-get-property
           (list (vlax-get-property *ExcelApp% "ActiveSheet") "Range" StartCell$))
         );setq
       );vl-catch-all-error-p
       (alert (strcat "The cell ID \"" StartCell$ "\" is invalid."))
       (setq Column# (vlax-get-property Cell$ "Column")
             Row# (vlax-get-property Cell$ "Row")
       );setq
   );if
 );if
 (if (and Column# Row#)
   (foreach Item Data@
     (vlax-put-property ExcelRange "Item" Row# Column# (vl-princ-to-string Item))
     (setq Column# (1+ Column#))
   );foreach
 );if
 (princ)
);defun PutCell
;-------------------------------------------------------------------------------
; CloseExcel - Closes Excel spreadsheet
; Arguments: 1
;   ExcelFile$ = Excel saveas filename or nil to close without saving
; Syntax examples:
; (CloseExcel "C:\\Temp\\Temp.xls") = Saveas C:\Temp\Temp.xls and close
; (CloseExcel nil) = Close without saving
;-------------------------------------------------------------------------------
(defun CloseExcel (ExcelFile$ / Saveas)
 (if ExcelFile$
   (if (= (strcase ExcelFile$) (strcase *ExcelFile$))
     (if (findfile ExcelFile$)
       (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") "Save")
       (setq Saveas t)
     );if
     (if (findfile ExcelFile$)
       (progn
         (vl-file-delete (findfile ExcelFile$))
         (setq Saveas t)
       );progn
       (setq Saveas t)
     );if
   );if
 );if
 (if Saveas
   (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook")
     "SaveAs" ExcelFile$ -4143 "" "" :vlax-false :vlax-false nil
   );vlax-invoke-method
 );if
 (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
 (vlax-invoke-method *ExcelApp% 'Quit)
 (vlax-release-object *ExcelApp%)(gc)
 (setq *ExcelApp% nil *ExcelFile$ nil)
 (princ)
);defun CloseExcel
;-------------------------------------------------------------------------------
; ColumnRow - Returns a list of the Column and Row number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Cell$ = Cell ID
; Syntax example: (ColumnRow "ABC987") = '(731 987)
;-------------------------------------------------------------------------------
(defun ColumnRow (Cell$ / Column$ Char$ Row#)
 (setq Column$ "")
 (while (< 64 (ascii (setq Char$ (strcase (substr Cell$ 1 1)))) 91)
   (setq Column$ (strcat Column$ Char$)
         Cell$ (substr Cell$ 2)
   );setq
 );while
 (if (and (/= Column$ "") (numberp (setq Row# (read Cell$))))
   (list (Alpha2Number Column$) Row#)
   '(1 1);default to "A1" if there's a problem
 );if
);defun ColumnRow
;-------------------------------------------------------------------------------
; Alpha2Number - Converts Alpha string into Number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Str$ = String to convert
; Syntax example: (Alpha2Number "ABC") = 731
;-------------------------------------------------------------------------------
(defun Alpha2Number (Str$ / Num#)
 (if (= 0 (setq Num# (strlen Str$)))
   0
   (+ (* (- (ascii (strcase (substr Str$ 1 1))) 64) (expt 26 (1- Num#)))
      (Alpha2Number (substr Str$ 2))
   );+
 );if
);defun Alpha2Number
;-------------------------------------------------------------------------------
; Number2Alpha - Converts Number into Alpha string
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Num# = Number to convert
; Syntax example: (Number2Alpha 731) = "ABC"
;-------------------------------------------------------------------------------
(defun Number2Alpha (Num# / Val#)
 (if (< Num# 27)
   (chr (+ 64 Num#))
   (if (= 0 (setq Val# (rem Num# 26)))
     (strcat (Number2Alpha (1- (/ Num# 26))) "Z")
     (strcat (Number2Alpha (/ Num# 26)) (chr (+ 64 Val#)))
   );if
 );if
);defun Number2Alpha
;-------------------------------------------------------------------------------
; Cell-p - Evaluates if the argument Cell$ is a valid cell ID
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Cell$ = String of the cell ID to evaluate
; Syntax examples: (Cell-p "B12") = t, (Cell-p "BT") = nil
;-------------------------------------------------------------------------------
(defun Cell-p (Cell$)
 (and (= (type Cell$) 'STR)
   (or (= (strcase Cell$) "A1")
     (not (equal (ColumnRow Cell$) '(1 1)))
   );or
 );and
);defun Cell-p
;-------------------------------------------------------------------------------
; Row+n - Returns the cell ID located a number of rows from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
;   Cell$ = Starting cell ID
;   Num# = Number of rows from cell
; Syntax examples: (Row+n "B12" 3) = "B15", (Row+n "B12" -3) = "B9"
;-------------------------------------------------------------------------------
(defun Row+n (Cell$ Num#)
 (setq Cell$ (ColumnRow Cell$))
 (strcat (Number2Alpha (car Cell$)) (itoa (max 1 (+ (cadr Cell$) Num#))))
);defun Row+n
;-------------------------------------------------------------------------------
; Column+n - Returns the cell ID located a number of columns from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
;   Cell$ = Starting cell ID
;   Num# = Number of columns from cell
; Syntax examples: (Column+n "B12" 3) = "E12", (Column+n "B12" -1) = "A12"
;-------------------------------------------------------------------------------
(defun Column+n (Cell$ Num#)
 (setq Cell$ (ColumnRow Cell$))
 (strcat (Number2Alpha (max 1 (+ (car Cell$) Num#))) (itoa (cadr Cell$)))
);defun Column+n
;-------------------------------------------------------------------------------
; rtosr - Used to change a real number into a short real number string
; stripping off all trailing 0's.
; Arguments: 1
;   RealNum~ = Real number to convert to a short string real number
; Returns: ShortReal$ the short string real number value of the real number.
;-------------------------------------------------------------------------------
(defun rtosr (RealNum~ / DimZin# ShortReal$)
 (setq DimZin# (getvar "DIMZIN"))
 (setvar "DIMZIN" 8)
 (setq ShortReal$ (rtos RealNum~ 2 8))
 (setvar "DIMZIN" DimZin#)
 ShortReal$
);defun rtosr
;-------------------------------------------------------------------------------
(princ);End of GetExcel.lsp

Lien vers le commentaire
Partager sur d’autres sites

Salut Gilles,

 

en lisant ce post je repense à ton fabuleux lisp "IXL" qui me fait gagner un temps incroyable sans erreur de saisie possible sur un certain type de projet extrêmement chronophage et je me posais la question : est-ce qu'il est limité à 6 attributs dans le bloc ? Ou bien on peut augmenter le nombre ?

 

Encore merci beaucoup pour l'ensemble de tes partages.smile.gif

 

Bonne journé !

COME

 

La vie sans musique est tout simplement une erreur, une fatigue, un exil. »

Friedrich Nietzsche

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Salut a toutes et tous,

Je dois lire et écrire un fichier Excel, ce n'est pas mon habitude, je fais tout en général avec le format Excel xml 2003, (.xml)

qui est le meilleurs des 3 mondes, le pur texte, le xml, et le tableur Excel.

mais la c'est du métré Covadis, j'y peux rien c'est du Excel .xls.

Je voudrais parcourir une colonne jusqu’à la toute fin de la feuille, donc j'ai besoins de compter les lignes.

Je pense que je ne peux pas faire un "tant que pas nil", car il y a des lignes fusionnées, donc à la colonne 3 ça retourne rien.

donc d'après ce que j'ai compris de getexcel.lsp, le moment ou on lit cette valeur c'est là, avec maxRange$ = nil

(if MaxRange$
   (progn
     (setq ColumnRow@ (ColumnRow MaxRange$))
     (setq MaxColumn# (nth 0 ColumnRow@))
     (setq MaxRow# (nth 1 ColumnRow@))
   );progn
   (progn
     (setq CurRegion (vlax-get-property (vlax-get-property
       (vlax-get-property *ExcelApp% "ActiveSheet") "Range" "A1") "CurrentRegion")
     );setq
     (setq MaxRow# (vlax-get-property (vlax-get-property CurRegion "Rows") "Count"))
     (setq MaxColumn# (vlax-get-property (vlax-get-property CurRegion "Columns") "Count"))
   );progn
 );if

Dans mon cas, ça ne marche pas. Si A1 est une ligne fusionnées sur 10 colonnes j'obtiens maxRow# = 1

et MaxColumn# = 10, et si A1 est une simple celulle maxRow# = 1 et MaxColumn# = 1.

Mais peut être que je n'ai pas compris le fonctionnement ?

a+

gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

@gileParfait c'est exactement ça ! merci !

le code complet à remettre dans le contexte de getexcel :

 (setq usedrange (vlax-get-property (vlax-get-property *ExcelApp% "ActiveSheet") "UsedRange"))
  (setq rows (vlax-get-property usedrange "rows"))
  (setq MaxRow# (vlax-get-property
		       rows
		       "Count"
		     )
	)

@lecrabe Non, pas IXL, mais mes commandes Excel sont un mix entre un post "historique" de Patrick_35,

où il déroule en toute aisance les fondamentaux d'Excel pour Lisp:

https://cadxp.com/topic/26879-lisp-et-excel/?tab=comments#comment-147083

et la traduction getexcel de Gile, mentionnée dans ce post.

je fais avec les un et les autres selon mon humeur, ou ma flemme !

a+

gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

On 06/05/2019 at 23:15, (gile) said:

Je pensais avoir déjà postées ces routines sur CADxp, mais je ne les retrouve pas.

pas cette version la, il me semble.

si j'avais regardé la version que tu as posté en 2019, je n'aurais pas eu besoin de poser une question, puisque le code défectueux du getexcel original est corrigé.

mais je pensais que c'était la même ...

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

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é