PHP - 将HTML表格转换为CSV会添加空行

时间:2017-04-20 12:13:59

标签: php html excel csv utf-8

我有一个简单的PHP脚本,可以将HTML表格转换为CSV文件。由于UTF-8转换的原因,我添加了fwrite($fp,"\xEF\xBB\xBF");,并且在MS Excel(Mac和Windows - 最新版本)中打开CSV文件时,除了额外的空行(每秒一行)之外,其他一切都有效。

使用Macs Preview打开它并不会显示空行 - 当我删除fwrite($fp,"\xEF\xBB\xBF");时,它也不会添加空行,但当然我的文本会被删除。

这是我的PHP脚本:

<?php

include('simplehtmldom_1_5/simple_html_dom.php');

$table = file_get_contents('hotel.html');
$html = str_get_html($table);

//Generate the CSV file header
header("Content-type: application/vnd.ms-excel");
header("Content-Encoding: UTF-8");
header("Content-type: text/csv; charset=UTF-8");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header('Content-Disposition: attachment; filename=pkb.csv');


$fp = fopen("php://output", "w");
fwrite($fp,"\xEF\xBB\xBF");


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);

?>

HTML表非常常见:

<table>
<th>
</th>
<tr>
<td>
</td>
</tr>
...
</table>

用Excel打开转换的CSV看起来像这样:

CSV opened in Excel with empty rows

也许你发现我的错误产生了这些额外的空行。 非常感谢你们

1 个答案:

答案 0 :(得分:0)

问题是重复迭代

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

    if (!empty($td)) {
        fputcsv($fp, $td, ';');
    }

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

    fputcsv($fp, $td, ';');
}

这样的事情是一个简单的修复,但我建议重写整个foreach。