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