HTML-Tabelle mit PHP automatisch in eine CSV konvertieren?

Ich bin gerade in der Notwendigkeit, diese HTML-Tabelle in csv unter Verwendung von PHP automatisch umzuwandeln. Kann mir jemand eine Idee geben, wie das geht? Vielen Dank.

<code>$table = '<table border="1">
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>row 2, cell 2</td>
</tr>
</table>';
</code>

Leute, ich brauche nur$ table nur umwandeln.csv Datei, die mit einer PHP-Funktion automatisch generiert werden kann. Wir können den Pfad für diese CSV-Datei definieren/ test / home / path_to_csv

 Thompson08. Mai 2012, 14:41
Ich versuche nichts zu analysieren. Ich habe meine eigene Variable$ table, das die HTML-Tabellendaten enthält. Jetzt möchte ich diese Daten mit PHP in eine .csv-Datei konvertieren
 dm0351408. Mai 2012, 14:32
Mir ist klar, dass dies nicht ganz das ist, wonach Sie suchen, aber Sie können es als xls speichern. und Excel wird es wie erwartet öffnen.
 Thompson08. Mai 2012, 14:29
Ich habe bei Google gesucht, aber keine relevante gefunden
 petr08. Mai 2012, 14:44
Um die Struktur aus einem HTML-String zu erhalten, müssen Sie die Daten analysieren (in diesem Fall in der Variablen gespeichert). Anschließend können Sie die gewünschten Informationen extrahieren und als CSV speichern
 petr08. Mai 2012, 14:32
Was genau versuchst du zu erreichen? Möchten Sie den HTML-Code analysieren und Daten extrahieren oder handelt es sich um eine einmalige Analyse? Für einmalige Informationen empfehle ich gefundeneHier. Für universelleres und automatischeres Arbeiten muss HTML analysiert werden - versuchen Sie eseinfache Analyse. Wenn der HTML-Code ein festes Format hat, haben Sie möglicherweise Glück mit regulären Ausdrücken, um die Tags herauszukratzen und nur die Daten zu belassen. (Ersetzen Sie z. B. das td durch einige Feldtrennzeichen.) Dann ist die CSV-Ausgabe eine triviale Angelegenheit.
 Ozair Kafray08. Mai 2012, 15:02
Hast du das versucht?davidvielmetter.com/tricks/…
 Vivek27. Mai 2014, 15:13
Ich erhalte eine Fehlermeldung, dass mein csv leer ist ..... Ich habe eine Datei, die ein Titel-Tag und 2 3 weitere Tags enthält, mit der Tabelle, wie ich sie jetzt lesen und darin analysieren werde. $ file = file_get_contents ($ file_txt. "/ D_LOTMAN.HTM"); print_r ($ file); include './simple_html_dom.php'; $ html = str_get_html ($ file); $ fpc = fopen ("downloads / me.csv", "w"); foreach ($ html-> find ('tr') als $ element) {$ td = array (); foreach ($ element-> find ('td') als $ row) {$ td [] = $ row-> plaintext; } fputcsv ($ fpc, $ td); } fclose ($ fpc);

Antworten auf die Frage(8)

Ich musste das noch nie machen, aber ich fand dieses Tutorial, das Quelldateien enthält, und es ist kurz und sehr einfach zu befolgen:

http://davidvielmetter.com/tricks/howto-convert-an-html-table-to-csv-using-php/

Lösung für das Problem

Sie können verwendenstr_get_html http://simplehtmldom.sourceforge.net/

<code>include "simple_html_dom.php";
$table = '<table border="1">
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>row 2, cell 2</td>
</tr>
</table>';

$html = str_get_html($table);



header('Content-type: application/ms-excel');
header('Content-Disposition: attachment; filename=sample.csv');

$fp = fopen("php://output", "w");

foreach($html->find('tr') as $element)
{
    $td = array();
    foreach( $element->find('th') as $row)  
    {
        $td [] = $row->plaintext;
    }
    fputcsv($fp, $td);

    $td = array();
    foreach( $element->find('td') as $row)  
    {
        $td [] = $row->plaintext;
    }
    fputcsv($fp, $td);
}


fclose($fp);
</code>
 Baba09. Mai 2012, 11:57
fputcsv verfügt über zusätzliche Parameter, mit denen Sie experimentieren und sicherstellen können, dass Sie das leere Array herausfiltern
 Bej08. Apr. 2019, 16:02
Ich habe diese Methode ausprobiert. Die CSV wird erstellt, aber der Inhalt der Tabellenspalte ist in der CSV nicht vorhanden. Stattdessen wird der Inhalt zweimal geschrieben. Irgendeine Idee warum? Ich benutze 1.8.1 Version
 Thompson09. Mai 2012, 06:51
Hoppla! Entschuldigung für meinen letzten Kommentar. Es funktionierte. Danke noch einmal.
 Thompson09. Mai 2012, 08:16
Hallo, ich erhalte die CSV-Ausgabe wie auf diesem Fotoi.imgur.com/x2mWb.png, wobei zusätzliche Leerzeilen zwischen den Daten eingefügt werden. Kann es repariert werden? Ich habe es mit trim () versucht. Aber es hat nicht funktioniert.
 Baba08. Mai 2012, 18:36
Ja, Sie können ..... alles, was Sie tun müssen, ist die Überschriften zu entfernen .... und zu ändern"php://output" zu deinem Weg
 Thompson08. Mai 2012, 18:35
Baba, wie können wir einen Pfad für diese CSV-Datei definieren, der automatisch in z./ test / home / path_to_csv
 Thompson09. Mai 2012, 06:34
Hoppla! Baba, ich habe das geändertPHP: // Ausgabe zu/ mohan / path_to_csv, und wenn ich die Seite lade, werden mehrere Warnungen ausgegeben! mögenWarnung: fopen (/ mohan / path_to_csv) [function.fopen]: Stream konnte nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis in C: \ wamp \ www \ mohan \ TableToCsv.php in Zeile 29. Linie 29 ist$ fp = fopen ("/ mohan / path_to_csv", "w");
 Thompson08. Mai 2012, 18:39
Danke für deine Methode. Ich werde es auf meinem PC versuchen (derzeit bin ich auf dem Handy) und Sie wissen lassen.
 Baba08. Mai 2012, 18:42
Geil .... habe es selbst getestet: D
 Natta Wang16. Aug. 2018, 08:07
In der lib hat codeMAX_FILE_SIZE welche auf600000 und wenn Funktionfile_get_html undstr_get_html Holen Sie sich die Zeichenfolge über als600000 Erlaubt nicht, fortzufahren und stattdessen false zurückzugeben. Ich möchte mit einer großen Tabelle arbeiten, die Zeichenfolgen mit einer Länge von bis zu 1 Million und mehr enthält. Wie soll ich vorgehen, können Sie mir vorschlagen, wie wichtig diese Tabelle ist?MAX_FILE_SIZE Nummer.

Ich habe eine einfache Klasse basierend auf dem Code in diesem Thread angepasst, der jetzt verarbeitet wirdcolspan undrowspan. Nicht stark getestet und ich bin sicher, dass es optimiert werden könnte.

Verwendungszweck:

<code>require_once('table2csv.php');

$table = '<table border="1">
    <tr>
    <th colspan=2>Header 1</th>
    </tr>
    <tr>
    <td>row 1, cell 1</td>
    <td>row 1, cell 2</td>
    </tr>
    <tr>
    <td>row 2, cell 1</td>
    <td>row 2, cell 2</td>
    </tr>
    <tr>
    <td rowspan=2>top left row</td>
    <td>top right row</td>
    </tr>
    <tr>
    <td>bottom right</td>
    </tr>
    </table>';

table2csv($table,"sample.csv",true);
</code>

table2csv.php

<code><?php

    //download @ http://simplehtmldom.sourceforge.net/
    require_once('simple_html_dom.php');
    $repeatContentIntoSpannedCells = false;


    //--------------------------------------------------------------------------------------------------------------------

    function table2csv($rawHTML,$filename,$repeatContent) {

        //get rid of sups - they mess up the wmus
        for ($i=1; $i <= 20; $i++) { 
            $rawHTML = str_replace("<sup>".$i."</sup>", "", $rawHTML);
        }

        global $repeatContentIntoSpannedCells;

        $html = str_get_html(trim($rawHTML));
        $repeatContentIntoSpannedCells = $repeatContent;

        //we need to pre-initialize the array based on the size of the table (how many rows vs how many columns)

        //counting rows is easy
        $rowCount = count($html->find('tr'));

        //column counting is a bit trickier, we have to iterate through the rows and basically pull out the max found
        $colCount = 0;
        foreach ($html->find('tr') as $element) {

            $tempColCount = 0;

            foreach ($element->find('th') as $cell) {
                $tempColCount++;
            }

            if ($tempColCount == 0) {
                foreach ($element->find('td') as $cell) {
                    $tempColCount++;
                }
            }

            if ($tempColCount > $colCount) $colCount = $tempColCount;
        }

        $mdTable = array();

        for ($i=0; $i < $rowCount; $i++) { 
            array_push($mdTable, array_fill(0, $colCount, NULL));
        }

        //////////done predefining array

        $rowPos = 0;
        $fp = fopen($filename, "w");

        foreach ($html->find('tr') as $element) {

            $colPos = 0;

            foreach ($element->find('th') as $cell) {
                if (strpos(trim($cell->class), 'actions') === false && strpos(trim($cell->class), 'checker') === false) {
                    parseCell($cell,$mdTable,$rowPos,$colPos);
                }
                $colPos++;
            }

            foreach ($element->find('td') as $cell) {
                if (strpos(trim($cell->class), 'actions') === false && strpos(trim($cell->class), 'checker') === false) {
                    parseCell($cell,$mdTable,$rowPos,$colPos);
                }
                $colPos++;
            }   

            $rowPos++;
        }


        foreach ($mdTable as $key => $row) {

            //clean the data
            array_walk($row, "cleanCell");
            fputcsv($fp, $row);
        }
    }


    function cleanCell(&$contents,$key) {

        $contents = trim($contents);

        //get rid of pesky &nbsp's (aka: non-breaking spaces)
        $contents = trim($contents,chr(0xC2).chr(0xA0));
        $contents = str_replace("&nbsp;", "", $contents);
    }


    function parseCell(&$cell,&$mdTable,&$rowPos,&$colPos) {

        global $repeatContentIntoSpannedCells;

        //if data has already been set into the cell, skip it
        while (isset($mdTable[$rowPos][$colPos])) {
            $colPos++;
        }

        $mdTable[$rowPos][$colPos] = $cell->plaintext;

        if (isset($cell->rowspan)) {

            for ($i=1; $i <= ($cell->rowspan)-1; $i++) {
                $mdTable[$rowPos+$i][$colPos] = ($repeatContentIntoSpannedCells ? $cell->plaintext : "");
            }
        }

        if (isset($cell->colspan)) {

            for ($i=1; $i <= ($cell->colspan)-1; $i++) {

                $colPos++;
                $mdTable[$rowPos][$colPos] = ($repeatContentIntoSpannedCells ? $cell->plaintext : "");
            }
        }
    }

?>
</code>

Sie können diese Funktion in einer separaten js-Datei verwenden:

<code>function exportTableToCSV($table, filename) {

        var $rows = $table.find('tr:has(td)'),

            // Temporary delimiter characters unlikely to be typed by keyboard
            // This is to avoid accidentally splitting the actual contents
            tmpColDelim = String.fromCharCode(11), // vertical tab character
            tmpRowDelim = String.fromCharCode(0), // null character

            // actual delimiter characters for CSV format
            colDelim = '","',
            rowDelim = '"\r\n"',

            // Grab text from table into CSV formatted string
            csv = '"' + $rows.map(function (i, row) {
                var $row = $(row),
                    $cols = $row.find('td');

                return $cols.map(function (j, col) {
                    var $col = $(col),
                        text = $col.text();

                    return text.replace('"', '""'); // escape double quotes

                }).get().join(tmpColDelim);

            }).get().join(tmpRowDelim)
                .split(tmpRowDelim).join(rowDelim)
                .split(tmpColDelim).join(colDelim) + '"',

            // Data URI
            csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv);

        $(this)
            .attr({
            'download': filename,
                'href': csvData,
                'target': '_blank'
        });
    }
</code>

Um diese Funktion zu starten, können Sie Folgendes verwenden:

<code>$('.getfile').click(
            function() { 
    exportTableToCSV.apply(this, [$('#thetable'), 'filename.csv']);
             });
</code>

Dabei sollte 'getfile' die Klasse sein, die der Schaltfläche zugewiesen ist, in der Sie einen Aufruf zur Aktion hinzufügen möchten. (Wenn Sie auf diese Schaltfläche klicken, wird das Download-Popup angezeigt.) "Thetable" sollte die ID sein, die der Tabelle zugewiesen ist, die Sie herunterladen möchten.

Sie können auch den benutzerdefinierten Dateinamen ändern, um ihn im Code herunterzuladen.

 OllyBarca16. Okt. 2015, 12:43
Das funktioniert hervorragend. Ich werde dir zu Ehren 100 Stiere opfern.

Um die akzeptierte Antwort zu erweitern, habe ich dies getan, um Spalten nach Klassennamen zu ignorieren und auch leere Zeilen / Spalten zu behandeln.

Sie können str_get_html verwendenhttp://simplehtmldom.sourceforge.net/. Einfach einbinden und los geht's! :)

<code>$html = str_get_html($html); // give this your HTML string

header('Content-type: application/ms-excel');
header('Content-Disposition: attachment; filename=sample.csv');

$fp = fopen("php://output", "w");

foreach($html->find('tr') as $element) {
  $td = array();
  foreach( $element->find('th') as $row) {
    if (strpos(trim($row->class), 'actions') === false && strpos(trim($row->class), 'checker') === false) {
      $td [] = $row->plaintext;
    }
  }
  if (!empty($td)) {
    fputcsv($fp, $td);
  }

  $td = array();
  foreach( $element->find('td') as $row) {
    if (strpos(trim($row->class), 'actions') === false && strpos(trim($row->class), 'checker') === false) {
      $td [] = $row->plaintext;
    }
  }
  if (!empty($td)) {
    fputcsv($fp, $td);
  }
}

fclose($fp);
exit;
</code>

Wenn jemand Babas Antwort verwendet, sich aber über zusätzliche Leerzeichen kratzt, die hinzugefügt werden, funktioniert Folgendes:

<code>include "simple_html_dom.php";
$table = '<table border="1">
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>row 2, cell 2</td>
</tr>
</table>';

$html = str_get_html($table);   

$fileName="export.csv";
header('Content-type: application/ms-excel');
header("Content-Disposition: attachment; filename=$fileName");

$fp = fopen("php://output", "w");
$csvString="";

$html = str_get_html(trim($table));
foreach($html->find('tr') as $element)
{

    $td = array();
    foreach( $element->find('th') as $row)
    {
        $row->plaintext="\"$row->plaintext\"";
        $td [] = $row->plaintext;
    }
    $td=array_filter($td);
    $csvString.=implode(",", $td);

    $td = array();
    foreach( $element->find('td') as $row)
    {
        $row->plaintext="\"$row->plaintext\"";
        $td [] = $row->plaintext;
    }
    $td=array_filter($td);
    $csvString.=implode(",", $td)."\n";
}
echo $csvString;
fclose($fp);
exit;
</code>

}

Sie können dies mit Arrays und regulären Ausdrücken tun ... siehe unten

<code>$csv = array();
preg_match('/<table(>| [^>]*>)(.*?)<\/table( |>)/is',$table,$b);
$table = $b[2];
preg_match_all('/<tr(>| [^>]*>)(.*?)<\/tr( |>)/is',$table,$b);
$rows = $b[2];
foreach ($rows as $row) {
    //cycle through each row
    if(preg_match('/<th(>| [^>]*>)(.*?)<\/th( |>)/is',$row)) {
        //match for table headers
        preg_match_all('/<th(>| [^>]*>)(.*?)<\/th( |>)/is',$row,$b);
        $csv[] = strip_tags(implode(',',$b[2]));
    } elseif(preg_match('/<td(>| [^>]*>)(.*?)<\/td( |>)/is',$row)) {
        //match for table cells
        preg_match_all('/<td(>| [^>]*>)(.*?)<\/td( |>)/is',$row,$b);
        $csv[] = strip_tags(implode(',',$b[2]));
    }
}
$csv = implode("\n", $csv);
var_dump($csv);
</code>

Dann können Sie verwendenfile_put_contents () schreibe ich die CSV-Zeichenfolge in die Datei ..

 Vishal Kumar Sahu20. Aug. 2018, 23:12
Klassische Antwort. Wie gehe ich mit HTML-Tags um, die in CSV eingefügt werden sollen?
 Jacob Cruz22. Aug. 2018, 00:25
Ich habe nur mit dem Umfang gearbeitet, der vor 5 oder mehr Jahren zur Verfügung stand. Wenn Sie Ihren Zeichenfolgen ordnungsgemäß entkommen, sollten sie ihre Spaltenstrukturen beibehalten.
 Vishal Kumar Sahu25. Aug. 2018, 20:20
Großartig! Und eine effiziente Antwort auch im gegenwärtigen Kontext. :-)

Babas Antwort enthält zusätzlichen Platz. Also habe ich den Code folgendermaßen aktualisiert:

<code>include "simple_html_dom.php";
$table = '<table border="1">
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>row 2, cell 2</td>
</tr>
</table>';

$html = str_get_html($table);



header('Content-type: application/ms-excel');
header('Content-Disposition: attachment; filename=sample.csv');

$fp = fopen("php://output", "w");

foreach($html->find('tr') as $element)
{
    $td = array();
foreach( $element->find('th') as $row)
{
    $td [] = $row->plaintext;
}

foreach( $element->find('td') as $row)
{
    $td [] = $row->plaintext;
}
fputcsv($fp, $td);
}


fclose($fp);</code>

Ihre Antwort auf die Frage