Seite 3 von 4
Verfasst: 11.07.2006 16:30
von Karl
Hallo ABBKlaus,
wieso kann ich als Integerwerte eigentlich nur Words schreiben? Longs kann doch der Excelmann auch darstellen.
Noch was:
Excel 2003 meint, dass die mit der PB4-Lib erstellte Datei im Excel-2.1-Format vorliegt?
Gruß Karl
Verfasst: 11.07.2006 21:55
von ABBKlaus
Hallo Karl,
du hast völlig recht
Habs fälschlicherweise mal als Excel-97 Format bezeichnet
Und wohl auch wegen des alters dieses Formats ist ein Integer-Wert wohl auch nur 16-Bit gross :
6.56 INTEGER
BIFF2 BIFF3 BIFF4S BIFF4W BIFF5 BIFF7 BIFF8 BIFF8X
0002H — — — — — — —
This record represents a cell that contains an unsigned 16-bit integer value. If a value cannot be stored as a 16-bit
integer, a NUMBER record (-> 6.68) must be written. From BIFF3 on this record is replaced by the RK record (-> 6.82).
Record INTEGER, BIFF2:
Offset Size Contents
0 2 Index to row
2 2 Index to column
4 3 Cell attributes (-> 3.12)
7 2 Unsigned 16-bit integer value
http://sc.openoffice.org/excelfileformat.pdf
MfG Klaus
Verfasst: 12.07.2006 11:15
von bobobo
Darf man denn irgendwann auf Unterstützung eines annähernd
aktuellen Excel-Formats hoffen ? Oder muss ich auch in Zukunft
weiterhin mit Excel rumtricksen (*) damit ich damit meine Daten
verexcelt darstellen kann?
(*) PB-Daten -> Excel Ich erstelle meine Daten in Tabellenform. Ins
ExcelFormat speichere ich die indem ich eine VorlagenDatei mit
entsprechenden Makros öffne. Diese Makros erledigen den Rest wie
Öffnen der Quelldatei (Meist ein CSVFormat (im Gegensatz zur
Dokumentation unterstützt mein Excel das Öffnen einer solchen Datei
nur dann korrekt wenn da als Trennzeichen ein TAB benutzt wird))
Formatierung, Speicherung in einem "anständigen" Format , u.s.w.
Es macht sogar Spaß diese Makros zu erstellen.
Verfasst: 12.07.2006 12:16
von ABBKlaus
@bobobo: im moment hab Ich das nicht geplant (aus zeitgründen).
Ich weiss auch nicht ob das oben genannte PDF ausreicht um damit eine Aktuellere version (BIFF5 ist wohl Excel 97) zu proggen ?
MfG Klaus
Verfasst: 12.07.2006 12:21
von bobobo
Kein Stress machen deshalb
Ich persönlich komm mit der MakroLösung gut zurecht.
Verfasst: 20.06.2007 21:18
von Falko
ts-soft hat geschrieben:Mit der XLTable.dll von Edwin Knoppert kann man die Excel-Dateien dann auch lesen! Nur schreiben ist doch
Die DLL gibt unter:
http://www.hellobasic.com/download/xltable.zip
Eine Include für PB4:
Code: Alles auswählen
#xlAddIn = $00000012
#xlCSV = $00000006
#xlCSVMac = $00000016
#xlCSVMSDOS = $00000018
#xlCSVWindows = $00000017
#xlDBF2 = $00000007
#xlDBF3 = $00000008
#xlDBF4 = $0000000B
#xlDIF = $00000009
#xlExcel2 = $00000010
#xlExcel2FarEast = $0000001B
#xlExcel3 = $0000001D
#xlExcel4 = $00000021
#xlExcel5 = $00000027
#xlExcel7 = $00000027
#xlExcel9795 = $0000002B
#xlExcel4Workbook = $00000023
#xlIntlAddIn = $0000001A
#xlIntlMacro = $00000019
#xlWorkbookNormal = $FFFFEFD1
#xlSYLK = $00000002
#xlTemplate = $00000011
#xlCurrentPlatformText = $FFFFEFC2
#xlTextMac = $00000013
#xlTextMSDOS = $00000015
#xlTextPrinter = $00000024
#xlTextWindows = $00000014
#xlWJ2WD1 = $0000000E
#xlWK1 = $00000005
#xlWK1ALL = $0000001F
#xlWK1FMT = $0000001E
#xlWK3 = $0000000F
#xlWK4 = $00000026
#xlWK3FM3 = $00000020
#xlWKS = $00000004
#xlWorks2FarEast = $0000001C
#xlWQ1 = $00000022
#xlWJ3 = $00000028
#xlWJ3FJ3 = $00000029
#xlUnicodeText = $0000002A
#xlHtml = $0000002C
#xlWebArchive = $0000002D
#xlXMLSpreadsheet = $0000002E
;
;===================================
; Excel object
;===================================
;
Prototype.l Excel_FileToObject(szFileName.s)
Prototype.l Excel_Destroy(hObject.l)
Prototype.l Excel_GetSheetCount(hObject.l)
Prototype.l Excel_GetSheetName(hObject.l, nSheet.l)
;
;===================================
; XLTable
;===================================
;
Prototype.l Excel_SheetToXLTable(hObject.l, nSheet.l)
Prototype.l Excel_XLTable_GetMaxCols(hXLTable.l)
Prototype.l Excel_XLTable_GetMaxRows(hXLTable.l)
Prototype.l Excel_XLTable_CellIsValue(hXLTable.l, nCol.l, nRow.l)
Prototype.l Excel_XLTable_GetCellAsString(hXLTable.l, nCol.l, nRow.l)
Prototype.d Excel_XLTable_GetCellAsValue(hXLTable.l, nCol.l, nRow.l)
Prototype.d Excel_XLTable_GetCellAsValueEx(hXLTable.l, nCol.l, nRow.l, nRound.l)
Prototype.f Excel_XLTable_GetCellAsSingle(hXLTable.l, nCol.l, nRow.l)
Prototype.f Excel_XLTable_GetCellAsSingleEx(hXLTable.l, nCol.l, nRow.l, nRound.l)
Prototype.l Excel_XLTable_PutOnClipBoard(hXLTable.l)
;
;===================================
; Miscellaneous
;===================================
;
Prototype.l Excel_SaveSheetAs(szFileName.s, szFileOut.s, nxlFileType.l, nSheet.l)
Prototype.l App_GetVersionString()
;
;===================================
; Helpfunction
;===================================
;
Procedure.s GetBSTR(pBSTR.l)
ProcedureReturn PeekS(pBSTR.l,SysStringByteLen_(pBSTR.l) )
EndProcedure
Procedure XLTable_Init()
Shared XLTablehModul.l
XLTablehModul = OpenLibrary(#PB_Any, "XLTable.dll")
If XLTablehModul
Global Excel_FileToObject.Excel_FileToObject = GetFunction(XLTablehModul, "Excel_FileToObject")
Global Excel_Destroy.Excel_Destroy = GetFunction(XLTablehModul, "Excel_Destroy")
Global Excel_GetSheetCount.Excel_GetSheetCount = GetFunction(XLTablehModul, "Excel_GetSheetCount")
Shared Excel_GetSheetName_.Excel_GetSheetName
Excel_GetSheetName_ = GetFunction(XLTablehModul, "Excel_GetSheetName")
Global Excel_SheetToXLTable.Excel_SheetToXLTable = GetFunction(XLTablehModul, "Excel_SheetToXLTable")
Global Excel_XLTable_GetMaxCols.Excel_XLTable_GetMaxCols = GetFunction(XLTablehModul, "Excel_XLTable_GetMaxCols")
Global Excel_XLTable_GetMaxRows.Excel_XLTable_GetMaxRows = GetFunction(XLTablehModul, "Excel_XLTable_GetMaxRows")
Global Excel_XLTable_CellIsValue.Excel_XLTable_CellIsValue = GetFunction(XLTablehModul, "Excel_XLTable_CellIsValue")
Shared Excel_XLTable_GetCellAsString_.Excel_XLTable_GetCellAsString
Excel_XLTable_GetCellAsString_ = GetFunction(XLTablehModul, "Excel_XLTable_GetCellAsString")
Global Excel_XLTable_GetCellAsValue.Excel_XLTable_GetCellAsValue = GetFunction(XLTablehModul, "Excel_XLTable_GetCellAsValue")
Global Excel_XLTable_GetCellAsValueEx.Excel_XLTable_GetCellAsValueEx = GetFunction(XLTablehModul, "Excel_XLTable_GetCellAsValueEx")
Global Excel_XLTable_GetCellAsSingle.Excel_XLTable_GetCellAsSingle = GetFunction(XLTablehModul, "Excel_XLTable_GetCellAsSingle")
Global Excel_XLTable_GetCellAsSingleEx.Excel_XLTable_GetCellAsSingleEx = GetFunction(XLTablehModul, "Excel_XLTable_GetCellAsSingleEx")
Global Excel_XLTable_PutOnClipBoard.Excel_XLTable_PutOnClipBoard = GetFunction(XLTablehModul, "Excel_XLTable_PutOnClipBoard")
Global Excel_SaveSheetAs.Excel_SaveSheetAs = GetFunction(XLTablehModul, "Excel_SaveSheetAs")
Shared App_GetVersionString_.App_GetVersionString
App_GetVersionString_ = GetFunction(XLTablehModul, "App_GetVersionString")
EndIf
ProcedureReturn XLTablehModul
EndProcedure
Procedure XLTable_End()
Shared XLTablehModul.l
If XLTablehModul
CloseLibrary(XLTablehModul)
EndIf
EndProcedure
Procedure.s Excel_GetSheetName(hObject.l, nSheet.l)
Shared Excel_GetSheetName_.Excel_GetSheetName
ProcedureReturn GetBSTR(Excel_GetSheetName_(hObject, nSheet))
EndProcedure
Procedure.s Excel_XLTable_GetCellAsString(hXLTable.l, nCol.l, nRow.l)
Shared Excel_XLTable_GetCellAsString_.Excel_XLTable_GetCellAsString
ProcedureReturn GetBSTR(Excel_XLTable_GetCellAsString_(hXLTable, nCol, nRow))
EndProcedure
Procedure.s App_GetVersionString()
Shared App_GetVersionString_.App_GetVersionString
ProcedureReturn GetBSTR(App_GetVersionString_())
EndProcedure
Wenn man jetzt eins von beiden an dieselbe PB-Version anpaßt, ergänzen
die sich doch gut
// Nachtrag:
Sind noch ein paar Fehler in der Include, werde es später korrigieren!!!
// Nachtrag2:
korriegiert
Könntest du dieses auch für PB 4.10 anpassen?
Ich habs leider nicht hinbekommen
Gruß Falko
Verfasst: 20.06.2007 21:37
von ts-soft
Warum nutzte nicht einfach PureDisphelper?
Ich sehe keinen Sinn mehr in der DLL. Da ich auch keine Excel zur Verfügung
habe, kann ich auch nichts testen.
Ich weiß auch nicht, warum die unter PB4.10 nicht mehr laufen sollte?
Es dürften keine Änderungen erforderlich sein.
Gruß
Thomas
Verfasst: 20.06.2007 22:28
von Falko
Ich würde das ja gerne mit PureDisphelper machen.
Aber irgendwie habe ich damit noch Verständnisprobleme mit
den Objekten und Methoden sowie die passende Information für
das Anwenden zum Auslesen einer Zelle aus einer Exceltabelle, dessen
Werte ich von einer Spalte in einer anderen Spalte verschieben möchte.
Leider weiß ich im Moment nicht, wo ich hierzu die die passenden Infos
finde.
Deswegen hatte ich versucht die alte DLL anzuwenden, welche unter PB 4.1 aufgrund GetBSTR(pBSTR.l) scheitert.
Ein evtl. Grund für das Nichtfunktionieren bzw. für das Invalid Memory,
könnte sein, das ich Office 2007 habe, was ich mir aber nicht vorstellen
kann.
Gruß Falko
Verfasst: 20.06.2007 22:37
von ts-soft
Wenns an der einen Procedure liegt, was ich mir nicht so recht vorstellen kann, hier:
Code: Alles auswählen
Procedure.s GetBSTR(bstr)
If bstr
ProcedureReturn PeekS(bstr,-1,#PB_Unicode)
EndIf
EndProcedure
Dann sollte es damit gehen.
Verfasst: 20.06.2007 23:21
von Falko
Danke Thomas,
hiermit ist das invalid Memory nun weg
Dieses habe ich dann probiert:
Code: Alles auswählen
....
If XLTable_Init()
SFile.s="test.xls"
hObject.l=Excel_FileToObject(SFile)
hXLTable=Excel_SheetToXLTable(hObject, 1)
Debug App_GetVersionString()
For i= 0 To 10
For b= 0 To 10
Debug Excel_XLTable_GetCellAsSingle(hXLTable, i, b)
Next b
Next i
XLTable_End()
Else
MessageRequester("Achtung","Tabelle konnte nicht geöffnet werden")
EndIf
End
Die Version, ist wohl klar, da Excel 2007 zu derzeit noch nicht existierte.
Nur die Werte die eigentlich Floatwerde sind werden mir mit
0.0 angezeigt. Kann sein, das MS wiedermal ein anderes Format gemacht
hat, oder ich einen Fehler im source habe.
Werde wohl morgen weiter probieren.
Trotzdem, danke für die Procedure womit das invalid Memory nicht
mehr auftaucht.
Gruß Falko