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?但答案对我来说不起作用,我将所有单元格结果都放在一个“单元格”中,所以每一行只有一个单元格。

这是我尝试过的;

        $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。使用简单的 html dom 插件

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 的解决方案,但它是一种 hack,没有经过很好的测试;只需将您的文件创建为file.txt(注意 .txt,而不是 .csv), 迫使 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 中加载它的说明。单击此消息的“确定”会正常打开文件。如果这是您的错误,则由以下行引起:<td>ID</td> SYLK 文件类型由ID文本 (CSV) 文件的第一个单元格中的大写字母标识。您可以通过将其更改为小写或一起更改标签来阻止此消息。

这是我完全打开文件后得到的输出: Excel 输出

于 2012-05-31T15:58:05.710 回答