Seite 1 von 6
Aus PB Excel-Datei mit mehreren Tabellenblättern erstellen?
Verfasst: 13.01.2007 00:40
von hiltwin
Guten Abend miteinander,
ich trickse mit nachfolgendem Code eine Exceltabelle herbei, indem ich die erstellte Datei einfach die .xls-Endung ranhänge.
Code: Alles auswählen
SaveName$ =SaveName$ + ".xls"
EndIf
If SaveName$
FF = CreateFile(0, SaveName$)
abc$="Spalte 1"+Chr(9)+"Spalte 2"+Chr(9)+"Spalte 3"+Chr(9)+"Spalte 4"+Chr(9)+"Spalte 5"
WriteStringN(0,abc$)
For reihen = 0 To reihenmax
abc$="Spalte 1"+Chr(9)+"Spalte 2"+Chr(9)+"Spalte 3"+Chr(9)+"Spalte 4"+Chr(9)+"Spalte 5"
WriteStringN(0,abc$)
Next
CloseFile(0)
MessageRequester(SaveName$,GetFilePart(SaveName$)+" geschrieben",0)
Else
; Couldn't read file
EndIf
Funktioniert ja auch ganz prima. Allerdings wäre es genial, wenn man durch einen weiteren Trick auch noch zusätzlich unterschiedliche Tabellenblätter in Excel generieren könnte.
Hat das schon mal jemand geschafft mit einfachen Mitteln, oder gibts dazu irgendwelche Hilfsmittel?
Bin für jede Idee und Anregung dankbar ...
Frdl. Gruss
Hiltwin
Verfasst: 13.01.2007 00:55
von AND51
Durch Tabulator getrennte Werte oder CSV (Comma Separated Values) Dateien lassen nur 1 Mappe zu.
Das merkt man, wann man mit Excel die Sachen als CSV speichern will, es erscheint dann ein entsprechender Hinweis.
Will sagen: Nein, ich kenne keine "einfachen" Hilfsmittel.
Verfasst: 16.01.2007 07:51
von dysti
Warum nimmst du nicht gleich ODBC und SQL, dann schreibst du direkt in die Exeltabelle. Dann hast du auch die Möglichkeit, ein Tabellenblatt anzulegen.
Die Methode ist nicht viel komplizierter.
Es kann aber auch sein, das du bestimmte Gründe hast, genau dieses Format zu nehmen oder probierst du nur aus?
Verfasst: 16.01.2007 11:59
von bobobo
@dysti Wie legst Du per ODBC in Excel Tabellenblätter an?
Ansonsten::
Der Umgang mit Excel per ODBC ist ja wohl mehr als krüppelig
und eigentlich auch nicht richtig handlebar.
Ich hatte mal folgende funktionierende(!!) Lösung geschustert.
Erzeugen einer CSV-Tabelle und Import in eine Excel-Datei durch
Aufruf einer vorbereiteten XLS-Datei, die ein entstprechendes Autostart-
Makro beinhaltet, welches die CSV-Datei einläd und etwas formatiert und
eine XLS-Datei abspeichert. Muss man allerdings das SicherheitsDings in
Excel anpassen (Makroabfrage auf Auswahl)
Verfasst: 16.01.2007 13:17
von dysti
Hier ein Beipiel aus dem Forum, was ich modifiziert habe:
Code: Alles auswählen
;-TOP
; Kommentar : Excel Tabelle lesen über SQL
; Version : v1.01
; Author : Michael Kastner
; Datei : FcDatabase.pb
; Erstellt : 28.09.2006
; Geändert :
; ***************************************************************************************
#ODBC_ADD_DSN = 1; // Add data source
#ODBC_CONFIG_DSN = 2; // Configure (edit) Data source
#ODBC_REMOVE_DSN = 3; // Remove data source
#ODBC_ADD_SYS_DSN = 4; // add a system DSN
#ODBC_CONFIG_SYS_DSN = 5; // Configure a system DSN
#ODBC_REMOVE_SYS_DSN = 6; // remove a system DSN
#ODBC_REMOVE_DEFAULT_DSN = 7; // remove the default DSN
; ***************************************************************************************
Procedure.s AddDSN(driver.s, databasename.s, user.s, pass.s)
name.s = GetFilePart(databasename.s)
name = Left(name.s, Len(name.s) - 4)
name = "Pure" + name
Select UCase(driver)
Case "ACCESS"
strDriver.s = "Microsoft Access Driver (*.mdb)"
Case "EXCEL"
strDriver.s = "Microsoft Excel Driver (*.xls)"
Default
strDriver.s = driver
EndSelect
strAttributes.s = "Server=APServer;Description=" + name
strAttributes.s + ";DSN=" + name
strAttributes.s + ";DBQ=" + databasename
strAttributes.s + ";UID=" + user
strAttributes.s + ";PWD=" + pass + ";"
MyMemory = AllocateMemory(Len(strAttributes)) ; Allocate the memory you need here
CopyMemory(@strAttributes, MyMemory, Len(strAttributes)) ; Copy the database information string into the memory space
For L = 1 To Len(strAttributes) ; Check the string in the memory space now
If PeekB(MyMemory + L - 1) = Asc(";") ; If you find a semicolon anywhere in the string
PokeB(MyMemory + L - 1, 0) ; Replace it with an empty character as the driver doesn't use it
EndIf ; End the current check
Next L ; Check the next byte
result = SQLConfigDataSource_(0, #ODBC_ADD_DSN, strDriver, MyMemory) ; Call the function you need from the ODBC library with the right details
FreeMemory(MyMemory) ; Free the memory now
If result
ProcedureReturn name
Else
ProcedureReturn ""
EndIf
EndProcedure
; ***************************************************************************************
Procedure.l RemoveDSN(driver.s, databasename.s, user.s, pass.s)
name.s = GetFilePart(databasename.s)
name = Left(name.s, Len(name.s) - 4)
name = "Pure" + name
Select UCase(driver)
Case "ACCESS"
strDriver.s = "Microsoft Access Driver (*.mdb)"
Case "EXCEL"
strDriver.s = "Microsoft Excel Driver (*.xls)"
Default
strDriver.s = driver
EndSelect
strAttributes.s = "DSN=" + name + ";"
MyMemory = AllocateMemory(Len(strAttributes)) ; Allocate the memory you need here
CopyMemory(@strAttributes, MyMemory, Len(strAttributes)) ; Copy the database information string into the memory space
For L = 1 To Len(strAttributes) ; Check the string in the memory space now
If PeekB(MyMemory + L - 1) = Asc(";") ; If you find a semicolon anywhere in the string
PokeB(MyMemory + L - 1, 0) ; Replace it with an empty character as the driver doesn't use it
EndIf ; End the current check
Next L ; Check the next byte
result = SQLConfigDataSource_(0, #ODBC_REMOVE_DSN, strDriver, MyMemory) ; Call the function you need from the ODBC library with the right details
FreeMemory(MyMemory) ; Free the memory now
ProcedureReturn result
EndProcedure
; ***************************************************************************************
;- Test
#Datenbank1 = 1
InitDatabase()
Path.s = "C:\test\Telefon.xls"
; DSN anlegen
Base.s = AddDSN("Excel", Path,"","")
If Base
Debug "DSN=" + Base
If OpenDatabase(#Datenbank1, Base, "", "")
sql1.s="create table adressen (Vorname CHAR(40),Name char(40))"
If DatabaseQuery(#Datenbank1, sql1)
Else
MessageRequester("","Erstellen der Tabelle fehlgeschlagen")
EndIf
sql1.s="insert into adressen(Vorname,Name) VALUES('Dysti','Purebasic')"
DatabaseQuery(#Datenbank1, sql1)
sql1.s = "Select * From [adressen$]"
If DatabaseQuery(#Datenbank1, sql1) ; Ermittelt alle Einträge in der 'employee' Tabelle
Spalten = DatabaseColumns(#Datenbank1) - 1
temp.s = ""
For Spalte = 0 To Spalten
temp + DatabaseColumnName(#Datenbank1, Spalte) + ";"
Next
Debug temp
While NextDatabaseRow(#Datenbank1) ; alle Einträge durchlaufen
temp.s = ""
For Spalte = 0 To Spalten
temp + GetDatabaseString(#Datenbank1, Spalte) + ";"
Next
Debug temp
Wend
EndIf
Else
MessageRequester("","Konnte die Datenbank nicht öffnen")
EndIf
CloseDatabase(#Datenbank1)
EndIf
; DSN am Ende entfernen
RemoveDSN("Excel", path, "", "")
Verfasst: 16.01.2007 13:36
von dysti
Also, da sag mir mal einer, das über ODBC eine Exeldatei nicht einfach händelbar ist. Purebasic und SQL ist schon fast unschlagbar und professionell auch. Es ist halt Datenbankmanagement.
Aber bitte nicht auf diesen Satz antworten, es ist halt meine persönliche Meinung.
Noch ein Vorteil gibt es mit dieser Methode:
Wenn man mit WriteStringN einen Datensatz einfügt und es kommt in diesem Moment zum Stromausfall, ist die Datendatei im schlimmsten Falle total hinne. Über ODBC bleiben die Daten erhalten. Ich habe es mit einem alten Rechner unter WIN98 mehrfach probiert.
Danach war die Festplatte auch hinne.

Verfasst: 16.01.2007 13:57
von Kiffi
<OT>
dysti hat geschrieben:Purebasic und SQL ist schon fast unschlagbar und professionell auch. [...]
Aber bitte nicht auf diesen Satz antworten, es ist halt meine persönliche Meinung.
Deine Meinung in Ehren, aber alleine die Tatsache, dass man auf Felder nicht
mit ihrem Namen sondern mit einem Index zugreifen muss, macht die
Datenbankfunktionalitäten von PB für mich persönlich unbrauchbar (von
ODBC vs. ConnectionString mal ganz zu schweigen). 'unschlagbar' und
'professionell' ist das nicht. Wer schon mal mit ADO & Co gearbeitet hat, der weiß,
wie komfortabel Datenbankprogrammierung sein kann.
</OT>
Grüße ... Kiffi
Verfasst: 16.01.2007 16:52
von dysti
Hallo,
normalerweise wollte ich nicht antworten, aber....
Man darf nicht Äpfel mit Birnen vergleichen. Wenn man diesen Vergleich heranzieht, dann müßte festgestellt werden, das Purebasic einfach ein Krampf ist. Wenn man mit VB und VB.Net geprogt hat, weiß wie konfortabel eine Programiersprache sein kann, allein ADO und Konsorten.
Aber mal im Ernst: Alle Microsoftprodukte arbeiten intern mit SQL.
Selbst mit ADO baust man eine sogenannte "ODBC-Verbindung" auf.
Auch unter ADO hast du den Connectionstring. Einfacher hatten wir das zu Clipper- und DBase-Zeiten. Nun gut.
Ich will hier jetzt nicht ins Einzelne gehen.
Wir sollten hier nicht Offtopic gehen und erstmal eine Reaktion von "hiltwin" abwarten. Denn darum geht es ja hier, um ihn weiter zu helfen.
Verfasst: 16.01.2007 19:06
von Kiffi
dysti hat geschrieben:Wenn man diesen Vergleich heranzieht, dann müßte festgestellt werden, das Purebasic einfach ein Krampf ist.
ich will hier auch keinen Flamewar lostreten.
Mich hat halt nur folgender Satz gestört:
dysti hat geschrieben:Purebasic und SQL ist schon fast unschlagbar und professionell auch.
Grüße ... Kiffi
Verfasst: 16.01.2007 19:37
von bobobo
danke
und Blätter in einer vorhandenen XLS-Datei ?