\n"; public const XmlFooter = ''; public $encoding = 'UTF-8'; // encoding type to specify in file. // Note that you're on your own for making sure your data is actually encoded to this encoding public $title = 'Sheet1'; // title for Worksheet public function generateHeader() { // workbook header $output = stripslashes(sprintf(self::XmlHeader, $this->encoding))."\n"; // Set up styles $output .= "\n"; $output .= "\n"; $output .= "\n"; // worksheet header $output .= sprintf("\n \n", htmlentities($this->title)); return $output; } public function generateFooter() { $output = ''; // worksheet footer $output .= "
\n
\n"; // workbook footer $output .= self::XmlFooter; return $output; } public function generateRow($row) { $output = ''; $output .= " \n"; foreach ($row as $k => $v) { $output .= $this->generateCell($v); } $output .= " \n"; return $output; } private function generateCell($item) { $output = ''; $style = ''; // Tell Excel to treat as a number. Note that Excel only stores roughly 15 digits, so keep // as text if number is longer than that. if (preg_match("/^-?\d+(?:[.,]\d+)?$/", $item) && (strlen($item) < 15)) { $type = 'Number'; } // Sniff for valid dates; should look something like 2010-07-14 or 7/14/2010 etc. Can // also have an optional time after the date. // // Note we want to be very strict in what we consider a date. There is the possibility // of really screwing up the data if we try to reformat a string that was not actually // intended to represent a date. elseif (preg_match("/^(\d{1,2}|\d{4})[\/\-]\d{1,2}[\/\-](\d{1,2}|\d{4})([^\d].+)?$/", $item) && ($timestamp = strtotime($item)) && ($timestamp > 0) && ($timestamp < strtotime('+500 years'))) { $type = 'DateTime'; $item = strftime('%Y-%m-%dT%H:%M:%S', $timestamp); $style = 'sDT'; // defined in header; tells excel to format date for display } else { $type = 'String'; } $item = str_replace(''', ''', htmlspecialchars($item, ENT_QUOTES)); $output .= ' '; $output .= $style ? "" : ''; $output .= sprintf('%s', $type, $item); $output .= "\n"; return $output; } public function sendHttpHeaders() { header('Content-Type: application/vnd.ms-excel; charset='.$this->encoding); header('Content-Disposition: inline; filename="'.basename($this->filename).'"'); } }