| |
|
|
Christof Neuß | ¡Hola,
ha se ya veces alguien con el DLL LibXL befasst? Damit puede ser direkt en Exceldateien (auch xlsx y xlsm) zugreifen y esta bearbeiten.
Archivos abierto y Textos reinschreiben kann Yo ya, pero yo verzweifle momentan a el Características, el una Zahl en un Zelle escribir oder una Valor auslesen. Das kann doch no así schwer ser.
Ist para mich interessant, como algunos Anwender de Programmen Excel nada mehr lokal installiert haben y el Bearbeitung encima ActiveX no mehr funktioniert.
Gracias...!!! |
|
|
| |
|
|
|
H.Brill | Wenn sí ya el wesentliche klappt : Was es porque en el Doku de el DLL ? Como son porque el Übergabe - Parámetro ?
Algo como scheitert meistens, si la Übergabe el Parámetro falso es. Will heißen, si ellos por Referenz oder por Valor transferencia voluntad.
En el Pagar weiß Yo ahora no genau, si como Profano auch por Ref. übergibt. Notfalls veces el a übergebene Zahl en una Zona escribir y esta entonces transferencia. Das gleiche gilt auch beim Lesen. |
|
|
| Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 15.03.2016 ▲ |
|
|
|
|
RGH | Hakllo,
el problema es hier, dass el Función para Carta el numerischen Werte una Double (64 Bit) como Valor (byVal) esperado. In 32-Bit-XProfan son aber todos Parámetro en una API-Aufruf 32-Bit breit. Mit uno pequeño Zusatz-Procedimiento puede wir aber una Double en zwei LongInts verteilen y esta transferencia. Einer API-Función es egal si el 64 Bit como una Parámetro oder como zwei Parámetro überegeben voluntad. Lo necesario sólo 64 Bit ser, el como kommen:
Declarar Handle hLibxl, book, sheet
hLibxl = ImportDLL("libxl.dll", "")
set("CallConv","CDECL")
proc xlSheetWriteNumD
parámetros handle s, longint x,y , double d, handle f
declarar longint d1, d2, memory md
dim md, 8' Ein Double ha 8 Byte = 64 Bit
md = addr(d)' Das Double se en el Zona gemappt
d1 = long(md,0)' El ersten vier Bytes kommen después de d1
d2 = long(md,4)' El zweiten vier Bytes kommen después de d2
xlSheetWriteNumA(s, x, y, d1, d2, f)
ENDPROC
cls
book = xlCreateBookCA()
IF book
sheet = xlBookAddSheetA(book, "sheet1", 0)
IF sheet
xlSheetWriteStrA(sheet, 2, 2, "Hello, World!", 0)
xlSheetWriteNumD(sheet, 3, 1, 1000, 0)
ENDIF
xlBookSaveA(book, "example.xls")
MessageBox("File Written", "", 0)
xlBookReleaseA(book)
ENDIF
WaitInput
FIN
So funktioniert lo! Como beim Auslesen el gleiche Problema auftaucht, debería uno numerische Werte como String auslesen y luego con VAL umwandeln.
Saludo Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 15.03.2016 ▲ |
|
|
|
|
Christof Neuß | Es sí veces otra vez genial
Kaum va uno 'ne Std. joggen, en el Hirn otra vez algo a lüften, ya findet uno hier una Referencia, el weiterhilft. DANKE Roland. Das ha ya veces bien geklappt.
Leider bin Yo en el Umgang con DLL siempre todavía Laie y verzweifle más...
Schau' veces:
Declarar Handle hLibxl, book, sheet
hLibxl = ImportDLL("libxl.dll", "")
set("CallConv","CDECL")
Var Expediente$="Test1.xls"
Var Gelesen$=""
proc xlSheetWriteNumD
parámetros handle s, LONGint x,y , double d, handle f
declarar longint d1, d2, memory md
dim md, 8' Ein Double ha 8 Byte = 64 Bit
md = addr(d)' Das Double se en el Zona gemappt
d1 = long(md,0)' El ersten vier Bytes kommen después de d1
d2 = long(md,4)' El zweiten vier Bytes kommen después de d2
xlSheetWriteNumA(s, x, y, d1, d2, f)
ENDPROC
cls
book = xlCreateBookCA()
xlBookLoadA(book, Expediente$)
IF book
'sheet = xlBookAddSheetA(book, "sheet1", 0)
sheet = xlBookGetSheetA(book, 0)
IF sheet
xlSheetWriteStrA(sheet, 2, 2, "Hello!", 0)
xlSheetWriteNumD(sheet, 3, 1, 1000, 0)
Gelesen$=xlSheetReadStrA(sheet, 9,0)
Imprimir Gelesen$
ENDIF
xlBookSaveA(book, "Test1.xls")
xlBookReleaseA(book)
ENDIF
Imprimir "FERTIG!"
WaitInput
FIN
Gelesen$ se zwar bestückt, pero yo erhalte algo como como una Pointer, oder? Como gehe Yo porque así en? Hab' ya el una u otros ausprobiert, pero yo finde no fuera.
Und beim Zahlenauslesen como texto - Yo grundsätzlich verstehe - stellt el Cuestión, si el Función xlSheetReadStr() en uno "Zahlenzelle" überhaupt funktioniert.
Schon veces otra vez una großes DANKE... |
|
|
| |
|
|
|
H.Brill | Soweit Yo el sehe, se como todavía una Formato con zurückgegeben :
Reads a cadena and its format from cell
Müßtest du veces ausprobieren, si como una Zona no mejor wäre :
Wenn el DLL-Función una Nullbyte hinter el String setzt, es sí simplemente, con String$(Zona#, 0) a el String a kommen.
Roland : Könnte él a Übergabe de Pagar no auch Double(N&) oder QuadInt nehmen ? El son doch 64Bit breit.
Ansonsten probier lo veces con Zona#. Como bekommt uno uno en efecto con Float(V, A) una 64Bit - Valor. |
|
|
| Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 15.03.2016 ▲ |
|
|
|
|
Christof Neuß | Hi,
Textos y Formeln auslesen kann Yo ahora ya veces. Es relativ simplemente con
En Pagar funktioniert el aber por desgracia, no. |
|
|
| |
|
|
|
H.Brill | Tomar aber más bien veces Bereiche :
Gelesen& es una normaler LongInt. Das klappt zwar oben, porque beides el Variables-Adresse beinhaltet, es pero no así de Roland beabsichtigt y kann durchaus veces fehlschlagen.
Mach mejor :
Was todavía va, es una Pointer.
En Pagar puede auch no trabajo. Hier muß uno el Bereichsfunktionen Float(V,A) oder Largo(V, A) benutzen. El String$() - Función liest solange, a entweder una Nullbyte kommt oder a ans el Ende des Bereichs. Und Zahlenwerte haben nunmal kein Nullbyte. |
|
|
| Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 15.03.2016 ▲ |
|
|
|
|
Christof Neuß | Merci para el Referencia. Ok, hab' s en Bereiche umgestellt. Im STR-Zona alles como vorher y - desafortunadamente - auch en el Zahlenbereich. Lo funktioniert no. Egal, Yo auch probiere...
So geht's no...
... con ZahlGelesen&=Long(Gelesen#,0) geht's auch no. Yo bekomme sólo Fehlermeldungen.
|
|
|
| |
|
|
|
RGH | Zum String-Zona: Er muss no dimensioniert voluntad, como el API-Función dies en diesem Fall hecho.
Zum Lesen de Pagar: Hier el problema es, dass auch el Rückgabewert uno API-Función en el 32-Bit-XProfan sólo una 32-Bit-Valor (LongInt, Zona, Handle oder Double) ser kann, qué para el gesamte Windows-API zutrifft. El Función el DLL liefert pero en numerischen Werten una Double (64 Bit) zurück, qué con XProfan nun veces no va. AUch el Auislesen como String funktioniert no, como el Función, como auch en el Documentación es, NULL zurückliefert, si en el Zelle kein String es
Saludo Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 15.03.2016 ▲ |
|
|
|
|
Christof Neuß | Hola Roland,
danke para el Info. Schade. Aber entonces brauche Yo no mehr a probieren. Momentan brauche Yo tats. sólo el Lesefunktion para Cuerdas. Das reicht sí entonces. Leider kann ich's entonces no para otro Anwendungen nutzen. |
|
|
| |
|
|
|
RGH | Lo son una solución, el pero no bastante aufwandsarm es:
In Delphi una Wrapper-DLL escribir, el entonces con Single arbeitet y el Double como String zurückliefert, etc. Yo habe para mich veces así una DLL geschrieben, el a Tiempo sólo el Características de mi Ejemplo enthält. En Gelegenheit Yo el Aufrufkonvention auch de CDECL después de STDCALL gewandelt. Damit sieht el Ejemplo ahora así de y funktioniert einwandfrei:
Declarar Handle hLibxl, book, sheet, format, memory gelesen
hLibxl = ImportDLL("prlibxl.dll", "")
cls
book = xlCreateBookCA()
IF book
sheet = xlBookAddSheetA(book, "sheet1", 0)
IF sheet
xlSheetWriteStrA(sheet, 2, 2, "Hello, World!", 0)
xlSheetWriteNumA(sheet, 3, 1, single(1000), 0)
gelesen = xlSheetReadStrA(sheet, 2, 2, 0)
Imprimir String$(Gelesen, 0)
gelesen = xlSheetReadNumA(sheet, 3, 1, 0)
Imprimir String$(Gelesen, 0)
ENDIF
xlBookSaveA(book, "example.xls")
MessageBox("File Written", "", 0)
xlBookReleaseA(book)
ENDIF
WaitInput
FIN
En WriteNum se el Función single() verwandt, así el Zahl 1000 no como Integer transferencia se. Man podría aber auch 1000.0 escribir oder direkt una variable des Typs SINGLE transferencia.
Lo wäre also machbar, una Wrapper-DLL a escribir, el todos Características el Original-DLL enthält. Otro Möglichkeit wäre, una Wrapper-DLL sólo para el Características a escribir, el Double ls Parámetro obtener y/oder Double zurückliefern. Das wäre algo weniger aufwendig.
Saludo Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 16.03.2016 ▲ |
|
|
|
|
Christof Neuß | Hola Roland,
como Usted ya schreibst... "nicht bastante aufwandsarm". Und el gilt no sólo dafür, el zusätzliche DLL-a realisieren, pero auch para mi en el Jahre gekommene Anwendung, el Yo bastante umbauen debería. Das Problema es u.a., dass I native Características para unos pocos schnelle Dateifunktionen zurückgreife y aquí todavía con XPSE compiliere. Der wiederum es pero no tan completamente Freund con algunos XProfan X3-Características y así führt eins para otro... Hätte Yo ahora 100 zahlende Kunden sería lo mich auch no abhalten, el - relativ kleine - Programa bastante neu a escribir. Aber lo son sólo una Handvoll Kunden y lo se wahrscheinlich demnächst bastante eingestellt voluntad. Yo verzichte ahora en una Plausibilitätsprüfung y luego läuft's auch sin Excelaufruf por.
Das Thema "Zugriff en Exceldateien" beschäftigt mich aber más. Tal vez gehe Yo veces en XLware a y frage, si una solución son (z.B. Num-Werte como String a lesen).
EIN Grund para mich seinerzeit con XProfan anzufangen fue, aufgrund el Mächtigkeit la lengua, nahezu no weitere DLL einsetzen tener. Si el así bleiben se, muss Yo otro Möglichkeiten encontrar.
Vorerst vielen Dank a todos, el hier mitgedacht y geholfen haben. |
|
|
| |
|
|