| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Excel Daten aus sheet einlesen (3344 mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 05. Jun. 2015 14:19 <-- editieren / zitieren --> Unities abgeben:
Ich stehe vor dem Problem aus reiner Unwissenheit, einmal wo kann ich Hilfe finden zum anderen ist es überhaupt möglich, die kompletten Daten aus einem Excelsheet einzulesen oder muss man da Zelle für Zelle vorgehem Code: (defun read_excel_range (FilePath ShtNum / ExcelApp ExcData Sht UsdRange Wbk) (vl-load-com) (setq ExcelApp (vlax-get-or-create-object "Excel.Application")) (vla-put-visible ExcelApp :vlax-true) (vlax-put-property ExcelApp 'DisplayAlerts :vlax-true) (setq Wbk (vl-catch-all-apply 'vla-open (list (vlax-get-property ExcelApp "WorkBooks") FilePath) ) ) (setq Sht (vl-catch-all-apply 'vlax-get-property (list (vlax-get-property Wbk "Sheets") "Item" ShtNum ) ) ) (vlax-invoke-method Sht "Activate") (setq UsdRange (vlax-get-property (vlax-get-property Sht 'Cells) "Range" Address) UsdRange (vlax-get-property UsdRange "CurrentRegion" ) ExcData (vlax-safearray->list (vlax-variant-value (vlax-get-property UsdRange 'Value2))) )
------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 05. Jun. 2015 14:27 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 05. Jun. 2015 14:30 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 05. Jun. 2015 14:36 <-- editieren / zitieren --> Unities abgeben:
|
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 05. Jun. 2015 15:03 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Was aus deinem post nicht richtig hervor ging du kannst natürlich vorher filtern was du benötigst ob einzenle zelle, ausgewählte zellen, spalte(n) usw. kommt darauf an was du benötigt und ob du weißt wo deine daten in der Tabelle stehen. An der suchfunktion in Excel habe ich mich auch mal vor langer Zeit versucht bin aber gescheitert vielleicht schaffst du es ja (oder jemand anders!) Habs noch wiedergefunden was mir damals als hilfe gedient hat. Code:
(vlax-invoke-method xlURange 'find (vlax-get-property SHEET "Range" (vlax-make-variant "A1:A14" 8) ) (vlax-make-variant "a" 8) (vlax-make-variant "A2" 8) (vlax-make-variant -4163 2) (vlax-make-variant "1" 2) (vlax-make-variant "1" 2) (vlax-make-variant "1" 2) ) hello ---string---> What A1 ---string---> After -4163 ---int32----> LookIn 1 ---int32----> LookAt 1 ---int32----> SearchOrder 1 ---int32----> SearchDirection
What: The info you are looking for, it can be a character string or any data type you are looking for in excel. After: The cell after which you want to find, it corresponds to the active cell when find is made by user interface. LookIn: Where to look, in formulas (-4123), values (-4163) or notes (-4144) LookAt: Look at whole or part (1,2) SearchOrder: By rows (1) or by columns (2) SearchDirection: Next or previous (1,2) MatchCase: True for upper and lowercase distinction MatchByte: only for assian office You can find this info in the VBA help, and you can use object examiner (sorry for the traduction) in VBA to know values. Hope this helps
------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 05. Jun. 2015 15:10 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 05. Jun. 2015 19:25 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
@Dirk: Du bist doch auch in .Net unterwegs. Bau dir da eine Lispfunktion zum Auslesen der Excel-Dateien und gib das Ergebnis so zurück, dass du damit in Lisp was anfangen kannst. Auf .Net-Seite bist du doch sehr viel näher an der Microsoftwelt, als du mit Lisp jemals sein wirst. ActiveX ist eine Krücke, die zwar funktioniert, aber auch extrem langsam ist und die Dateitypen nicht so recht zum Lisp kompatibel sind. Ich habe den Eindruck, dass du zwischen Lisp und .Net schwankst. Wenn ich mir aber deine Aufgabenstellungen/Fragen so betrachte, ist die .Net-Welt für dich die passendere. Es wird sicher auch nahezu alles irgendwie in Lisp zu machen sein, mit Einschränkungen was die Performance, die Vernetzung zu anderen AutoCADfremden Daten anbelangt (XML/Excel/Datenbanken) und auch die Benutzerführung betrifft. Soll heißen: via odbc-Zugriff von .Net aus kannst du alle Tabellenblätter, auch großer Tabellen in wenigen Sekunden auslesen. Ich habe letzte Woche erst einen Auftrag in dieser Richtung erledigt. Tabellen mit 30 Spalten und rund 3.000 Zeilen in mindestens 5 Tabellenblättern einer Datei sind auf diesem Weg in weniger als 3sec ausgelesen und als Assoziationsliste an die weitere Lisp-Verarbeitung zurück gegeben. Von Lisp aus würde ich behaupten, dass man beim Zugriff via ActiveX einigen Minuten auf ein Ergebnis warten müsste. Ich möchte dich nicht zu irgendetwas bekehren .. da aber dein Interesse an .Net vorhanden ist, denke ich, ist dieser Hinweis in Ordnung. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
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: 06. Jun. 2015 12:45 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Also ich habe es mal getestet. Zitat: Von Lisp aus würde ich behaupten, dass man beim Zugriff via ActiveX einigen Minuten auf ein Ergebnis warten müsste.
Mein Ergebniss liegt bei 2.4 Sekunden. Daher scheint mir .Net hier nicht schneller. ------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 06. Jun. 2015 13:25 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Meldin, ich wette das das es bei dir 1-2 Minuten dauern würde, wenn du die gleiche Aufgabe versuchen würdest. (man braucht zwar nur 0.5-2sek. für den Zugriff, aber eine Assoc-Liste in der Größe dauert schon sehr lange und siche nicht in 2.4sek. machbar) EDIT: Soll bedeuten das der Excel-Zugriff recht schnell ist, nur die weitere Verarbeitung in Listen nicht. Kommt also darauf an ob dies nötig ist / von Aufgabe zu Aufgabe. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD
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: 06. Jun. 2015 13:41 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hier mein testversuch und es sind doch listen! wie soll denn sonst deine Assoc liste aussehen. Code: (defun c:exin (/ Start VariantListen Sheets ExcelSeite zähler);;; ;;; Uhr (setq Start (getvar "Date")) ;;; Uhr Ende (vl-load-com) (setq Sheets (vlax-get-property (vlax-get-property (vlax-get-object "excel.application") "ActiveWorkbook" ) "Sheets" ) ) (setq zähler 0) (repeat 5 (setq ExcelSeite (vlax-get-property Sheets "Item" (setq zähler (1+ zähler)) ) ) (setq ExcelUsedRange (vlax-variant-value (vlax-get-property (vlax-get-property ExcelSeite "UsedRange") "VALUE" ) ) ) (setq VariantListen (vlax-safearray->list ExcelUsedRange)) (set (read (strcat "Tabelle" (itoa zähler))) (mapcar '(lambda (l) (mapcar '(lambda (p) (vlax-variant-value p)) l) ) VariantListen ) ) (prin1) ) ;;; Uhr (princ "\n") (princ (list "Benötigte Zeit" (rtos (* 86400 (- (getvar "Date") Start)) 2 6) "sek." ) ) (prin1) (terpri) (princ (length Tabelle1)) (terpri) (princ (length Tabelle2)) (terpri) (princ (length Tabelle3)) (terpri) (princ (length Tabelle4)) (terpri) (princ (length Tabelle5)) (terpri)
)
------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 06. Jun. 2015 14:01 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Ich werde den Code mal testen wenn ich wieder am Rechner sitze, aber wenn ich richtig interpretiere hast du das eine Liste mit 1. Tabllennamen und danach die Zellwerte. Ich habe bei der Sache an eine Liste gedacht wie ich sie immer benötige, nämlich(Tabelle(A 1 Wert)(A 2 Wert)(B 1 Wert)(B 2 Wert) oder ähnlich.. Darauf bezog ich mich mit der Zeitangabe, was Brischke meint kann ich natürlich nicht sagen, da kann ich auch nur raten. DAS war halt meine Interpretation zum Thema und Assoc-Liste. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD 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: 06. Jun. 2015 14:12 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 06. Jun. 2015 14:21 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 07. Jun. 2015 13:24 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Moin, also wie ich ja vorher vermutet habe, hast du keine Column/Row-Info in der Liste, aber sei es drum - durch den Thread habe ich ein faules Ei in meinem Code entdeckt, THX. Von meiner Minuten-Aussage darf ich mich nun verabschieden (in meinem Prog ist an dieser Stelle deutlich mehr passiert wie die R/C-Info für die Assoc-Liste zu ergänzen). Zu deinem Code: Ich habe die XLSx nicht als aktuellen Sheet, gehabt sondern die datei zunächst geöffnet, Schwankungen innerhalb einer Sitzung sind aber größer wie die Unterschiede zwischen bereits geöffnet / oder auch nicht. Zudem habe ich die Ausgabe noch um die Spalten-Anzahl ergänzt. Beim Thema Excel-Zugriffszeit war ich ja schon bei dir, beim Thema Assoc-Liste bin ich es nun endlich auch (je nach dem wie man dazu kommt) Befehl: Exin0 (dein Code mit geschlossenes Excel/File)
(Benötigte Zeit 0.978993 sek.) 601x30 608x30 601x30 608x30 608x30 Befehl: Befehl: Exin1 (dein Code mit geschlossenes Excel/File) (Benötigte Zeit 2.879003 sek.) 3001x30 3001x30 3001x30 3001x30 3001x30 nil Befehl: Exin2 (dein Code mit geschlossenes Excel/File, ergänzt um R/C-Info) (Benötigte Zeit 1.448996 sek.) 601x30 608x30 601x30 608x30 608x30 nil Befehl: Befehl: Exin3 (dein Code mit geschlossenes Excel/File, ergänzt um R/C-Info) (Benötigte Zeit 6.579003 sek.) // kompiliert nur 5sec. 3001x30 3001x30 3001x30 3001x30 3001x30 nil Befehl: Befehl: Exin0+1 / (cadr T2) = (("Wert1" "Wert2" "Wert3")....) Exin2+3 / (cadr T2) = ((("A" "3") . "Wert1") (("B" "3") . "Wert2") (("C" "3") . "Wert3")....) >> Bei Exin2&3 habe ich jetzt nicht geschaut wie es mit der Performace am besten ist, es war nur einmal ein Test für die Assoc-Liste wie ich sie mir vorstellte bei Holgers Beschreibung. Und da wir nun genug im Dunklen herumgestochert haben, warten wir wohl mal ab was Brischke gemeint hatte. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD 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: 07. Jun. 2015 15:16 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
So ich habe es auch mal mit geschlossener xls und mit R C angeben probiert. Und liege hier immer noch weit unter deinem Ergebiss und mein Rechner hier ist auch nur ein ganz einfacher 4kern mit 2.5mhz leigt warscheinlich auch daran woher du deine datenbeziehst und sie zusammen in eine liste schiebst. Hier mein Ergebniss. (Benötigte Zeit 3.436996 sek.) 3000 3000 3000 3000 3000 (((("A" "1") . 1.0) (("B" "1") . 1.0) (("C" "1") . 1.0) (("D" "1") . 1.0) (("E" "1") . 1.0) (("F" "1") . 1.0) (("G" "1") . 1.0) (("H" "1") . 1.0) (("I" "1") . 1.0) (("J" "1") . 1.0) (("K" "1") . 1.0) (("L" "1") . 1.0) (("M" "1") . 1.0) (("N" "1") . 1.0) (("O" "1") . 1.0) (("P" "1") . 1.0) (("Q" "1") . 1.0) (("R" "1") . 1.0) (("S" "1") . 1.0) (("T" "1") . 1.0) (("U" "1") . 1.0) (("V" "1") . 1.0) (("W" "1") . 1.0) (("X" "1") . 1.0) (("Y" "1") . 1.0) (("Z" "1") . 1.0) (("AA" "1") . 1.0) (("AB" "1") . 1.0) (("AC" "1") . 1.0) (("AD" "1") . 1.0)) ((("A" "2") . 1.0) (("B" "2") . 1.0) ------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 07. Jun. 2015 16:20 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Ich denke das es da entweder am Rechner liegt oder wie man den Part ("A" "3") ermittelt, bei letzterem habe ich nicht versucht zu optimieren, sondern die erste Möglichkeit genommen die mir einfiel. Das holen der Daten ist es aber nicht, ohne die R/C-Info war es bei mir 2.9sec zu deinen 2.4, das passt doch ganz gut überein! - R/C-Info: Ich sitze nicht am Rechner, aber was ich gemacht habe kann ich ja beschreiben: Nach dem Sheet und holen des Range habe ich Row&Column vom Range abgefragt(denn der Range fängt ja nicht zwingend bei A1 an), im MapcarKonstrukt wird pro Zeile Row um 1 erhöht, Column pro Eintrag der Spalte, springt man eine Zeile weiter wird der aktuelle ColumnWert wieder auf den Vorgabewert gesetzt. Eine kleine Funktion setzt dabei natürlich noch die Spalten-Zahl in Buchstaben um. Du hast sicher die Daten direkt vom VlaObjekt abgefragt / an der Stelle bei der auch Value abgerufen wird? Das würde wohl den Zeitunterschied erklären. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD 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: 08. Jun. 2015 08:29 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Nein ich habe es bis aufs Kleinste genau so gemacht wie die du ABER was ich nicht verstehe ist wozu benötigt man die zellenposition weil ohne den ganzen schnickschnack ist der Änfängliche Code doch viel schneller und man kann doch den Wert einer Zelle so Abfragen. Code: (setq Zeile (nth 199 Tabelle1)) (setq Spalte (nth 5 Zeile ))
Unter Berücksichtigung das der URange nicht mit A1 anfängt. ------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 08. Jun. 2015 08:48 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Also hier in dem Thread ging es mir zunächst nur darum zu interpretieren was Brischke mit Assoc-Liste meinen könnte. Ich selbst habe es schon benötigt gehabt, weil: Wenn die Daten nicht direkt verwertet (und verworfen) werden, die R/C-Info aber von Interesse ist, so muß man mindestens die Start-Row&Column-Werte speichern, dies würde ich heute dann so in der Liste speichern: ((3 4)("wert1" "Wert2" usw)(..)) Aber man kann ja auch mal was anderes wie einen zusammenhängenden Range auslesen (daher kenne ich, für mich, die Anforderung nach der R/C-Info), dies ist der Fall in dem man markierte Bereiche ausliest und davon kann es mehrere, nicht zusammenhängende geben. Also ich fasse noch mal zusammen: Wie sind uns nach wie vor einig das Excel auslesen kein Problem ist (zeitlich und technisch), was Zeit frißt/fressen kann, sind große Listen zu kreieren/manipulieren, Beispiel: Ein völlig überflüssige (setq irgendwas p) im Mapcar der Spalten bremst schon deutlich aus. Assoc-Liste im Thread: Weil es als Beispiel genannt war, daher sind wir darauf eingegangen.
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 08. Jun. 2015 09:19 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo, @meldin: das ist wirklich eine sehr schnelle Art, die Daten aus Excel zu lesen. Mit dem Abfragen des UsedRange hatte ich in der Vergangenheit so meine Probleme, da Excel mitunter auch den Bereich als genutzt kennzeichnet, in denen nur irgendwelche Zell-Formatierungen vorgenommen wurden und keine Werte enthalten sein müssen. Da kann es also sehr leicht dass man extrem viele leere Datensätze zurück bekommt, die die Weiterverarbeitung erschweren. Daher hatte ich seinerzeit eine Routine geschrieben, die die Zellwerte einzeln ausliest und in Listen packt und das Auslesen beendet, sobald mehr als 2 Leerspalten oder Leerzeilen gefunden wurden. Der Einzel-Zugriff auf jede auszulesende Zelle war dann natürlich extrem langsam. Der Screenshot anbei zeigt die Arbeitsweise des Tools. Es wird die Excel-Datei angezeigt und man kann direkt die Attribute den Spalten zuordnen. Die Rückgabe umfasst dann lediglich die zugeordneten Spalten, so dass die weitere Verarbeitung in Lisp einfach und klar ist. Das Ergebnis mit der Lisp-Routine: (Benötigte Zeit 1.679009 sek.) 3201 4321 3649 4865 3345 Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 08. Jun. 2015 11:35 <-- editieren / zitieren --> Unities abgeben:
Interessant was hier für Kommentare kommen - meine Frage zum Lesevorgang wäre: ist es zwingend notwendig die excelTabelle vorher in Excel zu öffnen oder kann man das vermeiden bzw. was passiert wenn gar kein Excel installiert ist - geht das mittel COM-objekt dann noch ? Warum nicht in .NET, mir schien es einfacher das erstmal in LISP durchzuführen ??? Dem war dann doch nicht so.... Code: (defun c:test()(defun read_excel_range (FilePath ShtNum / ExcelApp ExcData Sht ExcelUsedRange Wbk VariantListen) (vl-load-com) (setq ExcelApp (vlax-get-or-create-object "Excel.Application")) (vla-put-visible ExcelApp :vlax-true) (vlax-put-property ExcelApp 'DisplayAlerts :vlax-true) (setq Wbk (vl-catch-all-apply 'vla-open (list (vlax-get-property ExcelApp "WorkBooks") FilePath) ) ) (setq Sht (vlax-get-property (vlax-get-property (vlax-get-object "excel.application") "ActiveWorkbook" ) "Sheets" ) ) (setq ExcData (vlax-get-property Sht "Item" 1 ) ) (setq ExcelUsedRange (vlax-variant-value (vlax-get-property (vlax-get-property ExcData "UsedRange") "VALUE" ) ) ) (setq VariantListen (vlax-safearray->list ExcelUsedRange)) ;;; (vlax-invoke-method Sht "Activate") ;;; (setq UsdRange (vlax-get-property (vlax-get-property Sht 'Cells) "Range" Address) ;;; UsdRange (vlax-get-property UsdRange "CurrentRegion" ) ;;; ExcData (vlax-safearray->list (vlax-variant-value (vlax-get-property UsdRange 'Value2))) ;;; ) (setq Tabelle (mapcar '(lambda (l) (mapcar '(lambda (p) (vlax-variant-value p)) l) ) VariantListen ) ) (foreach n Tabelle (princ (strcat "\n" (vl-princ-to-string n))) ) ) ; ***MAIN*** (setq fname (getfiled "Select Excel File:" "H:/Dropbox/Public/" "XLSX;XLS" 4)) (read_excel_range fname "Sheet1") )
------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
[Diese Nachricht wurde von cadplayer am 08. Jun. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 08. Jun. 2015 11:41 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Wie willst du denn sehen was im Haus ist (Das Haus der Dateien hat ja keine Fenster, nur eine Tür) ? Natürlich muß eine Datei offen sein oder geöffnet werden, aber man braucht Excel und die Datei nicht am Monitor anzeigen lassen. (setq EXCEL (vlax-get-or-create-object "Excel.Application")) Dann in den WorkBooks schauen ob deine Exceldatei bereits offen ist, wenn nicht öffnen: (vlax-invoke-method (vlax-get-property EXCEL "WORKBOOKS") "OPEN" FILENAME) Dabei solltest du dir merken das du sie geöffnet hast, so kannst du sie nach dem Zugriff dann auch wieder schließen. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 08. Jun. 2015 12:01 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: Interessant was hier für Kommentare kommen - meine Frage zum Lesevorgang wäre: ist es zwingend notwendig die excelTabelle vorher in Excel zu öffnen oder kann man das vermeiden bzw. was passiert wenn gar kein Excel installiert ist - geht das mittel COM-objekt dann noch?
... mit meiner .Net-Variante geht's, egal ob die Datei geöffnet oder geschlossen ist, egal ob Excel installiert ist oder nicht - man ist von der Anwendersituationen unabhängig. Grüße! Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 08. Jun. 2015 12:06 <-- editieren / zitieren --> Unities abgeben:
|
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 08. Jun. 2015 12:12 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 08. Jun. 2015 12:15 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
... keine Ahnung, dass musst du wissen. Ja nach dem, wie du dein Projekt aufbaust, kannst du es als DLL kompilieren für die Einbindung in AutoCAD mit integrierter Lisp-Funktion oder du machst eine exe, die irgendwohin eine lsp-File mit dem Tabelleninhalt schreibt. Ich habe bei mir beide Varianten integriert, EXE-Lösung aber nur, weil mein Kunde es so wollte. Wenn ich es ausschließlich AutoCAD nutze, dann würde ich das auch in einer AutoCAD-DLL integrieren. Grüße! Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 08. Jun. 2015 12:18 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von Meldin: Die frage ist was es am ende werden soll und warum sollte jemand mit dem Code Excel nutzen der gar kein Excel hat.
Möglichkeiten, warum Excel nicht da ist, oder die Datei nicht geöffnet ist, gibt es viele. Sponat vollen mir 2 ein: (1) Weil dieser jemand z.Bsp. mit OpenOffice arbeitet, aber von anderen Excel-Dateien zugesandt bekommt. (2) Weil AutoCAD auf einem Server installiert ist, und selbständig bestimmte Aktionen ausführt, wenn irgendwo eine neue Excel-Tabelle auftaucht .. Grüße! Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 08. Jun. 2015 12:29 <-- editieren / zitieren --> Unities abgeben:
Ja mir geht es lediglich drum ein xlsx zu lesen ohne Excel öffnen zu müssen sonst könnte ich lediglich Excel mit dem entspr. File öffnen. Ich hätte mir gern vorgestellt es gäb ein read funktion wie bei einfachen ascii (csv txt) die einfach alle Zeilen abrattert. Bevor jtzt die Frage kommt warum tabelle nicht als csv speichern. in der xlsx liegt eine Datasource auf eine website, die ich damit zwrstören würde ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 08. Jun. 2015 12:42 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
... vielleicht ist es besser, du erstellst erst einmal ein Konzept (Wo siegen welche Daten und in welchem Kontext muss damit was gemacht werden) Die Daten einer Datenbank, egal wo die liegt, über den Umweg Excel zu ermitteln, funktioniert zwar, aber ich stelle mir (bzw DIr) die Frage, warum greifst du nicht direkt auf die Datenbank zu .. Excel hat ja scheinbar Zugriff, also kann's nicht daran liegen, dass irgendwelche DB-Treiber fehlen oder die Zugriffsrecht ungenügend sind. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 08. Jun. 2015 13:14 <-- editieren / zitieren --> Unities abgeben:
naja ich weiss nur nicht ob ich mittels odbc-treiber auf eine website zugreifen kann. es ist ansich eine simple sache, da die xlsx alle Mitglieder einträge der website speichert. der zugriff über lisp sollte ermöglichen diese Daten einzulesen. Da das nur online passieren kann, ist es wiederum umständlich ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 08. Jun. 2015 13:20 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
... wie greifst du von Excel auf die Online-DB zu? Da brauchst du für den Tabellen-Connect ebenfalls einen DB-Treiber. Mit demselben kannst du von sonstwo auf die OnlineDB zugreifen. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 08. Jun. 2015 13:35 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 08. Jun. 2015 14:04 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
nunja, das ist natürlich etwas anderes. Das ist auch keine Datenverbindung, wie ich die im klassischen Sinne interpretieren würde. Dieses Excel-Feature nimmt einfach nur den HTML-Stream und wertet die darin erkannten Bereiche aus. Das hat nichts mit einer Daten(bank)-Abfrage zu tun. Mit .Net kann man das ebenso tun, nur nicht so komfortabel wie dies in Excel möglich ist - der Umweg über Excel wäre auch in diesem Fall nicht notwendig. Grüße! Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 08. Jun. 2015 14:07 <-- editieren / zitieren --> Unities abgeben:
|
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 09. Jun. 2015 09:16 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zudem was Holger erwähnt hat möchte ich noch eine Idee anhängen die mir gestern eingefallen ist. Zitat: Mit dem Abfragen des UsedRange hatte ich in der Vergangenheit so meine Probleme, da Excel mitunter auch den Bereich als genutzt kennzeichnet, in denen nur irgendwelche Zell-Formatierungen vorgenommen wurden und keine Werte enthalten sein müssen.
Für den Fall das es vorkommenkann das man massig leere Datensätze hat könnte man über Code: (setq UsedUsedRange (vlax-invoke-method (vlax-get-property ExcelSeite "UsedRange") "SpecialCells" 2))
alle belegten Zellen abfragen und aus der Abfrage der Adressen die dann z.B sotetwas zurückgeben könnten "Z8S4;Z8S6;Z9S5;Z11S5:Z11S6;Z13S7" mit min max den wirklichen UsedRange ermitteln. Achtung mit ";" u. ":" Und andere unnötigt Daten könnte man vorher mit Replce entfernen doppelte Leerzeichen usw.. Habe es jetzt nicht alles bis aufs kleiste durchgetestet daher nur eine Idee.
------------------ Gruß Wolfgang Alias: Rabbit007 und Wolli1 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |