5

私はこのようなhtmlテーブル構造を持っています。

            <tr style="font-weight: bold">
                <td>ID</td>
                <td>Navn</td>

                <td>Adresse</td>
                <td>By</td>
                <td>Post nr</td>
                <td>E-mail</td>
                <td>Telefon</td>
                <td>Status og dato</td>
                <td>Dropdown info</td>
                <td>Produkt info</td>
                <td>Buydate</td>
                <td>Ref nr. (3 første cifre)</td>
            </tr>
                    <tr>
                <td>40563</td>
                <td>Firstname Lastname</td>

                <td>Address</td>
                <td>Copen</td>
                <td>2100</td>
                <td>ff@hotmail.com</td>
                <td>123123</td>
                <td>Ikke indløst</td>
                <td>EEE-BBB</td>
</tr>

これをphpでcsv/excelファイルに変換したいと思います。

つまり、それぞれがExcelの行であり、それぞれが行のセルであり、

どうすればこれができますか?

PHPを使用してHTMLテーブルをCSVに自動的に変換することを調査して見つけましたか?しかし、答えは私には正しく機能しません。すべてのセルを取得すると1つの「セル」になるため、各行には1つのセルしかありません。

これは私が試したことです。

        $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('td') as $row)  
            {
                $td [] = $row->plaintext;
            }
            fputcsv($fp, $td);
        }


        fclose($fp);
        exit;

$tableは上記のhtmlです。単純なhtmldomプラグインを使用する

4

3 に答える 3

4

PHP DOM クラスを使用して配列にロードできます。

$data = array();
$doc = new DOMDocument();
$doc->loadHTML($html);
$rows = $doc->getElementsByTagName('tr');
foreach($rows as $row) {
    $values = array();
    foreach($row->childNodes as $cell) {
        $values[] = $cell->textContent;
    }
    $data[] = $values;
}

次に、例のようにその配列を CSV データに変換するか、ループ内で CSV 文字列を直接構築するだけです。

実際の例

于 2012-05-31T15:59:38.480 に答える
4

作成された CVS は一部の MS Excel バージョンで問題があるようです。このページによると:

However, certain Microsoft programs (I'm looking at you, Access 97), 
will fail to recognize the CSV properly unless each line ends with \r\n.

だから私はコードを次のように修正しました:

$td = array();
foreach( $element->find('td') as $row) {
   $td[] = $row->plaintext;
}
fwrite($fp,implode(";",$td)."\r\n");

しかし、これも言います:

Secondly, if the first column heading / value of the CSV file begins with 
`uppercase `ID, certain Microsoft programs (ahem, Excel 2007) will interpret 
the file `as` being in the` SYLK format rather than CSV`

だから私はIDを変更しました... idに...全体として、小文字の「id」と「;」を使用します 区切り文字として、これは MS Excel 2003 で期待どおりにロードされました。

更新しました:

ファイルにBOM署名を追加することで、UTF8 .csv を Excel に正しく読み込む方法を見つけました 。PHP では、これを行うことができます。

fwrite($fp,"\xEF\xBB\xBF");
...start writing

これらの 3 文字 (実際には 1 つの Unicode)forces excel and the likesは、.csv ファイル AS utf8 を理解し、内部でデコードします。

BOM を使用しない別の解決策がありますが、これは一種のハックであり、十分にテストされていません。ファイルをfile.txtとして作成するだけで(.csvではなく.txtに注意してください)、 必要なエンコーディングについてExcelに尋ねるように強制します。あなたはutf8を選択して完了です。

于 2012-05-31T16:11:42.893 に答える
2

私にとってはうまくいったとは言いたくないのですが...私にとってはうまくいきました。これは私が使用したスクリプトです。

<?php
    include('simple_html_dom.php');

    $table = '<tr style="font-weight: bold">
                <td>ID</td>
                <td>Navn</td>
                <td>Adresse</td>
                <td>By</td>
                <td>Post nr</td>
                <td>E-mail</td>
                <td>Telefon</td>
                <td>Status og dato</td>
                <td>Dropdown info</td>
                <td>Produkt info</td>
                <td>Buydate</td>
                <td>Ref nr. (3 første cifre)</td>
            </tr>
                    <tr>
                <td>40563</td>
                <td>Firstname Lastname</td>

                <td>Address</td>
                <td>Copen</td>
                <td>2100</td>
                <td>ff@hotmail.com</td>
                <td>123123</td>
                <td>Ikke indløst</td>
                <td>EEE-BBB</td>
</tr>
';
        $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('td') as $row)  
            {
                $td [] = $row->plaintext;
            }
            fputcsv($fp, $td);
        }

        fclose($fp);
?>

ファイルが SYLK ファイルであり、Excel に読み込めないというメモを受け取りました。このメッセージに対して [OK] をクリックすると、ファイルが正常に開きました。これがエラーである場合は、次の行が原因です: <td>ID</td> SYLK ファイルの種類はID、テキスト (CSV) ファイルの最初のセルの大文字で識別されます。このメッセージを小文字に変更するか、ラベルをまとめて変更することで回避できます。

これは、ファイルを完全に開いた後の出力です。 Excel出力

于 2012-05-31T15:58:05.710 に答える