简体   繁体   English

没有PHPExcel的PHP Excel文件

[英]PHP excel file without PHPExcel

I have to create a excel file having near about 350 columns and 1000 rows . 我必须创建一个具有约350 columns1000 rows的Excel文件。 I have developed code for this task using PHPExcel . 我已经使用PHPExcel开发了用于此任务的代码。 But it takes 42secs to create file. 但是创建文件需要42secs So I have to create excel file without PHPExcel . 所以我必须创建without PHPExcel excel文件。 So I have developed a script in which data is identified by "\\t" for different tab data. 因此,我开发了一个脚本,其中的数据用"\\t"标识不同的制表符数据。 It takes just 2secs to create file. 创建文件仅需2 2secs But problem is that when I'm going to open that file (created by using "\\t"), message of corrupted file is displayed. 但是问题是,当我要打开该文件(使用“ \\ t”创建)时,会显示message of corrupted file And on repairing that file, it works fine. 并且在修复该文件时,它可以正常工作。 But I can't understand that where I'm making mistake in script. 但是我不明白我在脚本中犯错的地方。 If anyone can solve this problem either by using PHPExcel (less execution time) or by solving error of corrupt file, then answer will be appreciated. 如果任何人都可以通过使用PHPExcel(较少的执行时间)或通过解决损坏的文件的错误来解决此问题,则将感谢您的答复。 Here is my code (CakePHP 3). 这是我的代码(CakePHP 3)。

Input Array like 输入数组像

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

EDIT (UPDATED CODE) 编辑(更新代码)

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

As you mentioned "without PHPExcel", have you tried looking at alternatives that can be faster than PHPExcel? 正如您提到的“没有PHPExcel”一样,您是否尝试过寻找比PHPExcel更快的替代方案? For instance, you can generate a 350x1000 XLSX spreadsheet with Spout ( https://github.com/box/spout ) in just a few seconds. 例如,您可以在几秒钟内使用Spouthttps://github.com/box/spout )生成350x1000 XLSX电子表格。

Generating a CSV file is also a good alternative and I'd recommend you going this route if you can. 生成CSV文件也是一种不错的选择,如果可以的话,我建议您采用这种方法。 The export process will be way faster! 导出过程将更快! But don't try to reinvent the wheel, there a already a lot of CSV writer out there, ready to use (Spout and PHPExcel both have one for instance). 但是不要尝试重新发明轮子,那里已经有很多CSV编写器可以使用了(例如Spout和PHPExcel都有一个)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM