| |
|
|
- Seite 1 - |
|
Christof Neuß | Hallo,
hat sich schon mal jemand mit der DLL LibXL befasst? Damit kann man direkt auf Exceldateien (auch xlsx und xlsm) zugreifen und diese bearbeiten.
Dateien öffnen und Texte reinschreiben kann ich schon, aber ich verzweifle momentan an den Funktionen, die eine Zahl in eine Zelle schreiben oder einen Wert auslesen. Das kann doch nicht so schwer sein.
Ist für mich interessant, da einige Anwender von Programmen Excel gar nicht mehr lokal installiert haben und die Bearbeitung über ActiveX nicht mehr funktioniert.
Danke...!!! |
|
|
| |
|
|
|
| |
|
- Seite 1 - |
|
RGH | Es gibt eine Lösung, die aber nicht ganz aufwandsarm ist:
In Delphi eine Wrapper-DLL schreiben, die dann mit Single arbeitet und die Double als String zurückliefert, etc. Ich habe für mich mal so eine DLL geschrieben, die zur Zeit nur die Funktionen aus meinem Beispiel enthält. Bei der Gelegenheit habe ich die Aufrufkonvention auch von CDECL nach STDCALL gewandelt. Damit sieht das Beispiel jetzt so aus und funktioniert einwandfrei:
Declare 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)
Print String$(Gelesen, 0)
gelesen = xlSheetReadNumA(sheet, 3, 1, 0)
Print String$(Gelesen, 0)
ENDIF
xlBookSaveA(book, "example.xls")
MessageBox("File Written", "", 0)
xlBookReleaseA(book)
ENDIF
WaitInput
END
Bei WriteNum wird die Funktion single() verwandt, damit die Zahl 1000 nicht als Integer übergeben wird. Man könnte aber auch 1000.0 schreiben oder direkt eine Variable des Typs SINGLE übergeben.
Es wäre also machbar, eine Wrapper-DLL zu schreiben, die alle Funktionen der Original-DLL enthält. Eine andere Möglichkeit wäre, eine Wrapper-DLL nur für die Funktionen zu schreiben, die Double ls Parameter erhalten und/oder Double zurückliefern. Das wäre etwas weniger aufwendig.
Gruß 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ß | Hallo Roland,
wie Du schon schreibst... "nicht ganz aufwandsarm". Und das gilt nicht nur dafür, die zusätzliche DLL-zu realisieren, sondern auch für meine in die Jahre gekommene Anwendung, die ich ziemlich umbauen müsste. Das Problem ist u.a., dass ich auf native Funktionen für ein paar schnelle Dateifunktionen zurückgreife und hier noch mit XPSE compiliere. Der wiederum ist aber nicht so ganz Freund mit einigen XProfan X3-Funktionen und so führt eins zum anderen... Hätte ich jetzt 100 zahlende Kunden würde es mich auch nicht abhalten, das - relativ kleine - Programm ganz neu zu schreiben. Aber es sind nur eine Handvoll Kunden und es wird wahrscheinlich demnächst ganz eingestellt werden. Ich verzichte jetzt auf eine Plausibilitätsprüfung und dann läuft's auch ohne Excelaufruf durch.
Das Thema "Zugriff auf Exceldateien" beschäftigt mich aber weiter. Vielleicht gehe ich mal auf XLware zu und frage, ob es eine Lösung gibt (z.B. Num-Werte als String zu lesen).
EIN Grund für mich seinerzeit mit XProfan anzufangen war auch, aufgrund der Mächtigkeit der Sprache, nahezu keine weitere DLL einsetzen zu müssen. Wenn das so bleiben soll, muss ich andere Möglichkeiten finden.
Vorerst vielen Dank an alle, die hier mitgedacht und geholfen haben. |
|
|
| |
|
|
| |
|
- Seite 2 - |
|
|
| Wenn wir nur hunderte Leben hätten und die Zeit.
Ich muss gestehen mich jetzt hier ins dies Thema nicht hinein-gekniet zu haben, frage mich aber,
was uns daran hindert, 2 Long vom Stack abzurufen.
Vielleicht durchschaue ich es jetzt aber auch nur nicht, und es wäre nutzlos 2 Long vom Stack abzurufen.
Kannst Du mal ein Mini-Beispiel für NativeProfanFree [...] herstellen?
Da könnte man doch eine Wrapper-nProc schreiben, die Roland dann wiederum auch in Profan einbauen könnte. Sowas wie "call2". |
|
|
| |
|
|
|
Christof Neuß | Hallo David,
ich habe noch mal ein kleines Beispiel für NativeProfanFree erstellt. Die ZIP-Datei enthält ALLES, inkl. Compiler, Linker etc. Das Programm enthält jetzt keine nProc. Darauf kommt's aber auch nicht an. Problem ist ja, dass die Double-Rückgaben aus xlSheetReadNumA nicht verarbeitet/umgesetzt werden können. Schau' Dir vorher vlt. mal die Beispiel.xls an.
Wenn Du Lust und Zeit hast.... Gerne auch noch in DIESEM Leben. |
|
|
| |
|
|
|
| Mein Gedanke erstmal war, dann eben nur den 32-Bit-Anteil des Wertes zu ermitteln. Dies dürfte vermutlich für die meisten Fälle schon ausreichen - wann arbeitet man schon mit Zahlen im 4-Milliarden-Bereich.
Das Paket schaue ich mir sehr gerne an. |
|
|
| |
|
|
|
Christof Neuß | Hallo,
hab' mal xlware angeschrieben und auch eine Antwort erhalten:
--------------------------------------------------- Hi Christof,
thank you for your message.
I have added a possibility to read numbers as strings and write strings as numbers in this build:
Use the Sheet::readStr() method for reading numbers too. Add CELLTYPE_NUMBER (1) parameter for writing a string as number:
sheet->writeStr(7, 5, L"200.55", 0, CELLTYPE_NUMBER);
Please note that it works only for xlsx format at the moment.
Kind regards, Dmytro Skrypnyk ---------------------------------------------------
Das Auslesen von numerischen Zellen mit readStr() funktioniert auch. Nur mit dem Schreiben habe ich Probleme. Ich weiß nicht, wie ich den Parameter übergeben soll. Was bedeutet das "L" vor "200.55"?
MERCI! |
|
|
| |
|
|
|
RGH | Ich habe die neue DLL heruntergeladen. Wie gelingt bei Dir das Lesen der numerischen Werte? Bei mir scheint sich da nichts verändert zu haben. Bist Du sicher, dass die DLL-Version, die Du hoch geladen hast, diese Fähigkeit besitzt? Poste mal Dein aktuelles Beispiel-Listing. Das mit dem Schreiben bekommen wir dann sicher auch hin.
Gruß Roland |
|
|
| XProfan X3Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 22.03.2016 ▲ |
|
|
|
|
| @Christof:
Das L bei c++ vor Stringkonstanten erspart MultiByteToWideChar, die Zeichenkette dahinter ist als WideChar zu übergeben. |
|
|
| |
|
|
|
Christof Neuß | Hallo Roland,
also die Lib scheint schon richtig zu sein. Aber Achtung, es funktioniert wohl nur in XLSX-Dateien.
Hier mein Listing und im Anhang meine XLSX-Datei.
{$pushkeyword xlCreateXMLBookA}
{$pushkeyword xlCreateBookCA}
{$pushkeyword xlBookLoadA}
{$pushkeyword xlBookSaveA}
{$pushkeyword xlBookReleaseA}
{$pushkeyword xlBookGetSheetA}
{$pushkeyword xlSheetWriteStrA}
{$pushkeyword xlSheetWritenUMA}
{$pushkeyword xlSheetReadStrA}
{$pushkeyword xlSheetReadNumA}
{$pushkeyword dt}
{$clq}
Declare hLibxl&, book&, sheet&
hLibxl& = ImportDLL("libxl.dll", "")
set("CallConv","CDECL")
Var Datei$="Beispiel.xlsX"
Var ZahlGelesen!=0
Declare Gelesen#
Dim Gelesen#, 256
proc xlSheetWriteNumD
parameters s&, x&, y& , d!, f&
declare d1&, d2&, md#
dim md#, 8' Ein Double hat 8 Byte = 64 Bit
md# = addr(d!)' Das Double wird auf den Bereich gemappt
d1& = long(md#,0)' Die ersten vier Bytes kommen nach d1
d2& = long(md#,4)' Die zweiten vier Bytes kommen nach d2
xlSheetWriteNumA(s&, x&, y&, d1&, d2&, f&)
endproc
cls
book& = xlCreateXMLBookA()
Print book&
xlBookLoadA(book&, Datei$)
IF book&
sheet& = xlBookGetSheetA(book&, 0)
Print sheet&
IF sheet&
xlSheetWriteStrA(sheet&, 9,0, "Eintrag aus XProfan: "+dt("getDate", 6), 0)
'xlSheetWriteNumD(sheet&, 10,0, 8888.88, 0)
Gelesen#=xlSheetReadStrA(sheet&, 5,0,0)
Print STRING$(Gelesen#,0)
Gelesen#=xlSheetReadStrA(sheet&, 7,0,0)' Hier ist eine Zahl gespeichert.
Print STRING$(Gelesen#,0)
ENDIF
xlBookSaveA(book&, Datei$)
xlBookReleaseA(book&)
ENDIF
Print "FERTIG!"
FreeDLL hLibXL&
WaitInput
END
|
|
|
| |
|
|
|
RGH | Hallo Christof,
das Schreiben einer Zahl als Zahl habe ich auch mit der Umwandlung in einen Widestring (StringW) und dem zusätzlichen Parameter bislang nicht nicht hinbekommen. Es landet immer nur ein String in der Excel-Datei.
Aber wenn Du meine Routine xlSheetWriteNumD benutzt, klappt es in Verbindung mit der verbesserten Lesefunktion hervorragend.
Gruß Roland |
|
|
| XProfan X3Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 22.03.2016 ▲ |
|
|
|
|
Christof Neuß | Hallo Roland,
na, das klappt doch wirklich prima. Kann ja auch sein, dass mit der geänderten Schreibfunktion tatsächlich nur Strings geschrieben werden können. Aber dann wäre der zusätzliche Parameter irgendwie unnütz. Egal. So komme ich zurecht. Vielen Dank! |
|
|
| |
|
|
|
Christof Neuß | Hallo iF,
Deine Lösung mit dem 32-bit-Anteil interessiert mich natürlich auch weiterhin. Wenn das funktioniert, habe ich auch eine Lösung für die xls-Dateien. Und....ja... ich rechne selten mit Zahlen die größer 4 Mrd. sind.
Danke! |
|
|
| |
|
|