PHPExcel 按原样写入行,没有任何计算/样式

PHPExcel write rows as is , without any calculation / styling

有没有办法告诉 PHPExcel 只写从数组提供的行,而不做任何计算/应用样式/它在写或使用 fromArray 时做的任何其他事情?

需要这个来提高性能。

        $inputFileName = 'client_files/sample.xlsx';
        $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);

        $objPHPExcel->getSheet(0)->setCellValue('D2', '@' . $user . ' followers');
        $objPHPExcel->getSheet(0)->fromArray(
            $followersData,
            NULL,
            'A5'
        );
        $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
        $objWriter->setPreCalculateFormulas(false);

        $objWriter->save(FINAL_FOLDER . '/' . $line[0] . '.xlsx');

内存消耗不是问题。但是上面只是花费了太多时间(2 分钟 2700 行)

->save() 调用需要 93 秒。 ->fromArray() 需要 53 秒

是否还有其他速度更快的 Excel 库允许加载现有的 xlsx 然后写入它?

谢谢

您可以尝试使用 Spout。如果你不关心styling/calculation,它应该可以解决你的性能问题(只需要几秒钟)。

按照这些思路应该可行:

$inputFileName = 'client_files/sample.xlsx';
$reader = ReaderFactory::create(Type::XLSX);
$reader->open($inputFileName);

$outputFileName = FINAL_FOLDER . '/' . $line[0] . '.xlsx';
$writer = WriterFactory::create(Type::XLSX);
$writer->openToFile($outputFileName);

$reader->nextSheet();

$rowCount = 0;
while ($reader->hasNextRow()) {
    $row = $reader->nextRow();

    if ($rowCount === 1) {
        $row[1] = '@' . $user . ' followers';
    }

    $followersDataForCurrentRow = $followersData[$rowCount];
    $columnIndexStart = 4; // To add stuff in the 5th column

    foreach ($followersDataForCurrentRow as $followerValue) {
        $row[$columnIndexStart] = $followerValue;
        $columnIndexStart++;
    }

    $writer->addRow($row);

    $rowCount++;
}

$reader->close();
$writer->close();

我做了很多事情使性能更快。

  1. 运行脚本外IDE
  2. 将内存限制设置为 3GB
  3. 使用了不同版本的 PHP
  4. 修复了内存泄漏问题

    $objPHPExcel->disconnectWorksheets() ;
    unset($objPHPExcel) ;
    

我不确定是什么解决了这个问题..