没有PHPExcel的PHP excel文件

时间:2016-02-12 09:45:25

标签: php arrays excel phpexcel

我必须创建一个大约350 columns1000 rows附近的Excel文件。我使用PHPExcel为此任务开发了代码。但创建文件需要42secs。所以我必须创建excel文件without PHPExcel。所以我开发了一个脚本,其中"\t"为不同的选项卡数据识别数据。只需2secs即可创建文件。但问题是,当我要打开该文件(使用" \ t"创建)时,会显示message of corrupted file。在修复该文件时,它工作正常。但我无法理解我在剧本中犯错误的地方。如果有人可以通过使用PHPExcel(更少的执行时间)或通过解决损坏的文件的错误来解决这个问题,那么答案将不胜感激。这是我的代码(CakePHP 3)。

输入数组,如

// 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);
}

1 个答案:

答案 0 :(得分:1)

如你所说&#34;没有PHPExcel&#34;,您是否尝试过寻找比PHPExcel更快的替代品?例如,您可以在几秒钟内生成带有Spouthttps://github.com/box/spout)的350x1000 XLSX电子表格。

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