PHP - aus Excel lesen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • PHP - aus Excel lesen

      Hallo liebe Community,

      erstmal schildere ich, was ich überhaupt mache, bzw. was geplant ist:

      Auf der Arbeit soll ich (für konzernweite Nutzung) einen Kalender (in PHP) programmieren, wudurch geplante/eingetretene Ausfallzeiten unserer verschiedenen Systeme angezeigt werden. Dient dazu, dass "nicht-IT-Mitarbeiter" schnell und unkompliziert sehen können, wann welche Anwendungen nicht verfügbar sind und wie lange in etwa.

      Dazu hab ich zunächst das HTML Grundgerüst gebaut inkl. einiger PHP Funktionen für den Kalender. Der Kalender wird unten in einer Monatsansicht angezeigt, sprich

      ~ Aktueller Monat ~ Nächster Monat ~ Übernächster Monat

      Das läuft auch alles soweit, Markierungen von Wochentagen und Wochenenden sind drin und die Datumsberechnung funktioniert.

      Nun hab ich oberhalb des Kalenders eine HTML Tabelle eingebaut. Jede Spalte/Zeile greift sich aus ner Excel Tabelle einen Wert und fügt ihn in die jeweilige Spalte/Zeile auch ein (realisiert mit PHPExcelReader, falls es jemanden interessiert).

      Allerdings soll sich die Tabelle oben mitsamt der Einträge laut Vorgabe durch Checkboxen so aktualisieren lassen, dass man filtern kann nach eingetretenen und geplanten Störungen. Die sind in der *.xls-Datei als je ein Worksheet hinterlegt. Funktioniert noch nicht, ist aber das kleinere Übel.

      Weiterhin sollen sich die Tabelleneinträge am Kalender orientieren. Wenn also der "Kunde" einen Monat nach vorne blättert, sollen sich die Tabelleneinträge automatisch dem aktuell ganz vorne stehenden Monat anpassen.

      Hat irgendjemand schonmal mit ExcelReader gearbeitet oder eine andere Möglichkeit, die Einträge so zu filtern? Momentan regel ich es über eingebundene Funktionen in der Tabelle, diese geben allerdings nur die Werte von oben nach unten aus, ohne jeglichen Filter.


      PHP-Quellcode

      1. function Excel1() {
      2. ini_set('memory_limit', '10M');
      3. // Excel Reader einbinden, Error reporting definieren
      4. error_reporting( E_ALL & ~(E_DEPRECATED ) );
      5. require_once("Excel/reader.php");
      6. // Objekt erstellen, Encoding definieren
      7. $xls=new Spreadsheet_Excel_Reader();
      8. $xls->setOutputEncoding("UTF-8");
      9. // Die Datei oeffnen
      10. $xls->read("G:\Betriebsstatistiken\kalendertest.xls");
      11. // durch die Worksheets gehen
      12. $counter=0;
      13. foreach($xls->boundsheets AS $worksheet )
      14. {
      15. $sheet=$xls->sheets[$counter];
      16. // worksheet ist der Zeiger in die Info der Tabelle
      17. // sheet ist der Zeiger in die Daten der Tabelle
      18. $cols=$sheet['numCols'];
      19. $rows=$sheet['numRows'];
      20. $celldata=$sheet['cells'];
      21. $headrow=2;
      22. for($x=2;$x<=2;$x++)
      23. {
      24. $ausgabe=$celldata[$headrow][$x]."";
      25. echo $ausgabe;
      26. }
      27. $counter++;
      28. echo "<br /><br />";
      29. }
      30. }
      Alles anzeigen


      So sieht eine dieser Funktionen aus. Habs hilfsmäßig mal bisschen mit Kommentaren versehen, damit man erkennen kann, was da vor sich geht.


      Bin für jeden Ansatz dankbar!

      Grüße, blanK.
    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )

    • Also wenn ich das richtig verstehe zeigt er jetzt schon alle Daten an richtig?
      Wenn dem so ist, könnte man doch einen Javascript Filter bauen der das ganze OnTheFly Filtert. Wobei ich hier auch nicht ganz weiß um wieviele Daten es sich handelt.

      Aber rein theoretisch sollte es so machbar sein. Hab damals auch einen Live Filter für diverse Statistik und Anzeige Tabellen gebaut (Artikel, User, Seiten......)

      Liebe Grüße
      Ulle
    • ulle;263519 schrieb:

      Also wenn ich das richtig verstehe zeigt er jetzt schon alle Daten an richtig?
      Wenn dem so ist, könnte man doch einen Javascript Filter bauen der das ganze OnTheFly Filtert. Wobei ich hier auch nicht ganz weiß um wieviele Daten es sich handelt.

      Aber rein theoretisch sollte es so machbar sein. Hab damals auch einen Live Filter für diverse Statistik und Anzeige Tabellen gebaut (Artikel, User, Seiten......)

      Liebe Grüße
      Ulle


      Hey, danke schonmal für deine Anregung. Werd es mir mal anschauen und bisschen rumtesten. Hatte mich wohl zu sehr in PHP festgebissen.. :P

      Wenn man die Datumsangaben aus Excel wenigstens per "date" "konvertieren" könnte, wärs ja bloß ne einfache Abfrage. Aber das willer irgendwie nicht so ganz.

      Danke nochmal, werde später editieren, falls ich was brauchbares angestellt habe.

      Damit du es auch richtig verstanden hast:


      Mit obiger Funktion wird nur ein einziger Datensatz aus der .xls-Datei gelesen und an entsprechender Stelle wird die Funktion, ergo das Ergebnis mit require_once eingebunden.

      Die HTML Tbl sieht so aus:

      Beginn || Ende || Ausfallgrund || blablabla

      Und in die erste Zeile von Beginn lese ich dann einen Datensatz ein. Eben der, der ganz oben in der Excelliste steht. Nun müsste ich den Datensatz den ich rausgezogen hab irgendwie nach Beginn, also dem Datum filtern, damit die Tabelle sich quasi parallel zum Kalender aktualisiert.

      Wenn also unten im Kalender als erster Monat Oktober angezeigt wird, sollen oben in der Tabelle nur Werte mit Datumsbeginn im Oktober drinne sein. Wenns Dezember ist, nur Dezember etc.
    • Wo ich dein Problem gerade lese, zum Datum fällt mir gerade noch folgendes ein, was dein Filtern etwas erleichtern dürfte:

      Da ich selbst mal was mit dem PHP Excel Reader gemacht habe, weiß ich, dass ein Datum, das man aus Excel liest, irgendwie in Tagen ab dem 1. Januar wasweißich angegeben wird. Habe dafür einfach folgende Funktion benutzt:

      PHP-Quellcode

      1. function excel2timestamp($xl_date)
      2. {
      3. $timestamp = ($xl_date - 25569) * 86400;
      4. return $timestamp;
      5. }
      Damit bekommst du die ausgelesene Zelle (die Tagesangabe aus Excel) in einen brauchbaren Timestamp konvertiert, den du dann mittels PHP mit den date-Funktionen weiterverarbeiten kannst.
    • Warum ließt du nicht alles einfach in ein Array und suchst dir dein gewünschten Punkt raus?
      Oder konventier die Exel datei in eine sqllite db und ließ es dann mit "SELECT * FROM test WHERE Beginn > $datum"

      Mit dem Array wäre das dann einfach so :

      PHP-Quellcode

      1. for($i = 0; sizeof($TestArr); $i++){
      2. if($TestArr[$i]["beginn"] > $MonatsAnfang && $TestArr[$i]["ende"] < $MonatsEnde){
      3. echo("valid");
      4. }
      5. }
    • *electriZer*;265164 schrieb:

      Warum ließt du nicht alles einfach in ein Array und suchst dir dein gewünschten Punkt raus?
      Oder konventier die Exel datei in eine sqllite db und ließ es dann mit "SELECT * FROM test WHERE Beginn > $datum"

      Mit dem Array wäre das dann einfach so :

      PHP-Quellcode

      1. for($i = 0; sizeof($TestArr); $i++){
      2. if($TestArr[$i]["beginn"] > $MonatsAnfang && $TestArr[$i]["ende"] < $MonatsEnde){
      3. echo("valid");
      4. }
      5. }



      Genau so hab ich es jetzt gelöst, hab deinen Post aber jetzt erst gelesen. Danke auch an Leecher :-)

      Läuft alles, bloß die Datumsformatierung in Excel (ist ne ben.def.) macht mir noch Probleme. Falls ich das aber nicht gelöst bekomme, wird die Formatierung, was das Datum betrifft, geändert. Hab ich alles schon abgeklärt. :P

      Danke euch beiden!
    • Leecher;264569 schrieb:


      PHP-Quellcode

      1. function excel2timestamp($xl_date)
      2. {
      3. $timestamp = ($xl_date - 25569) * 86400;
      4. return $timestamp;
      5. }
      Damit bekommst du die ausgelesene Zelle (die Tagesangabe aus Excel) in einen brauchbaren Timestamp konvertiert, den du dann mittels PHP mit den date-Funktionen weiterverarbeiten kannst.


      Soooo, ich hab es hinbekommen - endlich! Die Sache mit dem Array war doch nich ganz das Wahre, so wie du es beschrieben hast, Leecher, funktioniert es.

      In Excel wird die Ausgabe in PHP durch Anzahl der Tage vom 1.1.1899(?) korrigiert mich, ausgegeben. Durch das kleine aber feine Funktiönchen von Leecher hab ich nun nen Timestamp draus gemacht und via date/mktime in ein deutsches Datum in diesem Format umgewandelt:

      Wochentag als Zahl.Monat.Jahr, Stunde:Minute (Wochentag ausgeschrieben)

      Also in etwa, wie bei mir der erste Eintrag:

      25.07.2011, 00:00 (Montag)


      So, nun funktioneirt das aber mit Stunden/Minuten nicht so ganz. Da es, wie gesagt ne Übersicht über die Systemstörungen sein soll, muss das nun noch rein. Hab nach langem Tüfteln und suchen aber nichts brauchbares entdeckt. :(


      Außerdem bräuchte ich evtl. noch Hilfe bei der Kalenderausgabe, die momentan folgendermaßen aussieht:

      ImageShack® - Online Photo and Video Hosting

      Der Codeteil dazu (linker Teil, also akt. Monat):

      PHP-Quellcode

      1. <div style="border: 1; position: absolute; left: 120px; top: 520"
      2. align="left" class="calender">
      3. <div class="pagination">
      4. <div align="center"><?php echo $arrMonth[date('F',$date)];?> <?php echo date('Y',$date); ?></div>
      5. </div>
      6. <?php getCalender($date,$headline); ?>
      7. </div>
      Wie bekomm ich da jetzt den Monat, der momentan dort angezeigt wird in eine Variable geschrieben? Vielleicht blicke ich da auch einfach nicht durch, weil ich mich zu lange und kompliziert mit beschäftigt habe..

      $arrMonth ist nur ein Hilfsarray, damit die Monatsnamen in deutsch ausgegeben werden, das Datum ergibt sich von selbst (aktuelles Datum als Funktion hinterlegt).

      Ich bräuchte nur die Monatsziffer von dem Monat, der in der Kalenderansicht momentan vorne steht. Dynamisch halt, hoffe ihr versteht mich. :-D

      Der nächste Monat (in der Kalenderansicht die Mitte) hat als Variable $nmon, statt $date. Bei nmon wurde einfach bei der Monatsangabe +1 eingefügt:

      PHP-Quellcode

      1. $nmon= mktime(0,0,0, date("m",$date)+1, date("d",$date), date("y",$date));


      Beim rechten Monat das Selbe, bloß halt mit +2.


      Vielleicht denk ich auch zu viel um Ecken..

      Danke schonmal.
    • Erstmal eine Kleinigkeit. Das ist nicht so schön:

      PHP-Quellcode

      1. <?php echo $arrMonth[date('F',$date)];?> <?php echo date('Y',$date); ?>
      besser:

      PHP-Quellcode

      1. <?php echo $arrMonth[date('F',$date)]; echo date('Y',$date); ?>
      Die Monatszahl bekommst du mittels der date Funktion mit "n", z.B.:

      PHP-Quellcode

      1. date("n", $date);


      Kleine Sache noch: Ich hoffe du hast deinen PHP Server auf UTC umgestellt (per php.ini oder über ini_set am Anfang des Scriptes), sonst bekommst du mit der Winter- und Sommerzeit eventuell Probleme. In UTC gibt es keine Winter- und Sommerzeit, da gibt es auch keine Probleme mit den Tagen.