ExcelWriter (MS-Excel '97 kompatible files erzeugen)

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag 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
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag von ABBKlaus »

Hallo Karl,

du hast völlig recht :roll:
Habs fälschlicherweise mal als Excel-97 Format bezeichnet :oops:
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
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag 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
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

Kein Stress machen deshalb

Ich persönlich komm mit der MakroLösung gut zurecht.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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 :freak:
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

:wink:

// 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 :freak:
Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Danke Thomas,
hiermit ist das invalid Memory nun weg :allright:

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. :allright:


Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten