| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Excel API Aufruf erzeugen (619 / mal gelesen)
|
archi.archi Mitglied
Beiträge: 109 Registriert: 08.10.2010 Windows 11 AutoCAD 2024 Revit 2024
|
erstellt am: 16. Sep. 2022 10:13 <-- editieren / zitieren --> Unities abgeben:
Hallo Forumer, über die Excel-Api möchte ich durch eine kleinen Anpassung der (defun GetExcel) aus getexcel.lsp von Terry Miller den max. verwendeten Zellbereich (also MaxRanges) einer Tabelle ermitteln. mit VBA einfach:
Code: letztezelle = ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Address(False, False)
mit Lisp komme ich leider bei der richtigen Zusammenstellung dieses Api-Aufrufes nicht weiter: Code: (setq MaxRanges (vlax-get-property (vlax-get-property (vlax-get-property (vlax-get-property *ExcelApp% "ActiveSheet") "Range" "A1") "SpecialCells(xlCellTypeLastCell)") "Address(False, False)") );setq
Fehler: ActiveX-Server hat einen Fehler zurückgegeben: Typenkonflikt Wer kann mir einen sachdienlichen Hinweis geben? Beste Grüße archi
[Diese Nachricht wurde von archi.archi am 14. Okt. 2022 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 16. Sep. 2022 11:44 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
|
archi.archi Mitglied
Beiträge: 109 Registriert: 08.10.2010 Windows 11 AutoCAD 2024 Revit 2024
|
erstellt am: 16. Sep. 2022 12:26 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, vielen Dank für den Hinweis auf "UsedRange". Mittlerweile bin ich über https://ww3.cad.de/foren/ubb/Forum145/HTML/004829.shtml#000001 auch schon in diese Richtung geleitet worden. Das Einlesen großer Datenmengen aus Excel mit vlax ist scheinbar langsam. Daher muss der einzulesende Bereich begrenzt werden. So sieht die Anpassung von (defun GetExcel) jetzt aus und ermöglicht das Einlesen nur der "verwendeten" Zellen: Code:
;VBA: bereich = blatt.UsedRange (setq UsedRange (vlax-get-property (vlax-get-property *ExcelApp% "ActiveSheet") "UsedRange" );end vlax-get-property );setq (setq MaxRow# (vlax-get-property (vlax-get-property UsedRange "Rows") "Count")) (setq MaxColumn# (vlax-get-property (vlax-get-property UsedRange "Columns") "Count"))
Bis zum nächsten Problem. Beste Grüße archi [Diese Nachricht wurde von archi.archi am 16. Sep. 2022 editiert.] [Diese Nachricht wurde von archi.archi am 16. Sep. 2022 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 16. Sep. 2022 12:38 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
Zitat: Original erstellt von archi.archi:
Das Einlesen großer Datenmengen aus Excel mit vlax ist scheinbar langsam.
wenn du immer darauf zugreifst ja sehr langsam. wenn du dir aus dem UsedRange den Value(2) schnappst hast du alles sofort ------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 109 Registriert: 08.10.2010 Windows 11 AutoCAD 2024 Revit 2024
|
erstellt am: 16. Sep. 2022 13:00 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, als Gelegenheits-Programmierer habe ich https://www.autolisp-exchange.com/LISP/GetExcel.lsp verwendet und angepasst. Die Funktion kommt mir irgendwie langsam vor (Einlesen bis "Y99" ist schon fast eine Zumutung), daher wollte ich unbedingt UsedRange ermitteln und verwenden. Für den Zweck, Planköpfe bzw. Beschrifter über Excel zu manipulieren, wird es aber reichen, da die Anzahl der Blöcke+Attribute i.A. begrenzt ist. UsedRange Value(2) werde ich dann bei größeren Datenmengen ausprobieren. Beste Grüße archi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 109 Registriert: 08.10.2010 Windows 11 AutoCAD 2024 Revit 2024
|
erstellt am: 22. Sep. 2022 15:07 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, doch nochmal zum Thema Geschwindigkeit: UsedRange mit 1-Rutsch-Einlesen ist sehr schnell. Ich manipuliere nur Block-Attribute (also String), da geht es ohne Datentypen. In (defun GetExcel) von Terry werden scheinbar die Excel-Datentypen zugordnet (also universell für alle möglichen Daten, nicht nur Attribute):
Code:
(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 ReturnList@ (append ReturnList@ (list Data@))) (setq Row# (1+ Row#)) );repeat
Die Listen werden spalten- und zeilenweise eingelesen. Das ist im Vergleich zum 1-Rutsch sehr langsam. Geht das irgendwie schneller, oder muss der Excel-Datentyp immer sofort ausgewertet werden? Beste Grüße archi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 23. Sep. 2022 09:41 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
Hallo, also der Code von Terry Miller ist ja in sich ein schlüssiges Prog. das dir eine Excel-Tabelle in Acad (Lisp) liefert, daher würde ich für ein spezielles vorhaben einen solchen code nicht verwenden, da dieser funktioniert wie er funktionieren soll, und sich auf das ganze bezieht. Die frage an sich ist wie dein such vorhaben ist? Also wie kommst du in Excel an deinen Wert, wenn du in die Tabelle schaust? Einen direkten Zugriff, könntest du auch so gestalten. Code: (setq ExcelUsedRange (vlax-variant-value (vlax-get-property (vlax-get-property xlsSheet "UsedRange" ) "VALUE2" ) ) ) (setq Wert_aus_Excel (vlax-variant-value (vlax-safearray-get-element ExcelUsedRange 1 ;ExcelZeile 1 ;ExcelSpalte ) ) )
Da wir zuvor schon auf UsedRange gekommen sind, musst du so nur aufpassen, dass wenn der UsedRange nicht auf A1 geht, erst die erste beschriebene Zelle 1,1 ist, ------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 109 Registriert: 08.10.2010 Windows 11 AutoCAD 2024 Revit 2024
|
erstellt am: 12. Okt. 2022 08:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, nachdem Terry seine GetExcel kürzlich mehrfach verbessert hat (jetzt hohe Geschwindigkeit mit "UsedRange"), bin ich mit dem Tool sehr zufrieden. Vielen Dank für deine Hinweise (die ich sicher an anderer Stelle nutzen kann ). Beste Grüße archi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |