I recently needed to update a page that dumped a HTML table into Excel – and found it dumped everything, including hyperlinks, buttons, images, etc. This didn’t sit well with Excel for Mac, and probably not a good idea.
I thought I would re-write it, but in a way that was re-usable (as this code was situated on every datagrid in the application)
So, using the PEAR extension Spreadsheet_Excel_Writer and a simple HTML DOM class, I came up with this. Its by no means finished, but as it stands, it works pretty well for what I need. Feel free to rob it and use the code.
The call is from a form which uses jQuery to copy the table as HTML into an input and then uses that in the output script ($_REQUEST[‘gridcontent’])
When its all complete, I may put it on an open source repo, such as sourceforge.
FYI, there is a section in here that takes cell text with a
in it as a split cell. So if your TD has a BR in it, it will make all the other rows merged so that the data looks nice. This is by design.
$fail = false; @(include('Spreadsheet/Excel/Writer.php')) OR $fail = true; if ($fail) { //not got the nice PEAR installed, so do it the old way header("Content-type: application/vnd.ms-excel; name='excel'"); header("Content-Disposition: filename=export.xls"); // Fix for crappy IE bug in download. header("Pragma: "); header("Cache-Control: "); echo $_REQUEST['datatodisplay']; exit(); } //if we get here then we've got the spreadsheet pear addon //so do it the nice way function remove_tags($string) { $temp = strip_tags($string); return $temp; } require_once '../ext/simplehtmldom/simple_html_dom.php'; //this is for testing header("Content-type: text/plain"); //start a new spreadsheet thingy $spread = new Spreadsheet_Excel_Writer(); //get the table of data $table = $_REQUEST['datatodisplay']; $dom = new simple_html_dom(); $table_obj = str_get_html($table); $header_array = array(); //see if its a proper table and has a thead section if (strpos($table, 'find('thead') as $head) { //and the rows (again only supports one) foreach ($head->find('tr') as $head_row) { //some pages might use proper th's foreach ($head_row->find('th') as $head_cell) { $header_array[] = $head_cell->innertext; } //and some old dirty might use td's foreach ($head_row->find('td') as $head_cell) { $header_array[] = $head_cell->innertext; } } } } else { //if we're not using thead - then grab the first child $header = $table_obj->firstChild(); //do all the rows foreach ($table_obj->find('tr') as $table_row) { //and the table headers (this should only be looped once) foreach ($table_row->find('th') as $table_cell) { //save the header name $header_array[] = $table_cell->innertext; } } } $table_data = array(); $column_cells = array(); //loop through each row foreach ($table_obj->find('tr') as $table_row) { $temp_data = array(); //and each cell in that row foreach ($table_row->find('td') as $table_cell) { //if the cell has a random input box if (strpos($table_cell, 'find('input') as $input) { //get the value of the input $temp_data[] = array(0 => $input->getAttribute('value')); } } else { //are there any BRs? if (stripos($table_cell->innertext, '')) { //perhaps we should create an array of these $string = str_ireplace('', '', $table_cell->innertext); $temp = explode("", $string); $return_array = array(); foreach ($temp as $item) { $text = trim(strip_tags($item)); if ("" != $text) { $return_array[] = $text; } } //so now we have a nicely trimmed array of values. $temp_data[] = $return_array; } else { //othersise just get the innertext $temp_data[] = array(0 => trim(str_ireplace(" ", " ", strip_tags($table_cell->innertext)))); } } } //append the row $table_data[] = $temp_data; } //create a worksheet $sheet =& $spread->addWorksheet('icfm_export'); $sheet->writeRow(0, 0, $header_array); $row_number = 0; $new_line = 0; $format_justify_top =& $spread->addFormat(); $format_justify_top->setVAlign('top'); for ($row = 1; $row < count($table_data); $row++) { //see if we have any multiples foreach ($table_data[$row] as $the_row) { if (count($the_row) > $biggest) { $biggest = count($the_row); } } $row_number ++; foreach ($table_data[$row] as $col => $the_row) { $counter = count($the_row); for ($i = 0; $i < $biggest; $i++) { $text = ''; if (isset($the_row[$i])) { $text = $the_row[$i]; } $sheet->writeString($row_number + $i, $col, $text, $format_justify_top); if ('' == $text) { $sheet->mergeCells($row_number, $col, $row_number + $i, $col); } } } $row_number += ($biggest - 1); } //we have the header and the data now. awesome $spread->send('export.xls'); $spread->close();
I read this post, that is the good information for me. I search a lot of time for the security system update. but don’t collect any good information for that. I am very happy because I’m so glad to get it. I think this method is working. honest to say Actually it’s good for me.
thanks