CADsite forum

AutoCAD => Autolisp => Topic gestart door: WebRacer op wo 28 09 2005, 23:46:42

Titel: Excel manipulatie vanuit autocad
Bericht door: WebRacer op wo 28 09 2005, 23:46:42
hoi, in topic http://www.cadsite.be/forum/viewtopic.php?t=194 waarin Joop een schijnbaar schitterende lisp routine van David Stein laat zien, worden er vooral veel mogelijkheden meegegeven, waarmee je dus vanuit autocad excel zou moeten kunnen manipuleren.

De laatste 2 uur heb ik mij daar eens zitten in verdiepen en het een en ander uitspitten, maar ik word er helaas niet echt wijzer van, is er iemand die dit ook gedaan heeft (uitspitten en verdiepen) en die mij enige uitleg hieromtrend kan meegeven, vooral dan van hoe je al die subroutines moet gebruiken, of je ze allemaal moet doorlopen ja dan nee, en natuurlijk, hoe je ze gebruikt.

Ik ken wel een en ander van autocad, en helaas veel te weinig van excel, maar toch zie ik enkele leuke en interresante mogelijkheden om deze 2 aangenaam te koppellen...

Alvast bedankt op voorhand.
Titel: Excel manipulatie vanuit autocad
Bericht door: Dnereb op do 29 09 2005, 09:31:51
Voor dat soort handelingen leent VB(A) zich echt beter als Autocad.
vooral omdat Excel ook VB(A) ondersteunt en direct is aan te sturen

Overigens moet ik er bij zeggen dat heel vaak dingen naar Excel gestuurd worden die eigenlijk in Access thuishoren.

dit is een stukje code om in een class module te zetten:

Option Explicit

'Author B.J.G. Nieuwhof.
'info@driesign.nl


Public Enum AppState
   OpenApp = 0
   CloseApp = 1
End Enum


Function ConnectToExcel(ByRef ExcelApp As Object, Action As AppState) As Boolean

Dim DocCount As Long

Static WasOpen As Boolean       'Flag to check if acad was already open before calling this function
Static OpeningCalls As Long     'Counter to keep track of number opening calls

If Action = OpenApp Then OpeningCalls = OpeningCalls + 1

ConnectToExcel = False

If Action = OpenApp Then
   On Error Resume Next
   Set ExcelApp = GetObject(, "Excel.Application")
   If Err Then
       Err.Clear
       If OpeningCalls = 1 Then
           WasOpen = False
       End If
       Set ExcelApp = CreateObject("Excel.Application")
       If Err Then
           MsgBox "Error number: " & Err.Number & " " & Err.Description & "Occured in Function ConnectToAcad."
           Exit Function
       End If
   ElseIf OpeningCalls = 1 Then
       WasOpen = True
   End If
   On Error GoTo 0
   ConnectToExcel = True

ElseIf Not WasOpen And IsObject(ExcelApp) Then ' make sure acad is an object and not empty
   
   ExcelApp.Quit
   Set ExcelApp = Nothing
   ConnectToExcel = True
   WasOpen = False
   OpeningCalls = 0                                    'reset opening calls
End If


End Function


'Test sub to prove it works
'run this while you haven't opened Excel and it will close it again
'run this while Excel is open and it wil not close it at the end.

Sub test()

Dim ExcelInstance As Object
Dim ClsExcel As New ConnectToExcel

If ConnectToExcel(ExcelInstance, OpenApp) Then
   MsgBox "Open!"
   ExcelInstance.Visible = True         'just to show you can manipulate Excel anyways.
   If ConnectToExcel(ExcelInstance, CloseApp) Then
       MsgBox "Closed!"
   End If
End If

End Sub



Private Sub Class_Terminate()

If OpeningCalls > 0 And Not WasOpen And IsObject(ExcelApp) Then ' make sure acad is an object and not empty
   
   ExcelApp.Quit
   Set ExcelApp = Nothing
   ConnectToExcel = True
   WasOpen = False
   OpeningCalls = 0                                    'reset opening calls
End If

End Sub


En hiermee kan je het in een gewone VB(A) form/module gebruiken:

Sub TestExcel()


'Test sub to prove it works
'run this while you haven't opened Excel and it will close it again
'run this while Excel is open and it wil not close it at the end.


Dim ExcelInstance As Object
Dim ClsExcel As New ClsOpenExcel
If ClsExcel.ConnectToExcel(ExcelInstance, OpenApp) Then
   MsgBox "Open!"
   ExcelInstance.Visible = True         'just to show you can manipulate Excel anyways.
   If ClsExcel.ConnectToExcel(ExcelInstance, CloseApp) Then
       MsgBox "Closed!"
   End If
End If


End Sub



Mijn Excuus voor het Engels maar ik be gewend om in het engels te schrijven en commentaren in mijn code te zetten zodat ik  ook op engelse fora vragen kan stellen.
Titel: Excel manipulatie vanuit autocad
Bericht door: HofCAD op do 29 09 2005, 10:29:57
Citaat van: DnerebVoor dat soort handelingen leent VB(A) zich echt beter als Autocad.


----------- ~\\|//~ ------------
------------
  • -
  • -------------
    -------ooO---(_)---Ooo-------- [/color]

    Beste WebRacer,

    Soms is het maar betrekkelijk, dat VBA zich er beter voor leent
    dan AutoLISP.
    Meestal kan ik met Visual Lisp hetzelfde en veel sneller programeren
    dan met VBA.
    Misschien speelt ook wel een rol, waar je goed in bent.

    Heb je dit al gezien:
    http://www.cadsite.be/forum/viewtopic.php?t=399&highlight=hofcad

    Als ik vanavond tijd heb, zal ik kleurtjes maken in Excel.

    Groetjes HofCAD CSI
Titel: Excel manipulatie vanuit autocad
Bericht door: Dnereb op do 29 09 2005, 11:34:20
Ja, ja daar had (V)Lisp moeten staan.

Maar ik blijf erbij dat VBA zich beter leent voor Excel of andere office Apps gebruiken vanuit Acad.

een cel een kleurtje geven :ExcellApp.ActiveSheet.Cells(X,Y).Interior.colorindex = vbRed(niet getest en variable  X en Y bepalen de kolom en Rij )
Daarbij is VB(A) object georienteerd en als je de klasse gebruikt zoals ik hem gepost hebt wordt b.v. gegarandeerd de excell applicatie afgesloten zelfs als de macro onverwacht onderbroken word.
Ik ben gelukkig ' illisperate' maar ik betwijfel of dat mogelijk is in (((L)ost) ((I)n) ((S)tupid) ((P)arenteteeth))
Titel: Excel manipulatie vanuit autocad
Bericht door: WebRacer op do 29 09 2005, 16:26:18
Beste Dnereb,

Dat VBA (Verdomd Bullshit en meestal Ambetant.... in mijn ogen)
meer kan dan Lisp en/of Vlisp dat is een feit, omdat het universeler is van programeertaal.

Mag ik er u echter op wijzen dat LISP de enige taal was waar je je vroeger mee kon behelpen in autocad, en nu met Vlisp eigenlijk heel aardig kan tippen aan VBA4CAD...

In VBA weet ik echter wat te doen om naar excel te schrijven en/of lezen.

Het is mij om de uitdaging te doen om dit echter via Vlisp te doen, daar ik ook een vermoeden heb dat dit meer mogelijkheden biedt voor mijn bestaande programma's... en dat zijn er al een heel pak.

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

Ik heb, Hofcad, die excel-subroutines bekeken, maar vind echter de logica niet ...
Ik vermoed dat je eerst excel moet zoeken, laden, nieuwe sheet openen, en dan de elementen uit een lijst naar de cellen schrijven...
dus eigenlijk:

(DSX-TypeLib-Excel)
(DSX-Load-TypeLib-Excel)
(setq xlapp (DSX-Open-Excel-New "SHOW"))
(DSX-Excel-Put-RowList '("A" "B" "C") 2 1)

met die verstande dat je dsx.lsp geladen hebt met die excel-subroutines
Dit lukt echter niet bij mij, vermoedelijk omdat bij de laatste uit de rij gebruik word gemaakt van een variable 'range'...

Dus eigenlijk komt het neer op: Hoe moet ik die subroutines nu gebruiken om elementen uit een lijst naar excel te schrijven...
Titel: Excel manipulatie vanuit autocad
Bericht door: HofCAD op do 29 09 2005, 16:55:52
Citaat van: WebRacer
(DSX-TypeLib-Excel)
(DSX-Load-TypeLib-Excel)
(setq xlapp (DSX-Open-Excel-New "SHOW"))
(DSX-Excel-Put-RowList '("A" "B" "C") 2 1)




----------- ~\\|//~ ------------
------------
  • -
  • -------------
    -------ooO---(_)---Ooo-------- [/color]

    Beste WebRacer,

    Ik heb nog geen tijd gehad.

    Groetjes HofCAD CSI

    PS Probeer:

    (DSX-TypeLib-Excel)
    (DSX-Load-TypeLib-Excel)
    (setq xlapp (DSX-Open-Excel-New "SHOW"))
    (setq span   (strcat   "B5:"
                (chr
                  (+ 64 (length '("A" "B" "C")))
                )
                "20"
             )
           rang1   (vlax-get-property xlapp "Range" span)
           rang1s   (vlax-invoke-method rang1 "Select")
           rang1x   (vlax-get-property xlapp "Selection")
           rang1f   (vlax-get-property rang1x "Font")
           rang1i   (vlax-get-property rang1x "Interior")
           rang1a   (vlax-get-property rang1x "areas")
           rangE   RANG1
          )
    (DSX-Excel-Put-RowList '("A" "B" "C") 2 1)
    (foreach prop
              (list
                (list "ColorIndex" 35) ;-4105=msxl-xlAutomatic
                (list "pattern" 18 )
                (list "PatternColor" 255)
                (list "PatternColorIndex" 3)
              )
            (vlax-put-property rang1i (car prop) (cadr prop))
          )            ; foreach
    (DSX-Excel-Put-CellColor 1 5 14)
Titel: Excel manipulatie vanuit autocad
Bericht door: Dnereb op do 29 09 2005, 17:13:53
Citaat van: WebRacerBeste Dnereb,

Dat VBA (
Verdomd Bullshit en meestal Ambetant.... in mijn ogen)
meer kan dan Lisp en/of Vlisp dat is een feit, omdat het universeler is van programeertaal.

Mag ik er u echter op wijzen dat LISP de enige taal was waar je je vroeger mee kon behelpen in autocad, en nu met Vlisp eigenlijk heel aardig kan tippen aan VBA4CAD...


Ambetant???? :lol:
Als jij je thuis voelt in (V)Lisp moet je dat vooral gebruiken maar sommige dingen gaan nu eenmaal beter in bepaalde talen.
Lisp is vaak beter in selectie's maken  en manipulatie binnen Acad, terwijl VBA toch wat prettiger werkt met formulieren, Office Apps of andere taken die buiten Acad geschieden SQL Server lezen/schrijven b.v.

En eerlijk gezegd is OOP (Object Oriented Programing) of OBP (Object Based Programming) toch wat overzichtelijker als (V)Lisp en zal in de toekomst steeds normaler worden. denk maar eens aan VB.NET C.NET
Titel: Excel manipulatie vanuit autocad
Bericht door: WebRacer op do 29 09 2005, 17:55:08
tja, ik ben wel Cad-minded... en sta nog niet zo open voor VBA, op de meeste gebieden, al gebruik ik VBA ook wel hier en daar...

Met alle respect Dnereb, ik ga hier niet al mijn lisp-routines aanpassen voor enkele 'nuttigere' zaakjes... dat is pas onbegonnen werk...
Titel: Excel manipulatie vanuit autocad
Bericht door: Dnereb op do 29 09 2005, 19:54:14
Als je nog even wacht wordt het VBA.net VB en VBA worden inmiddels al uitgefaseerd. O tip lees eens wat achterstevoren :wink:
Titel: Excel manipulatie vanuit autocad
Bericht door: WebRacer op do 29 09 2005, 21:14:24
Nog eens paar uur naar staan gapen, ik zie het niet, misschien zie ik niet goed meer, volgens mij ontbreekt er een stukje uitleg bij die subroutines, ofwel komen de variabelen onderling niet overeen, ofwel kan ik het gewoon niet... het ziet er nogthans simpel en leuk uit...
Titel: Excel manipulatie vanuit autocad
Bericht door: HofCAD op vr 30 09 2005, 08:35:33
Citaat van: WebRacerNog eens paar uur naar staan gapen, ik zie het niet, misschien zie ik niet goed meer, volgens mij ontbreekt er een stukje uitleg bij die subroutines, ofwel komen de variabelen onderling niet overeen, ofwel kan ik het gewoon niet... het ziet er nogthans simpel en leuk uit...


----------- ~\\|//~ ------------
------------
  • -
  • -------------
    -------ooO---(_)---Ooo-------- [/color]

    Beste WebRacer

    Nog geen tijd gehad.

    Groetjes HofCAD CSI
Titel: Excel manipulatie vanuit autocad
Bericht door: HofCAD op vr 30 09 2005, 08:35:33
Citaat van: WebRacerNog eens paar uur naar staan gapen, ik zie het niet, misschien zie ik niet goed meer, volgens mij ontbreekt er een stukje uitleg bij die subroutines, ofwel komen de variabelen onderling niet overeen, ofwel kan ik het gewoon niet... het ziet er nogthans simpel en leuk uit...


----------- ~\\|//~ ------------
------------
  • -
  • -------------
    -------ooO---(_)---Ooo-------- [/color]

    Beste WebRacer


    Heb je wel:

    (defun dsx-princ(s)
    (princ s))


    aangemaakt?

    Lukt het dan met het onderstaande ook niet.

    (DSX-TypeLib-Excel)
    (DSX-Load-TypeLib-Excel)
    (setq xlapp (DSX-Open-Excel-New "SHOW"))
    (setq span (strcat "B5:"
    (chr
    (+ 64 (length '("A" "B" "C")))
    )
    "20"
    )
    rang1 (vlax-get-property xlapp "Range" span)
    rang1s (vlax-invoke-method rang1 "Select")
    rang1x (vlax-get-property xlapp "Selection")
    rang1f (vlax-get-property rang1x "Font")
    rang1i (vlax-get-property rang1x "Interior")
    rang1a (vlax-get-property rang1x "areas")
    rangE RANG1
    )
    (DSX-Excel-Put-RowList '("A" "B" "C") 2 1)
    (foreach prop
    (list
    (list "ColorIndex" 35) ;-4105=msxl-xlAutomatic
    (list "pattern" 18 )
    (list "PatternColor" 255)
    (list "PatternColorIndex" 3)
    )
    (vlax-put-property rang1i (car prop) (cadr prop))
    ) ; foreach
    (DSX-Excel-Put-CellColor 1 5 14)


    Je moet de applicatie Excel op dezelfde manier beschouwen en
    onderzoeken als AutoCAD.


    (setq AutoCAD (vlax-get-acad-object))
    (vlax-dump-object AutoCAD T)
    (setq Pref (vla-get-Preferences AutoCAD))
    (vlax-dump-object Pref T)
    (setq Screen (vla-get-Display Pref))
    (vlax-dump-object Screen T)
    (setq Doc (vla-get-ActiveDocument AutoCAD))
    (vlax-dump-object Doc T)


    (setq dmsx (vlax-dump-object xlapp T))
    (setq wbs (vlax-get-property xlapp 'Workbooks))
    (vlax-dump-object wbs T)
    (setq awb (vlax-get-property xlapp "ActiveWorkbook"))
    (vlax-dump-object awb T)
    (setq aws (vlax-get-property xlapp "ActiveSheet"))
    (vlax-dump-object aws T)


    De bibliotheek bevat inderdaad relatieve verwijzingen na de range vlaobjecten.
    Waarom de celverwijzing in de bibliotheek relatief t.o.v. de range
    genomen is, daar is het nut bij mij nog niet gebleken.

    Groetjes HofCAD CSI
Titel: Excel manipulatie vanuit autocad
Bericht door: HofCAD op vr 30 09 2005, 14:28:35
Citaat van: WebRacerIk heb een lijst, X_lst genaamt een variabele met een volledige lijst in van lijsten bv: (("1" "2" "3")("4" "5" "6")("7" "8" "9"))
ik wil met de dsx subroutines die lijst in cellen A1->C1 en tot A3 -> C3 ingevuld zien,


----------- ~\\|//~ ------------
------------
  • -
  • -------------
    -------ooO---(_)---Ooo-------- [/color]

    Beste WebRacer

    Bedoel je zoiets als onderstaand?

    Groetjes HofCAD CSI


    (defun c:exceltest()
    (setvar "CMDECHO" 0)
    (defun dsx-princ(s)
    (if (/= DEBUG nil)
    (princ s))
    )
    (DSX-TypeLib-Excel)
    (DSX-Load-TypeLib-Excel)
    (setq xlapp (DSX-Open-Excel-New "SHOW"))
    (setq span (strcat "E1:" (chr (+ 64 (length '("A" "B" "C" "D" "E")))) "4")
    range (vlax-get-property xlapp "Range" span)
    )
    (DSX-Excel-Put-RowList '("E1" "F1" "G1") 1 1)
    (DSX-Excel-Put-RowList '("E2" "F2" "G2") 2 1)
    (DSX-Excel-Put-RowList '("H3" "I3" "J3") 3 4)
    (setq span (strcat "A1:" (chr (+ 64 (length '("A")))) "1")
    range (vlax-get-property xlapp "Range" span)
    )
    (setq X_lst '(("1" "2" "3")("4" "5" "6")("7" "8" "9")))
    (setq i 0)
    (repeat  3
    (DSX-Excel-Put-RowList (nth i x_lst) (+ i 1) 1)
    (setq i(1+ i))
    )
    (princ "\n In Excel gelezen:\n")
    (princ (DSX-Excel-GetRangeValues-ByRows 1 1 3 3))
    (setq span (strcat "B5:"
    (chr (+ 64 (length '("A" "B" "C"))))"20" )
    rang1 (vlax-get-property xlapp "Range" span)
    rang1s (vlax-invoke-method rang1 "Select")
    rang1x (vlax-get-property xlapp "Selection")
    rang1f (vlax-get-property rang1x "Font")
    rang1i (vlax-get-property rang1x "Interior")
    rang1a (vlax-get-property rang1x "areas")
    range rang1
    )
    (foreach prop
    (list
    (list "ColorIndex" 35)
    (list "pattern" 18 )
    (list "PatternColor" 255)
    (list "PatternColorIndex" 3)
    )
    (vlax-put-property rang1i (car prop) (cadr prop))
    ) ; foreach
    (setq i 1)
    (repeat 16
    (DSX-Excel-Put-CellColor (+ 4 i) 5 i)
    (setq i (1+ i))
    )
    (setq span (strcat "A23:" (chr (+ 64 (length '("A")))) "23")
    range (vlax-get-property xlapp "Range" span)
    )
    (textscr)
    (DSX-Excel-Put-RowCellsColor 23 1 3 3)
    (DSX-Excel-Put-RowList '("HofCAD" "CSI" "Tilburg") 1 1)
    (setvar "CMDECHO" 1)
    (princ "\n Bovenstaand is in Excel gelezen:\n")
    (princ)
    )
Titel: Excel manipulatie vanuit autocad
Bericht door: WebRacer op vr 30 09 2005, 16:00:01
bij het onderstaande stopt het programma Hofcad....
zet je animate eens aan...

(DSX-Excel-Get-Cell range startrow startcol)
Titel: Excel manipulatie vanuit autocad
Bericht door: WebRacer op vr 30 09 2005, 16:02:26
hier klopt iets niet vermoed ik...
die range, dat is waar hij blijft op afknappen, klopt dit wel hofcad?

(DSX-Excel-Put-RowList '("E1" "F1" "G1") 1 1)
(DSX-Excel-Put-RowList '("E2" "F2" "G2") 2 1)
(DSX-Excel-Put-RowList '("H3" "I3" "J3") 3 4)
Titel: Excel manipulatie vanuit autocad
Bericht door: WebRacer op vr 30 09 2005, 16:12:13
Mss eens eenvoudig beginnen HofCAD,

ik wil de lijst:  (setq Y_list '("125465.235" "456987.852" "954256.357"))
vanuit autocad in een excel blad plaatsen met als naam : Y_list.xls

en in dat blad komt in vak A1-> eerste element uit lijst, A2 tweede element, enz...

met behulp van de excel-manipulatie dsx-routines..
hoe doe je dat in godsnaam...

vandaar kunnen we dan vertrekken om verder te bouwen, want
uw routine is al redelijk ingewikkeld...
bv:
rang1 (vlax-get-property xlapp "Range" span)
rang1s (vlax-invoke-method rang1 "Select")
rang1x (vlax-get-property xlapp "Selection")
rang1f (vlax-get-property rang1x "Font")
rang1i (vlax-get-property rang1x "Interior")
rang1a (vlax-get-property rang1x "areas")

heb ik dat hiervoor nodig?

btw, uw exceltest... loopt bij mij niet... (ter info -> acad 2006)
Titel: Excel manipulatie vanuit autocad
Bericht door: HofCAD op vr 30 09 2005, 16:16:10
Beste WebRacer,

Hier snap ik geen biet van, want bij mij loopt mijn programma goed.
Ik ben er zelfs ervoor helemaal uit AutoCAD gegaan, om het te testen.

Groetjes HofCAD CSI

(vl-load-com)

;;;*************************************************************************
;;; MODULE: DSX-TypeLib-Excel
;;; DESCRIPTION: Returns typelib (olb) file for either Excel 97, 2000, or XP
;;; ARGS: none
;;; EXAMPLE: (DSX-TypeLib-Excel)
;;;*************************************************************************

(defun DSX-TypeLib-Excel ( / sysdrv tlb)
(setq sysdrv (getenv "systemdrive"))
(cond
( (setq tlb (findfile (strcat sysdrv "\\Program Files\\Microsoft Office\\Office\\Excel8.olb")))
tlb
)
( (setq tlb (findfile (strcat sysdrv "\\Program Files\\Microsoft Office\\Office\\Excel9.olb")))
tlb
)
( (setq tlb (findfile (strcat sysdrv "\\Program Files\\Microsoft Office\\Office\\Excel10.olb")))
tlb
)
( (setq tlb (findfile (strcat sysdrv "\\Program Files\\Microsoft Office\\Office\\Excel.exe")))
tlb
)
( (setq tlb (findfile (strcat sysdrv "\\Program Files\\Microsoft Office\\Office10\\Excel.exe")))
tlb
)
)
)

;;;*************************************************************************
;;; MODULE: DSX-Load-TypeLib-Excel
;;; DESCRIPTION: Loads typelib for Excel 97, 2000 or XP (whichever is found)
;;; ARGS: none
;;; EXAMPLE: (DSX-Load-TypeLib-Excel)
;;;*************************************************************************

(defun DSX-Load-TypeLib-Excel ( / tlbfile tlbver out)
(dsx-princ "\n(DSX-Load-TypeLib-Excel)")
(cond
( (null msxl-xl24HourClock)
(if (setq tlbfile (DSX-TypeLib-Excel))
(progn
(setq tlbver (substr (vl-filename-base tlbfile) 6))
(cond
( (= tlbver "9") (princ "\nInitializing Microsoft Excel 2000...") )
( (= tlbver "8") (princ "\nInitializing Microsoft Excel 97...") )
( (= (vl-filename-base tlbfile) "Excel.exe")
(princ "\nInitializing Microsoft Excel XP...")
)
)
(vlax-import-type-library
:tlb-filename tlbfile
:methods-prefix "msxl-"
:properties-prefix "msxl-"
:constants-prefix "msxl-"
)
(if msxl-xl24HourClock (setq out T))
)
)
)
( T (setq out T) )
)
out
)

;;;*************************************************************************
;;; MODULE: DSX-Open-Excel-New
;;; DESCRIPTION: Opens a new session of Excel 97, 2000 or XP
;;; ARGS: display-mode ("SHOW" or "HIDE")
;;; EXAMPLE: (setq xlapp (DSX-Open-Excel-New "SHOW"))
;;;*************************************************************************

(defun DSX-Open-Excel-New (dmode / appsession)
(dsx-princ "\n(DSX-Open-Excel-New)")
(princ "\nCreating new Excel Spreadsheet file...")
(cond
( (setq appsession (vlax-create-object "Excel.Application"))

(vlax-invoke-method
(vlax-get-property appsession 'WorkBooks)
'Add
)
(if (= (strcase dmode) "SHOW")
(vla-put-visible appsession 1)
(vla-put-visible appsession 0)
)
)
)
appsession
)

;;;*************************************************************************
;;; MODULE: DSX-Open-Excel-Exist
;;; DESCRIPTION: Gets handle to existing (running) session of Excel 97, 2000, XP
;;; ARGS: xls-filename, display-mode ("SHOW" or "HIDE")
;;; EXAMPLE: (setq xlapp (DSX-Open-Excel-Exist "myfile.xls" "SHOW"))
;;;*************************************************************************

(defun DSX-Open-Excel-Exist (xfile dmode / appsession)
(dsx-princ "\n(DSX-Open-Excel-Exist)")
(princ "\nOpening Excel Spreadsheet file...")
(cond
((setq fn (findfile xfile))
(cond
((setq appsession (vlax-get-or-create-object "Excel.Application"))
(vlax-invoke-method
(vlax-get-property appsession 'WorkBooks)
'Open
fn
)
(if (= (strcase dmode) "SHOW")
(vla-put-visible appsession 1)
(vla-put-visible appsession 0)
)
)
)
)
(T (alert (strcat "\nCannot locate source file: " xfile)))
)
appsession
)


;;;*************************************************************************
;;; MODULE: DSX-Excel-Put-ColumnList
;;; DESCRIPTION: Write each list member to a column (startcol) starting at row (startrow)
;;; ARGS: list, startrow, startcol
;;; EXAMPLE: (DSX-Excel-Put-ColumnList '("A" "B" "C") 1 2) puts members into cells (1,B) (2,B) (3,B) respectively
;;;*************************************************************************

(defun DSX-Excel-Put-ColumnList (lst startrow startcol)
(dsx-princ "\n(DSX-Excel-Put-ColumnList)")
(foreach itm lst
(msxl-put-value
(DSX-Excel-Get-Cell range startrow startcol)
itm
)
(setq startrow (1+ startrow))
); repeat
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Put-RowList
;;; DESCRIPTION: Write each list member to row (startrow) starting at column (startcol)
;;; ARGS: list, startrow, startcol
;;; EXAMPLE: (DSX-Excel-Put-RowList '("A" "B" "C") 2 1) puts members into cells (1,B) (1,C) (1,D) respectively
;;;*************************************************************************

(defun DSX-Excel-Put-RowList (lst startrow startcol)
(dsx-princ "\n(DSX-Excel-Put-RowList)")
(foreach itm lst
(msxl-put-value
(DSX-Excel-Get-Cell range startrow startcol)
itm
)
(setq startcol (1+ startcol))
); repeat
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Put-CellColor
;;; DESCRIPTION: Applies fill-color to specified cell
;;; ARGS: row, column, color (integer)
;;; EXAMPLE: (DSX-Excel-Put-CellColor 1 1 14) apply color #14 to cell (1,A)
;;;*************************************************************************

(defun DSX-Excel-Put-CellColor (row col intcol / rng)
(setq rng (DSX-Excel-Get-Cell (msxl-get-ActiveSheet xlapp) row col))
(msxl-put-colorindex (msxl-get-interior rng) intcol)
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Put-RowCellsColor
;;; DESCRIPTION: Applies fill-color to a row of cells
;;; ARGS: startrow, startcol, num-cols, color (integer)
;;; EXAMPLE: (DSX-Excel-Put-RowCellsColor 1 1 5 14) Start at row=1 col=1 repeat for 5 columns using color #14
;;;*************************************************************************

(defun DSX-Excel-Put-RowCellsColor
(startrow startcol cols intcol / next)
(dsx-princ "\n(DSX-Excel-Put-RowCellsColor)")

(setq next startcol)
(repeat cols
(DSX-Excel-Put-CellColor startrow next intcol)
(setq next (1+ next))
)
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Put-ColumnCellsColor
;;; DESCRIPTION: Change fill color in a column of cells
;;; ARGS: startrow, startcol, num-rows, color (integer)
;;; EXAMPLE: (DSX-Excel-Put-ColumnCellsColor 1 1 5 14) Start at row=1 col=1 repeat for 5 rows using color #14
;;;*************************************************************************

(defun DSX-Excel-Put-ColumnCellsColor
(startrow startcol rows intcol / next)
(dsx-princ "\n(DSX-Excel-Put-ColumnCellsColor)")

(setq next startrow)
(repeat rows
(DSX-Excel-Put-CellColor next startcol intcol)
(setq next (1+ next))
)
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Get-Cell
;;; DESCRIPTION: Get cell object relative to range using (relrow) and (relcol) offsets
;;; ARGS: range-object, relative-row, relative-col
;;; EXAMPLE: (DSX-Excel-Get-Cell rng1 2 2)
;;;*************************************************************************

(defun DSX-Excel-Get-Cell (rng relrow relcol)
(dsx-princ "\n(DSX-Excel-Get-Cell)")
(vlax-variant-value
(msxl-get-item (msxl-get-cells rng)
(vlax-make-variant relrow)
(vlax-make-variant relcol)
)
)
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Get-CellValue
;;; DESCRIPTION: Return value in given cell (row, column) of active session object (xlapp)
;;; ARGS: row(int), column(int)
;;; EXAMPLE: (DSX-Excel-Get-CellValue 1 2)
;;;*************************************************************************

(defun DSX-Excel-Get-CellValue (row col)
(dsx-princ "\n(DSX-Excel-Get-CellValue)")

(vlax-variant-value
(msxl-get-value
(DSX-Excel-Get-Cell
(msxl-get-ActiveSheet xlapp)
row col
)
)
)
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Get-RowValues
;;; DESCRIPTION: Returns a list of cell values within a given row
;;; ARGS: row-number(int), startcol, num-cells
;;; EXAMPLE: (DSX-Excel-Get-RowValues 3 1 20) get first 20 values in row 3
;;;*************************************************************************

(defun DSX-Excel-Get-RowValues
(row startcol numcells / next out)
(dsx-princ "\n(DSX-Excel-Get-RowValues)")

(setq next startcol)
(repeat numcells
(setq out (if out
(append out (list (DSX-Excel-Get-CellValue row next))); row x col
(list (DSX-Excel-Get-CellValue row next)); row x col
)
next (1+ next)
)
); repeat
out
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Get-ColumnValues
;;; DESCRIPTION: Returns a list of cell values within a given column
;;; ARGS: column-number(int), startrow, num-cells
;;; EXAMPLE: (DSX-Excel-Get-ColumnValues 2 1 20) get top-20 entries in column 2 ("B")
;;;*************************************************************************

(defun DSX-Excel-Get-ColumnValues
(col startrow numcells / next out)
(dsx-princ "\n(DSX-Excel-Get-ColumnValues)")

(setq next startrow)
(repeat numcells
(setq out
(if out
(append out (list (DSX-Excel-Get-CellValue next col)))
(list (DSX-Excel-Get-CellValue next col))
)
next (1+ next)
)
); repeat
out
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-GetRangeValues-ByRows
;;; DESCRIPTION: Get range values in row order and return as nested lists
;;; ARGS: startrow, startcol, num-rows, num-cols
;;; EXAMPLE: (DSX-Excel-GetRangeValues-ByRows 1 1 3 3) get range values from 1A to 5J where each sublist is one row
;;;*************************************************************************

(defun DSX-Excel-GetRangeValues-ByRows
(startrow startcol numrows numcols / nextrow rowlst outlst)
(dsx-princ "\n(DSX-Excel-GetRangeValues-ByRows)")
(setq nextrow startrow)
(repeat numrows
(setq rowlst (DSX-Excel-Get-RowValues nextrow startcol numcols)
outlst (if outlst (append outlst (list rowlst)) (list rowlst))
nextrow (1+ nextrow)
)
)
outlst
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-GetRangeValues-ByCols
;;; DESCRIPTION: Get range values in column order and return as nested lists
;;; ARGS: startrow, startcol, num-rows, num-cols
;;; EXAMPLE: (DSX-Excel-GetRangeValues-ByCols 1 1 3 3) get range values from 1A to 5J where each sublist is one column
;;;*************************************************************************

(defun DSX-Excel-GetRangeValues-ByCols
(startrow startcol numrows numcols / nextrow nextcol collst outlst)
(dsx-princ "\n(DSX-Excel-GetRangeValues-ByCols)")
(setq nextcol startcol)
(repeat numcols
(setq collst (DSX-Excel-Get-ColumnValues nextcol startrow numrows)
outlst (if outlst (append outlst (list collst)) (list collst))
nextcol (1+ nextcol)
)
)
outlst
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Get-ActiveWorkSheet
;;; DESCRIPTION: Returns object of active worksheet in active Excel session
;;; ARGS: app (session object)
;;; EXAMPLE: (DSX-Excel-Get-ActiveWorkSheet xlapp)
;;;*************************************************************************

(defun DSX-Excel-Get-ActiveWorkSheet (xlapp)
(dsx-princ "\n(DSX-Excel-Get-ActiveWorkSheet)")
(msxl-get-ActiveSheet xlapp)
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-RangeAutoFit
;;; DESCRIPTION: Applies Auto-Fit to columns within active range
;;; ARGS: active-sheet (object)
;;; EXAMPLE: (DSX-Excel-RangeAutoFit myxlws)
;;;*************************************************************************

(defun DSX-Excel-RangeAutoFit (active-sheet)
(dsx-princ "\n(DSX-Excel-RangeAutoFit)")
(vlax-invoke-method
(vlax-get-property
(vlax-get-property
(vlax-get-property active-sheet 'UsedRange)
'Cells
)
'Columns
)
'AutoFit
)
)

(defun DSX-Excel-RangeDataFormat (active-sheet)
(dsx-princ "\n(DSX-Excel-RangeDataFormat)")
(vlax-put-property
(vlax-get-property active-sheet "Cells")
'NumberFormat "@"
)
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Quit
;;; DESCRIPTION: Quit and close Excel session (app)
;;; ARGS: app (session object)
;;; EXAMPLE: (DSX-Excel-Quit xlapp)
;;;*************************************************************************

(defun DSX-Excel-Quit (appsession)
(dsx-princ "\n(DSX-Excel-Quit)")
(cond
( (not (vlax-object-released-p appsession))
(vlax-invoke-method appsession 'QUIT)
(vlax-release-object appsession)
)
)
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Kill
;;; DESCRIPTION: Forces any open Excel sessions to be closed
;;; ARGS: none
;;; EXAMPLE: (DSX-Excel-Kill)
;;;*************************************************************************

(defun DSX-Excel-Kill ( / eo)
(while (setq eo (vlax-get-object "Excel.Application"))
(DSX-Excel-Quit eo)
(vlax-release-object eo)
(setq eo nil)
(gc)(gc);; even this doesn't always kill the damn thing!
)
)

;;;*************************************************************************
;;; MODULE:
;;; DESCRIPTION:
;;; ARGS:
;;; EXAMPLE:
;;;*************************************************************************
;;; Remove trailing 'nil' members from a given list

(defun DSX-TrimList (lst)
(cond
( (/= nil (last lst)) lst)
( T
(DSX-TrimList (reverse (cdr (reverse lst))))
)
)
)

;;;*************************************************************************
;;; MODULE:
;;; DESCRIPTION:
;;; ARGS:
;;; EXAMPLE:
;;;*************************************************************************
;;; Convert a list of values into a list of string equivalents

(defun DSX-ListStr (lst / mbr out)
(setq out '())
(foreach mbr lst
(cond
( (= mbr nil) (setq out (cons "" out)) )
( (= (type mbr) 'STR)
(if (member mbr '(" " " " " "))
(setq out (cons "" out))
(setq out (cons mbr out))
)
)
( (= (type mbr) 'INT) (setq out (cons (itoa mbr) out)) )
( (= (type mbr) 'REAL)(setq out (cons (rtos mbr 2 6) out)))
)
)
(reverse out)
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-Sheets
;;; DESCRIPTION: Returns SHEETS collection from active workbook
;;; ARGS: Excel-application
;;; EXAMPLE: (setq sheets (DSX-Excel-Sheets xlApp))
;;;*************************************************************************

(defun DSX-Excel-Sheets (xlapp)
(setq xlsheets (vlax-get-property xlapp "sheets"))
)

;;;*************************************************************************
;;; MODULE:DSX-Excel-SheetDelete
;;; DESCRIPTION: Delete sheet (tab) from active workbook sheets collection
;;; ARG: sheet-name, sheets-collection
;;; EXAMPLE: (DSX-Excel-SheetDelete "Sheet3" xlSheets)
;;;*************************************************************************

(defun DSX-Excel-SheetDelete (name xlsheets)
(vlax-for sh xlsheets
(if (= (vlax-get-property sh "Name") name)
(vlax-invoke-method sh "Delete")
)
)
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-SheetAdd
;;; DESCRIPTION: Add new sheet (tab) to sheets collection in workbook, returns sheet object
;;; ARG: sheet-name, sheets-collection
;;; EXAMPLE: (setq newsheet (DSX-Excel-SheetAdd "SheetX" xlSheets))
;;;*************************************************************************

(defun DSX-Excel-SheetAdd (name xlsheets)
(setq newsheet (vlax-invoke-method xlsheets "Add"))
(vlax-put-property newsheet "Name" name)
newsheet
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-WorkbookSave
;;; DESCRIPTION: Saves active workbook to specified filename, if file exists, it is overwritten if user accepts prompt
;;; ARG: workbook-object, filename
;;; EXAMPLE: (DSX-Excel-WorkbookSave objWB "myfile.xls")
;;;*************************************************************************

(defun DSX-Excel-WorkbookSave (workbook filename)
(if (findfile filename)
(vlax-invoke-method awb "Save")
(vlax-invoke-method awb "SaveAs"
filename msxl-xlNormal "" ""
:vlax-False :vlax-False nil
)
)
)

;;;*************************************************************************
;;; MODULE: DSX-Excel-ActiveWorkbook
;;; DESCRIPTION: Returns active workbook object from given Excel application session
;;; ARG: Excel-application
;;; EXAMPLE: (setq objWB (DSX-Excel-ActiveWorkbook xlApp))
;;;*************************************************************************

(defun DSX-Excel-ActiveWorkbook (xlapp)
(vlax-get-property xlapp "ActiveWorkbook")
)

(defun c:TestExcel2000()
(setvar "CMDECHO" 0)
(defun dsx-princ(s)
(if (/= DEBUG nil)
(princ s))
)
(DSX-TypeLib-Excel)
(DSX-Load-TypeLib-Excel)
(setq xlapp (DSX-Open-Excel-New "SHOW"))
(setq span (strcat "E1:" (chr (+ 64 (length '("A" "B" "C" "D" "E")))) "4")
range (vlax-get-property xlapp "Range" span)
)
(DSX-Excel-Put-RowList '("E1" "F1" "G1") 1 1)
(DSX-Excel-Put-RowList '("E2" "F2" "G2") 2 1)
(DSX-Excel-Put-RowList '("H3" "I3" "J3") 3 4)
(setq span (strcat "A1:" (chr (+ 64 (length '("A")))) "1")
range (vlax-get-property xlapp "Range" span)
)
(setq X_lst '(("1" "2" "3")("4" "5" "6")("7" "8" "9")))
(setq i 0)
(repeat 3
(DSX-Excel-Put-RowList (nth i x_lst) (+ i 1) 1)
(setq i(1+ i))
)
(princ "\n In Excel gelezen:\n")
(princ (DSX-Excel-GetRangeValues-ByRows 1 1 3 3))
(setq span (strcat "B5:"
(chr (+ 64 (length '("A" "B" "C"))))"20" )
rang1 (vlax-get-property xlapp "Range" span)
rang1s (vlax-invoke-method rang1 "Select")
rang1x (vlax-get-property xlapp "Selection")
rang1f (vlax-get-property rang1x "Font")
rang1i (vlax-get-property rang1x "Interior")
rang1a (vlax-get-property rang1x "areas")
range rang1
)
(foreach prop
(list
(list "ColorIndex" 35)
(list "pattern" 18 )
(list "PatternColor" 255)
(list "PatternColorIndex" 3)
)
(vlax-put-property rang1i (car prop) (cadr prop))
) ; foreach
(setq i 1)
(repeat 16
(DSX-Excel-Put-CellColor (+ 4 i) 5 i)
(setq i (1+ i))
)
(setq span (strcat "A23:" (chr (+ 64 (length '("A")))) "23")
range (vlax-get-property xlapp "Range" span)
)
(textscr)
(DSX-Excel-Put-RowCellsColor 23 1 3 3)
(DSX-Excel-Put-RowList '("HofCAD" "CSI" "Tilburg") 1 1)
(setvar "CMDECHO" 1)
(princ "\n Bovenstaand is in Excel gelezen:\n")
(princ)
)

PS Om een of andere domme reden moet je bij Excel 2007
msxl-put-value vervangen door msxl-put-value2.
Titel: Excel manipulatie vanuit autocad
Bericht door: WebRacer op vr 30 09 2005, 16:22:28
open excel, maar plaatst niets in het blad!!!
volledig autocad herstart en uw voorgaande data gebruikt...
Titel: Excel manipulatie vanuit autocad
Bericht door: WebRacer op vr 30 09 2005, 16:26:07
(msxl-put-value
    (DSX-Excel-Get-Cell range startrow startcol)
    itm
     )


hier spot ie ->> (DSX-Excel-Get-Cell range startrow startcol)
Titel: Excel manipulatie vanuit autocad
Bericht door: HofCAD op vr 30 09 2005, 16:29:19
Citaat van: WebRacer
btw, uw exceltest... loopt bij mij niet... (ter info -> acad 2006)

----------- ~\\|//~ ------------
------------
  • -
  • -------------
    -------ooO---(_)---Ooo-------- [/color]
    Beste WebRacer,

    Als de bibloitheek geladen is, en er een koppeling is.
    Dan gaat dit bij mij als volgt om de lijst
    (setq X_lst '(("1" "2" "3")("4" "5" "6")("7" "8" "9")))
    in A1>C1, A2>C2 en A3>C3 te krijgen en later te lezen.


    (vl-load-com)
    (defun dsx-princ(s)
    (if (/= DEBUG nil)
    (princ s))
    )
    (DSX-TypeLib-Excel)
    (DSX-Load-TypeLib-Excel)
    (setq xlapp (DSX-Open-Excel-New "SHOW"))
    (setq span (strcat "A1:" (chr (+ 64 (length '("A")))) "1")
    range (vlax-get-property xlapp "Range" span)
    )
    (setq X_lst '(("1" "2" "3")("4" "5" "6")("7" "8" "9")))
    (setq i 0)
    (repeat 3
    (DSX-Excel-Put-RowList (nth i x_lst) (+ i 1) 1)
    (setq i(1+ i))
    )
    (princ "\n In Excel gelezen:\n")
    (princ (DSX-Excel-GetRangeValues-ByRows 1 1 3 3))


    Dit
    rang1s (vlax-invoke-method rang1 "Select")
    rang1x (vlax-get-property xlapp "Selection")
    rang1f (vlax-get-property rang1x "Font")
    rang1i (vlax-get-property rang1x "Interior")
    rang1a (vlax-get-property rang1x "areas")

    heb je inderdaad niet nodig, als je niets aan het uiterlijk wilt veranderen.

    Ik ga vanavond thuis Execeltest eens uittesten, want hier op het werk
    doet het programma het goed.

    Groetjes HofCAD CSI

    PS Krijg je wel bij:
    (setq xlapp (DSX-Open-Excel-New "SHOW"))
    Excel te zien.
Titel: Excel manipulatie vanuit autocad
Bericht door: WebRacer op vr 30 09 2005, 16:45:04
ik krijg excel te zien, alles is geladen, het plaatst enkel de lijst NIET in excel..., waarom, het mag mij een worst wezen? mss omdat excel het niet wil? ik moest wel deze toevoegen aan (DSX-TypeLib-Excel):

((setq tlb (findfile (strcat sysdrv "\\Program Files\\Microsoft office\\Office11\\Excel.exe"))) tlb)
Titel: Excel manipulatie vanuit autocad
Bericht door: HofCAD op vr 30 09 2005, 16:53:37
Citaat van: WebRacerik krijg excel te zien, alles is geladen, het plaatst enkel de lijst NIET in excel..., waarom, het mag mij een worst wezen? mss omdat excel het niet wil? ik moest wel deze toevoegen aan (DSX-TypeLib-Excel):

((setq tlb (findfile (strcat sysdrv "\\Program Files\\Microsoft office\\Office11\\Excel.exe"))) tlb)

Best WebRacer,

Daar ligt het volgens mij aan.

Groetjes HofCAD CSI

PS Ik ga van het weekend genieten.
Titel: Re: Excel manipulatie vanuit autocad
Bericht door: derockere op di 27 03 2018, 13:04:01
Hoi,

Hebben jullie http://www.cadsite.be/forum/viewtopic.php?t=194 al eens geprobeerd?
Voor de rest is jullie discussie wel interessant hoor!
Groetjes