• 25.04.2024, 11:38
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

TheZonk

Junior Member

Excel->Sql Automatisch

Dienstag, 28. März 2006, 13:50

Servus, ich würd gern automatisch oder über ne asp seite (sei es auf nen button drücken der eine Prozedur aufruft) eine Excel Tabelle in eine Sql-Datenbank übertragen, könnt ihr mir darüber irgendwelche informationen geben(möglichst viele natürlich ;) )
greets, Danke im vorraus

Re: Excel->Sql Automatisch

Dienstag, 28. März 2006, 14:29

Z.B. die Excel-Daten als CSV (Comma Separated Values) exportieren und mit einem Mini-Script in SQL-Statements umwandeln.

Ich war mal so frei:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
"""csv2sql.py

Transform CSV data into SQL statements.
"""

import os
import sys


def csv2sql(infile, outfile, table):
    """
    Read a file of comma-separated values and write them, wrapped in SQL
    INSERT statements, into a new file.
    """
    inf = open(infile, 'r')
    outf = open(outfile, 'w')
    for line in inf:
        line = line.strip()
        if line == '':
            continue
        fields = line.split(';')
        outf.write('INSERT INTO `%s` VALUES (`%s`);\n' % (table, '`, `'.join(fields)))
    inf.close()
    outf.close()


if __name__ == '__main__':
    if len(sys.argv) != 4:
        print 'Usage: %s <input (CSV) filename> <output (SQL) filename> <table name>' \
            % os.path.basename(sys.argv[0])
        sys.exit(2)
    csv2sql(sys.argv[1], sys.argv[2], sys.argv[3])


Update: Seit Version 2.3 enthält die Python-Distribution das Modul 'csv', mit dem sich oben definierte Methode verkürzen lässt und dass zudem auf CSV-Dialekte u.a. auch von Excel eingeht:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import csv

...

def csv2sql(infile, outfile, table):
    """
    Read a file of comma-separated values and write them, wrapped in SQL
    INSERT statements, into a new file.
    """
    outf = open(outfile, 'w')
    for row in csv.reader(open(infile, 'rb'), delimiter=';'):
        outf.write('INSERT INTO `%s` VALUES (`%s`);\n' % (table, '`, `'.join(row)))
    outf.close()

...


(Um den Quellcode zu kopieren, am besten auf 'Zitieren' drücken und daraus kopieren, dann bleibt die - essentielle - Einrückung erhalten.)

Eingabedatei 'test.csv':

Quellcode

1
2
3
1;Peter;Müller
2;Hans;Wurst
3;Birne;Helene


Programmaufruf über Kommandozeile:

Quellcode

1
python csv2sql.py test.csv test.sql mytable


Erstellte Ausgabedatei 'test.sql':

Quellcode

1
2
3
INSERT INTO `mytable` VALUES (`1`, `Peter`, `Müller`);
INSERT INTO `mytable` VALUES (`2`, `Hans`, `Wurst`);
INSERT INTO `mytable` VALUES (`3`, `Birne`, `Helene`);


Den aktuellen Python-Installer für Windows gibt es übrigens hier: http://www.python.org/ftp/python/2.4.2/python-2.4.2.msi

Viel Spaß.

TheZonk

Junior Member

Re: Excel->Sql Automatisch

Mittwoch, 29. März 2006, 13:40

Auf die art muss ich allerdings an jedem Client python installieren wenn ich das richtig verstanden habe! und dann muss ich irgendwie die test.sql als query starten, was die clients nicht können weil sie keine AdminRechte habe, aber trotzdem danke.
greets
Der Zonk

TheZonk

Junior Member

Re: Excel->Sql Automatisch

Mittwoch, 29. März 2006, 13:45

CSVs kann ich mit "Bulk Insert" direkt "Massenkopieren", allerdings ist das ziemlich blöd weil die Tabelle perfekt die richtige anzahl Spalten haben muss, man hat da wie ich mitbekommen hab in der richtung überhaupt keine möglichkeit das variabler zu gestalten ausser über Client fragen wieviel Spalten, und dann in abhängigkeit dessen eine jeweils grosse temporäre tabelle aufzumachen..... ziemlich kacke!
Wenn ich das mit einer .xls mache kommen nur Symbol zeichen raus, ist eigentlich auch logisch wenn man sich mal eine .xls mit dem text-editor anschaut.

Re: Excel->Sql Automatisch

Mittwoch, 29. März 2006, 15:32

Zitat von »TheZonk«

Auf die art muss ich allerdings an jedem Client python installieren wenn ich das richtig verstanden habe! und dann muss ich irgendwie die test.sql als query starten, was die clients nicht können weil sie keine AdminRechte habe, aber trotzdem danke.

Dass das auf mehreren Clients aufgerufen werden soll, ich kann ja nicht ahnen. Wenn Python das Problem ist, lässt sich das ganze auch in eine .exe quetschen. Alternativ kann man das ganze zentral auf einem Webserver machen, auf den man vom Client per Webbrowser zugreift.

Was .xls angeht, sind die Chancen trotz der Verbreitung nicht so hoch. Wenn die Dokumente allerdings von OpenOffice ausgespuckt würden und entsprechend im OpenDocument-Format (Beinhaltet das Tabellen? Egal, ansonsten ist das OOo1.x/StarOffice-Format AFAIK auch nur XML) sind, könnte man die (sogar vorzugsweise zentral auf 'nem Server) kurz parsen und direkt in die Datenbank einfügen.

Die Spaltenzahl muss natürlich stimmen und für jedes Diagramm eine neue Tabelle anhand dessen Spalten zu erstellen ist wohl keine so gute Idee.

Edit: In meinem ersten Beitrag habe ich eine zweite Version hinzugefügt, die das csv-Modul von Python benutzt. Vielleicht ist das ja nochmal für jemanden interessant.

TheZonk

Junior Member

Re: Excel->Sql Automatisch

Donnerstag, 30. März 2006, 13:05

ich habe das problem jetzt mehr oder weniger anders gelöst,
ich mach in einer ASP eine Verbindung zum Excel lese die daten aus, und von da aus kann ich problemlos spalten vergleichen und so sinnvoll einfügen (ich habe ja vorallem das problem das da auch clients dransitzen die nicht nur keine rechte haben, sondern auch noch überhaupt keine ahnung).
Das ganze sieht dann von der Verbindung zum Excel so aus:

Set oConn = CreateObject("ADODB.Connection")
oConn.Open "DBQ=" & Server.MapPath("Data.xls") & ";" & "DRIVER={Microsoft Excel Driver (*.xls)};"
Set Rs = oConn.Execute("SELECT * FROM named_table")

jetzt hab ich in dieser Form allerdings das problem das ich im Excel einem Bereich einen Namen geben muss (Einfügen->Namen->Definieren), die Tabelle selbst kann ich mit select * from nicht ansprechen, wenn kein benamter bereich vorhanden ist, bzw. wenn ich den tabellennamen angebe dann bringt er natürlich einen fehler!statt dem in der Klammer hinter oconn.open, hab ich auch schon "Provider=Microsoft.Jet.OLEDB.4.0;Excel 8.0;DATABASE=" & Server.MapPath(CDATABASE) probiert aber es ist das gleiche! hoffentlich weis da jemand was, weil wenn ich das mit dem Namen definieren hier irgendwem beibringen muss dann verzweifel ich. THX
Der Zonk