PHP excel 文件没有 PHPExcel

PHP excel file without PHPExcel

我必须创建一个 excel 文件,其中包含大约 350 columns1000 rows。我已经使用 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);
}

正如您提到的 "without PHPExcel",您是否尝试寻找比 PHPExcel 更快的替代方案?例如,您可以在几秒钟内使用 Spout (https://github.com/box/spout) 生成一个 350x1000 XLSX 电子表格。

生成 CSV 文件也是一个不错的选择,如果可以的话,我建议您采用这种方式。导出过程会更快!但是不要试图重新发明轮子,已经有很多 CSV 编写器可以使用了(例如 Spout 和 PHPExcel 都有)。