没有PHPExcel的PHP excel文件

我必须创build一个近350 columns 1000 rows的Excel文件。 我已经使用PHPExcel开发了这个任务的代码。 但需要42secs来创build文件。 所以我必须创buildwithout PHPExcel Excel文件。 所以我开发了一个脚本,其中数据由"\t"标识为不同的标签数据。 创build文件只需要2 2secs 。 但问题是,当我要打开该文件(使用“\ t”创build)时,会显示message of corrupted file 。 而在修复该文件,它工作正常。 但我不明白,我在脚本中犯了错误。 如果任何人都可以通过使用PHPExcel(较less的执行时间)或通过解决错误的文件解决这个问题,那么答案将不胜感激。 这是我的代码(CakePHP 3)。

input数组像

 // Do not confuse with { instead of [. It's okey. // $export_data and $data both are same (Input array). { "0": { "customer_id": 1, "name": "John Stevens", "Date of 1 Purchase": "2014-08-05T00:00:00+0000", "Date of 2 Purchase": "2014-09-05T00:00:00+0000", "Date of 3 Purchase": "2014-10-05T00:00:00+0000", ... ... ... 350 Cols ... } "1": { ... } ... ... "999 Rows" } 

Using PHPExcel

 $r = 1; $filename = FILE_PATH . 'galliyan.xlsx'; $header = array_keys($export_data[0]); $objPHPExcel = new \PHPExcel(); $col = 0; foreach ($header as $field) { $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, 1, $field); $col++; } $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save($filename); chmod($filename, 0777); $r++; $objPHPExcel = \PHPExcel_IOFactory::load($filename); foreach($export_data as $row) { $col = 0; foreach ($row as $ro) { $objPHPExcel->getActiveSheet()->setCellvalueByColumnAndRow($col, $r, $ro); $col++; } $r++; } $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save($filename); chmod($filename, 0777); 

编辑(更新代码)

 $filename = FILE_PATH . 'galliyan.xlsx'; $header = array_keys($export_data[0]); $objPHPExcel = new \PHPExcel(); $sheet = $objPHPExcel->getActiveSheet(); $col = 0; foreach ($header as $field) { $sheet->setCellValueByColumnAndRow($col, 1, $field); $col++; } $objPHPExcel->getActiveSheet()->fromArray($export_data, null, 'A2'); $writer = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $writer->save($filename); chmod($filename, 0777); 

Using "\t"

 foreach ($data as $row) { if (!$flag) { $header = array(); // display field/column names as first row $header = array_keys($row); $header = $this->setExcelHeaders($header); $this->createExcelFile($dir_name, $filename, $header, $export_type); $flag = TRUE; } array_walk($row, array($this, 'cleanData')); array_push($values, $row); } $values = $this->setValues($values); $this->writeExcelFile($dir_name, $filename, $values); function setExcelHeaders($hdrs) { $header = ''; foreach ($hdrs as $title_val) { $header .= $title_val . "\t"; } return $header; } function createExcelFile($dir_name, $filename, $header, $export_type = '') { $fp = fopen($dir_name . "/" . $filename, 'w'); fwrite($fp, "$header\n"); fclose($fp); $permission = Configure::read('Config.PERMISSION'); if ($export_type == "") { chmod($dir_name, $permission); } chmod($dir_name . "/" . $filename, $permission); } public function cleanData(&$str) { $str = preg_replace("/\t/", "\\t", $str); $str = preg_replace("/\r?\n/", "\\n", $str); if (strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"'; } private function setValues($all_vals) { $data = ''; for ($i = 0; $i < count($all_vals); $i++) { $line = ''; foreach ($all_vals[$i] as $value) { if ((!isset($value)) || ( $value == "")) { $value = "\t"; } else { $value = str_replace('"', '""', $value); $value = '"' . $value . '"' . "\t"; } $line .= $value; } $data .= trim($line) . "\n"; } return $values = str_replace("\r", "", $data); } function writeExcelFile($dir_name, $filename, $data) { $fp = fopen($dir_name . "/" . $filename, 'a'); fwrite($fp, "$data"); fclose($fp); } 

正如你所提到的“没有PHPExcel”,你有没有尝试寻找比PHPExcel更快的替代品? 例如,您可以在几秒钟内生成带有Spout ( https://github.com/box/spout )的350×1000 XLSX电子表格。

生成一个CSV文件也是一个不错的select,如果可以的话,我build议你走这条路。 出口过程将会更快! 但是不要试图重新发明轮子,那里已经有很多的CSV编写器,可以使用(Spout和PHPExcel都有一个例子)。