Excel Sheet aus SQL Datenbank erstellen

  • Hallo Zusammen,

    ich habe diese Frage bereits in einem Datenbankforum gestellt, jedoch wurde mir dort mitgeteilt, dass es weniger mit SQL zu tun hat und ich mich doch eher an ein PHP Forum wenden soll (http://www.datenbankforum.com/…datenbank-erstellen.4626/). Ich hoff mal, das ist jetzt kein Crosspost, nur ich war wohl vorher an der falschen Adresse.


    ich arbeite an einer Datenbank Website. Die Rohdaten dafür liegen in einer riesigen Exceldatei, die ich mittels einem Pearl Skript in die SQL Datenbank schieb. Von dort aus werden die Daten über SQL-Abfragen auf der Website dargestellt mittels PHP/HTML.

    Der Benutzer kann verschiedene Kriterien festlegen, anhand derer wird dann dynamisch eine Ergebnisliste angezeigt.

    Nun besteht die Anforderung darin, dass der Benutzer auf einen Button klicken kann, und dann automatisch die Ergebnisse in Excel angezeigt werden.

    Da aber noch mehrere Informationen in der Excelliste angezeigt werden sollen, hab ich vor eine separate SQL-Abfrage zu machen, und diese dann in Excel anzeigen zu lassen.

    Bei meiner Internetrecherche stoß ich immer wieder auf MS Access, in meinem Fall soll ja aber der Benutzer die Möglichkeit haben, per Mausklick auf einen Button sich direkt die Ergebnisse als Excel Liste downzuloaden. Kann mir hier jemand helfen?

    Vielen Dank im Voraus

  • Hey,


    da kann ich dich beruhigen. Das ist kein Crosspost.


    Du möchtest eine CSV-Datei erstellen welche dann der User als Download angeboten bekommt?


    Du kannst da so vorgehen:

    1. Die Daten die du brauchst in der DB selektieren und fetchen
    2. Diese Daten in eine CSV-Datei schreiben
    3. Diese CSV-Datei dann als Download im https://www.w3schools.com/tags/tag_a.asp-Tag mit dem Attribut download ausgeben.


    Dazu brauchst du folgende PHP-Funktionen:

    Und das Semikolon ( ; ), damit jeder Wert eine eigene Zelle erhält.


    Oder du benutzt diese Exel-Klasse. Dieses ist aber bereits 3 Jahre alt und wird denke ich nicht mehr supportet.


    Stef

  • Ich würde eine Schaltfläche ( <a>-Tag geht auch ) nehmen und den Process des Aufbaus und Download per PHP direkt verabeiten.


    Beim Dateiformat sollte man beachten, dass eine CSV nicht selten nicht direkt mit Excel eingelesen werden kann. Man muss den Feldtrenner/-delimiter dann noch manuell angeben oder die Daten per Excel-Funktion Daten -> Aus Text ( oder war es Datei? ) importieren.


    Eine Excel-Klasse hat allerdings oft den Nachteil, dass sehr viel Speicher verbraucht wird für eine einzige Zelle.


    Die Entscheidung ist also aus meiner Sicht immer 50:50, wobei ich vermutlich zu CSV tendieren würde, da dies allgemeiner und relativ flach gehalten ist.

  • Bin grad beim coden und googeln auf noch etwas anderes gestoßen, den Excel Button (https://www.microsoft.com/en-u…ringing-excel-everywhere/). Angeblich nur 2 Codezeilen einfügen und es sollte gehen:



    1. Copy and paste this code above the HTML table you want to add the Excel Button to:

    <a href=”#” name=”MicrosoftExcelButton” data-xl-buttonStyle=”Standard”></a>

    2. Copy and paste this code (as a single line) right above the closing body tab (</body>):

    <script type=”text/javascript” src=”http://r.office.microsoft.com/r/rlidExcelButton?v=1&kip=1″></script>



    Ist aber schätz ich auch veraltet, oder kennt ihr das? Bei mir funktioniert das aufjedenfall nicht.

    Die dynamische Tabelle hab ich mittlerweile fertig gefetched, jetzt versuch ich mal die Funktionen ausen rum zu bauen.

  • So ich hab mich jetzt mal dran versucht..


    Query

    PHP
    $query_excel1 = "SELECT * FROM $database_name  
    JOIN $pl  ON $pl.template_id_$peptype = $database_name.id_excel 
    JOIN $database_name_eb ON $database_name_eb.evidence_nr = $pl.pep_evidence_id  
    WHERE ($pl.first_approver_".$peptype."_".$lang."_1 LIKE '$first_approver_1' or  $pl.first_approver_".$peptype."_".$lang."_2 LIKE '$first_approver_1' or  $pl.first_approver_".$peptype."_".$lang."_3 LIKE '$first_approver_1')
    && ($database_name_eb.evidence_type_".$lang." LIKE '$evidence_type') 
    && ($database_name_eb.responsible_function_".$lang." LIKE '$responsible_function') 
    && ($database_name_eb.evidence_level LIKE '$evidence_level') 
    && ($evidence_relevance_query_all)&&($pl.evidence_display = 'x') 
    ORDER BY $spal $sort ";
    $result_excel1 = mysqli_query($link, $query_excel1) or die("Request failed: " . mysqli_error($link));


    Nach der Query hab ich dann ne Tabelle aufgebaut, die ich einfach mit Display style dann ausblenden kann.


    Danach hab ich die genannten Funktionen eingebaut, um erstmal eine test.csv zu erstellen und hab die dann mit dem Array befüllt. Dann noch den Button zum download eingefügt und die php Datei geschlossen



    Ich wollt das jetzt erst auf meinem localhost testen. Es wird kein Fehler angezeigt und der Downloadbutton steht auch da. Nur wenn ich jetzt drauf klicke fragt er ob ich test_csv herunterladen möchte, und sagt dann test_csv konnte nicht heruntergeladen werden. Des müsste ja auch eigentlich test.csv sein..


    Danke für eure Mühe


    edit: Die Datei die ich dann aufn PC hat heißt auch ganz komisch: test_csv.pevkgcg.partial

  • Du verwendest immer noch printf komplett aus dem Kontext gerissen.

    Hat mit Deinem Excel-Problem nichts zu tun, aber erschreckend, wie ahnungslos einige einfach irgendwelche Funktionen verwenden, ohne zu wissen, wozu die da sind...


    Aber zum Thema: Was hat Deine Lösung jetzt mit Excel zu tun?

  • Ja stimmt des hattest mal gesagt, dass ich des alles als echo machen soll.


    Naja eine .csv Datei kann ich mit Excel dann öffnen?


    Ich seh grad ich hab meinen Eintrag nochmal bearbeitet nachdem du geantwortet hast scheinbar, weiß nicht ob vorher schon der ganze Code da war

  • Aber eine CSV kannst Du doch auch direkt aus der Datenbank aufbauen und speichern.

    Wozu der Umweg über die HTML-Tabelle?


    Vielleicht habe ich Dich auch falsch verstanden, sollen die Ergebnisse erst angezeigt werden, bevor man sie runterladen kann?

  • Die Ergebnisse werden bereits angezeigt als eigenständige Tabelle weiter oben im Code.

    Da kann man dann auf die Ergebnisse klicken und Modals öffnen, mit weiterführenden Informationen. Beim Download soll aber alles sauber Spalte für Spalte dastehen, deswegen muss ich ne neue Tabelle machen, die in die gewünschte Reihenfolge bringen, und sobald es geht will ich die einfach mit Display style=None ausblenden.

  • Um alle Informationen dem Benutzer ordentlich präsentieren zu können, brauch ich in der Ergebnistabelle Modals, weil die Tabelle ohne die viel zu groß ist. Die Modalinformationen kann der Benutzer bei der sichtbaren Ergebnistabelle per Klick auf den Namen des Ergebnisses öffnen. Im Code stehen die Informationen fürs Modal also mitten drin.


    In der Exceltabelle (csv Datei) die der Benutzer runterladen kann, müssen dann aber alle Informationen sauber nacheinander aufgeführt werden. Dies bedeutet, dass ich ein andere Tabellenstruktur brauch, als die, die der Benutzer auf der Website sieht. Da muss auch die Reihenfolge der Spalten verändert werden, und ich dachte das ist dann am einfachsten einfach schnell ne neue Tabelle zu machen und die dann auszublenden. Den Code den ich gepostet hat ist auch nur ein sehr kleiner Teil davon, wie umfangreich die Tabelle am Ende dann eigentlich wird. Jedoch sollte ich ja so erstmal die Funktionalität der Downloadfunktion für eine .csv Datei herstellen können. Aber allein bei der kleinen Tabelle, stimmt ja schon irgendwas nicht weil die Downloaddatei bei mir ja dann "test_csv" und nicht "test.csv" heißt, obwohl ich "test.csv" als namen beim fopen gemacht hab..

  • Okay die csv Datei runterladen klappt jetzt. Hab


    PHP
    echo '<button><a href="/test.csv" download>download</button>';


    geändert in

    PHP
    echo '<button><a href="test.csv" download>download</button>';


    Allderdings sieht das aus wie Kraut und rüben.. Alles durcheinander und überhaupt nicht in der Tabellenform, wie ich das anzeigen lass..

  • Nur damit wir uns nicht missverstehen.

    Welchen Bezug hat die ausgeblendete Tabelle zu den Modals oder dem Download?


    Bei Klick auf den Button lädst Du eine Datei runter. Ich vermute - korrigiere mich, wenn ich falsch liege -, dass dann auf SQL Seite eine CSV mit exakt den Daten der ausgeblendeten Tabelle erstellt wird?

  • Ne das ist genau richtig wie du es sagst.


    Ich glaub das Problem liegt schonmal daran, dass ich die ausgeblendete Tabelle einfach unten an die ursprüngliche Tabelle, die der Benutzer sieht, dran gehängt hab. Denn er schreibt in mein $result_excel1 auch alle anderen Daten, die ich in der ausgeblendeten Tabelle noch gar nicht stehen hab. Das heißt der Bezug ist schonmal falsch. Ich schätz es macht mehr Sinn die Downloadfunktion in einer eigenen PHP Datei zu schreiben, und darauf irgendwie Bezug nehmen mit include oder sowas..


    bzw weißt du da den richtigen Syntax? Ich muss ja dann mit dem Button eine andere PHP Datei aufrufen. Ich hab bezieh mich schonmal aus ner anderen Datei, da hab ich das per Linkübergabe gemacht


    PHP
    echo '<form method="POST" action="result_evidence_book.php?milestone='.$milestone.'&peptype='.$peptype.'&pl='.$pl.'&lang='.$lang.'&first_approver_1='.$first_approver_1.'" target="evidencebook_result">', PHP_EOL;


    und dann würde ich den button einfach so in der Art machen:


    PHP
    echo '<button><a href="test.csv" download><input type="submit" name="Submit" value="Download"></button>';
  • Also wenn das so richtig ist, wie ich das verstanden habe, verstehe ich den Sinn der ausgeblendeten Tabelle weiterhin nicht!


    IST-Zustand:

    Du erstellst eine Datei test.csv und mit den Daten, die darin generiert wurden parallel dazu eine HTML-Tabelle, die Du aber ausblendest.

    Ein BUTTON soll dafür sorgen, dass die generierte Datei heruntergeladen werden kann ( was, um es nochmal zu erwähnen, keinen Bezug zur ausgeblendeten Tabelle hat ).


    WARUM-NICHT-SO#1-Zustand (mein Favorit):

    Lass das Erstellen der Datei an der Stelle sein und baue keine HTML-Tabelle, die eh nicht angezeigt wird.

    Bei Klick auf den BUTTON generierst Du zunächst die Datei entsprechend und forcierst den Download direkt.


    WARUM-NICHT-SO#2-Zustand:

    Wenn Du unbedingt erst die Datei erstellen und den BUTTON dann erst anbieten willst, kannst Du doch zumindest die ausgeblendete Tabelle ganz weglassen.

    Die hat keinerlei Wichtigkeit aus meiner Sicht.

  • Nachdem ich kompletter Programmierneuling bin, schien mir das, für mein "Können"., einfachste zu sein eine HTML Tabelle zu bauen, die genauso aussieht wie es dann in Excel aussehen soll.


    Deine Vorschläge klingen klar deutlich besser und ist mit Sicherheit auch die "saubere" Lösung meiner Problemstellung.

    Dazu müsste ich dann folglich in SQL einen CREATE TABLE einbauen, bei dem ich dann die einzelnen Spalten die, die ich brauch, abfrage und dann mit UNION zu einem Table vereine. Ist der Gedankengang richtig?


    Dann müsste ich ja nurnoch schauen wie ich die Funktion in den Button einbau, um das ganze erst beim Klick auszuführen.

  • Ist der Gedankengang richtig?

    Nein. Du erstellst doch aktuell auch schon eine CSV. Das machst Du doch nicht auf Basis einer fremden Tabelle, sondern der bestehenden.

    Das Erstellen der Datei musst Du einfach nur erst dann ausführen, wenn der User den Button klickt.


    Dann müsste ich ja nurnoch schauen wie ich die Funktion in den Button einbau, um das ganze erst beim Klick auszuführen.

    Der Button repräsentiert einfach nur einen Link zu einer PHP-Datei, die das ganze ausführt...

  • Ne so wie die in Excel angezeigt werden soll besteht die Tabelle leider noch nicht.

    Die Ergebnisliste die angezeigt wird, zieht sich die Tabelleninhalte über die Querys aus der SQL Datenbank jedes mal, je nach Benutzereingabe dynamisch. Jedoch sind hier die Spaltenreihenfolge anders und die weiterführenden Informationen hängen im Modal. Deswegen dachte ich ja, muss ich eine neue Tabelle erzeugen, die genauso aussieht, wie sie dann in der CSV aussehen soll.


    Ok des mim Button hab ich verstanden danke.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!