Преобразование HTML в CSV в php?

У меня такая структура таблицы 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> 

Я хотел бы преобразовать это в файл csv / excel по php.

Таким образом, каждый из них является строкой в ​​excel, и каждая из них является ячейкой в ​​строке,

Пожалуйста, как это можно сделать?

Я исследовал и нашел преобразование таблицы HTML в CSV автоматически с помощью PHP? но ответ не работает должным образом для меня, я получаю все результаты ячейки в одной «ячейке», поэтому каждая строка содержит только одну ячейку.

Это то, что я пробовал;

  $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

похоже, что у 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.

ОБНОВЛЕНО:

Я нашел способ правильно загрузить UTF8 .csv в excel, добавив в файл подпись BOM . В PHP это можно сделать:

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

эти 3 символа (на самом деле один unicode) forces excel and the likes понимать CSV-файл AS utf8 и, следовательно, расшифровывать его внутри.

Существует еще одно решение без использования спецификации, но это своего рода хак и не очень хорошо проверенный; просто создайте файл как file.txt (обратите внимание на .txt, а не .csv), заставив excel спросить вас о нужной кодировке; вы выбираете utf8 и выполняете.

Вы можете загрузить их в массив, используя классы 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-строку непосредственно в циклах.

Живой пример

Я ненавижу говорить, что это сработало для меня, но … это сработало для меня. Это сценарий, который я использовал.

 <?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); ?> в <?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 идентифицируется идентификатором капитала в первой ячейке текстового файла (CSV). Вы можете предотвратить это сообщение, изменив его на нижний регистр или изменив метку все вместе.

Это результат, который я получаю, когда полностью открыл файл: Выход Excel