Hallo Forum
Situation:
Ich habe für meinen Betrieb ein LISP geschrieben, welches Informationen aus AutoCAD und einer Excel nimmt, sie verarbeitet und sie anschliessend zusammengefasst in einen Block und ebenfalls auch wider in die Excel schreibt.
Für das Lesen der Excel habe ich mich an den Funktionen von GetExcel.lsp (https://autolisp-exchange.com) von Terry Miller und Gilles Chanteau bedient und diese leicht an unsere Bedürfnisse angepasst.
Diese liest, bist zur letzten Zeile mit Inhalt, alle Zeilen durch und erstellt daraus eine verschachtelte Liste mit den Zelleninhalten.
So weit so gut, so weit so Funktional.
Problem:
Solange die Excel nicht sehr lange ist (unter 100 Zeilen), wird die Liste innerhalb von einigen wenigen Sekunden erstellt.
Wird die Excel nun aber länger (die Excel's können an die Tausend Zeilen lang sein), dann dauert das erstellen der Liste bis zu zwei Minuten.
Frage:
Auch wenn dies "Theoretisch" nur ein Schönheitsfehler ist, kann man das Lesen der Excel und/oder das Schreiben der Liste beschleunigen?
Code:
Hier noch den Schnipsel, der bei mir die Excel liest und die Liste schreibt:
Code:
(defun GetExData ( / CurRegion MaxRow MaxColumn Row Data Column ExValue )
(if ExSheet
(vlax-for Worksheet (vlax-get-property ExApp "Sheets")
(if
(= (vlax-get-property Worksheet "Name") ExSheet)
(vlax-invoke-method Worksheet "Activate")
);end if
);end vlax-for
);end if
(setq CurRegion
(vlax-get-property
(vlax-get-property
(vlax-get-property ExApp "ActiveSheet")
"Range"
"A1"
);end vlax-get-property
"CurrentRegion"
);end vlax-get-property
);end setq
(setq MaxRow (vlax-get-property (vlax-get-property CurRegion "Rows") "Count"))
(setq MaxColumn (vlax-get-property (vlax-get-property CurRegion "Columns") "Count"))
(setq Row 1)
(repeat MaxRow
(setq Data nil)
(setq Column 1)
(repeat MaxColumn
(setq ExValue
(vlax-variant-value
(vlax-get-property
(vlax-get-property
ExApp
"Range"
(strcat (Number2Alpha Column)(itoa Row))
);end vlax-get-property
'Value
);end vlax-get-property
);end vlax-variant-value
);end setq
(setq ExValue
(cond
((= (type ExValue) 'INT)(itoa ExValue))
((= (type ExValue) 'REAL)(rtosr ExValue))
((= (type ExValue) 'STR)(vl-string-trim " " ExValue))
((/= (type ExValue) 'STR) "")
);end cond
);end setq
(setq Data (append Data (list ExValue)))
(setq Column (1+ Column))
);end repeat
(setq ExData (append ExData (list Data)))
(setq Row (1+ Row))
);end repeat
);end defun (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)))
);end if
);end if
);end defun
(defun rtosr (RealNum / DimZin ShortReal)
(setq DimZin (getvar "DIMZIN"))
(setvar "DIMZIN" 8)
(setq ShortReal (rtos RealNum 2 8))
(setvar "DIMZIN" DimZin)
ShortReal
);end defun
Tipps oder Lösungen natürlich immer gern gesehen.
Besten Dank im Voraus
Fabian
------------------
___________________________________________
Bubi spiele, Bubi glücklich!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP