PHPSpreadsheet HTML Table to Excel?

2 Antworten

Also ich würde das ganze in Access machen. Alleine schon wegen der Portabilität. Außerdem ist HTML kein Produkt und Access ist eines, defakto besser. Falls Sie mehr Fragen haben, wenden Sie sich bitte an Willhelm Tröstler.

Ja.

Für die erste Hürde (das Erfragen des Markups für die Tabelle), brauchst du die Bibliothek noch nicht. Allerdings ist für diesen Schritt für mich auch noch unklar, was genau notwendig ist, da du nicht angegeben hast, woher du die Tabelle ziehst.

  • Wenn die Tabelle von einer fremden Seite stammt, musst du die Daten crawlen.
  • Wenn die Tabelle auf deiner Seite dynamisch zusammengebaut wird (durch Nutzereingaben / JavaScript / ...), solltest du die Daten via Formular oder AJAX Request an den Server schicken.
  • Wenn du die Daten aus deiner Datenbank / einer Datei / o.ä. bildest, kannst du dir einfach einen entsprechenden String generieren, der das Markup für die Tabelle enthält.
  • Wenn ...

Wie Hürde 2 gemeistert werden kann, steht in der Dokumentation der Bibliothek: https://phpspreadsheet.readthedocs.io/en/latest/topics/reading-and-writing-to-file/#generating-excel-files-from-html-content

321anonymuuh123 
Fragesteller
 12.02.2020, 09:58

Ich erstelle den Table auf meiner Seite. Jedoch, glaube ich, kann ich das ganze nicht in eine Variable packen, da in dem Table mehrere Schleifen, verschiedenste Abfragen etc vorhanden sind. Daher auch meine Frage, ob ich in PhpSpreadsheet nicht einfach eine ID des Tables eingeben könnte und der gesamte Table einfach kopiert und in die Excel Tabellen eingefügt wird.

0
regex9  12.02.2020, 23:31
@321anonymuuh123

Nein, PHP hat keinen Zugriff auf das DOM. Aber es kennt dennoch das Markup, denn es baut dieses ja zusammen.

Angenommen, du hast diesen Code (der Einfachheit halber nehme ich hier ein Listenelement statt einer Tabelle):

<?php
  $dataTable = getSomeDataFromAnywhere();

  if (count($dataTable) > 0):
?>
  <ul>
    <?php foreach ($dataTable as $key => $value): ?>
      <li><b><?= $key ?>:</b> <?= $value ?></li>
    <?php endforeach; ?>
  </ul>
<?php endif; ?>               

Dann kannst du diesen doch dennoch umschreiben:

<?php
  function getDataAsHtml($data) {
    if (count($dataTable) < 1) {
      return "";
    }

    $html = "<ul>";

    foreach ($dataTable as $key => $value) {
      $html .= "<li><b>{$key}:</b> {$value}</li>";
    }

    $html .= "</ul>";
    return $html;
  }

  $dataTable = getSomeDataFromAnywhere();
  $html = getDataAsHtml($dataTable);
?>
<?= $html ?>

Statt das der Code sofort in den Response Body geschrieben wird, wird er erst einmal in einem String vorgebaut. Und so einen String kannst du neben der Ausgabe doch auch einfach an die Bibliotheksfunktionen übergeben.

Wenn dir dieser Weg nicht geeignet erscheint (und das kann ja durchaus berechtigt sein, denn ich möchte nicht sagen, dass der obige Weg in jedem Fall der einfachste Weg ist), hole dir das gerenderte Ergebnis mit JavaScript und schick es via AJAX-Request zurück an den Server.

<table id="your-table">
  <!-- ... -->
</table>
<script>
  const tableMarkup = document.getElementById("your-table").outerHTML;
  const request = new XMLHttpRequest();
  request.open("POST", "converter.php", true);
  request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  request.send("tableMarkup=" + encodeURIComponent(tableMarkup));
</script>

converter.php:

<?php
  if (empty($_POST["tableMarkup"])) {
    exit;
  }

  $data = $_POST["tableMarkup"];

  // validate / filter data ...
  // use phpspreadsheet library ...
0