Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie Box/Spout zum Parsen großer Excel-Tabellen

So verwenden Sie Box/Spout zum Parsen großer Excel-Tabellen

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-07-22 17:34:052843Durchsuche

Eine bekannte Bibliothek für PHP-Parsing in Excel ist phpoffice/phpexcel. Bei der tatsächlichen Verwendung steigt die Speichernutzung von PHPExcel stark an, wenn auf Zehntausende Excel-Zeilen gestoßen wird. Heute werde ich box/spout vorstellen, eine weitere PHP-Bibliothek, die Excel effizient analysiert.

So verwenden Sie Box/Spout zum Parsen großer Excel-Tabellen

Sehen Sie sich die offizielle Einführung an: Tabellenkalkulationsdateien schnell und skalierbar lesen und schreiben. Es ist ersichtlich, dass die Größe der Excel-Datei beim Parsen von Excel keinen allzu großen Einfluss auf die Speichernutzung hat. Man kann sagen, dass es eine Alternative zu PHPExcel ist.

Da der Dokumentenlink auf der Github-Homepage der Box/Spout-Bibliothek nicht verfügbar ist, finden Sie hier ein einfaches Beispiel für die Konvertierung einer XLSX-Datei in CSV:

include 'vendor/autoload.php';
use Box\Spout\Reader\ReaderFactory;
use Box\Spout\Common\Type;

$t = time();
$reader = ReaderFactory::create(Type::XLSX);
//如果注释掉,单元格内的日期类型将会是DateTime,不注释的话Spout自动帮你将日期转化成string
//$reader->setShouldFormatDates(true);
$reader->open('./test.xlsx');
$iterator = $reader->getSheetIterator();
$iterator->rewind();
$sheet1 = $iterator->current();
$rowIter = $sheet1->getRowIterator();
foreach ($rowIter as $row) {
    $d = '';
    foreach ($row as $col) {
        echo $d;
        if ($col instanceof DateTime) {
            echo $col->format('Y-m-d');
        } else {
            echo $col;
        }
        $d = "\t";
    }
    echo PHP_EOL;
}
$reader->close();

Die Verwendung ist immer noch sehr einfach und klar.

Speicher zum Zwischenspeichern des String-Wörterbuchs verwenden

Wie bereits erwähnt, wird die von Box/Spout beim Parsen verbrauchte Speichergröße nicht von der Größe der Excel-Datei beeinflusst.

Hier eine kurze Einführung: Das XLSX-Dateiformat entspricht einem Standard namens OOXML (https://zh.wikipedia.org/zh-cn/Office_Open_XML). XLSX ist eigentlich ein Zip-Paket, das dekomprimiert werden kann, um seinen Inhalt anzuzeigen.

Wenn in der XLSX-Tabelle der Inhalt der Zelle ein String ist, wird beim tatsächlichen Speichern nur eine String-ID gespeichert und der tatsächliche Inhalt des Strings wird in einem String-Wörterbuch gespeichert.

Wenn beim Lesen einer XLSX-Datei die Zelle eine Zeichenfolge ist, fragt Spout das String-Wörterbuch ab. Spout verfügt über zwei Abfragemethoden. Eine besteht darin, jedes Mal einen Teil des Wörterbuchs aus der Datei zu lesen, und die andere darin, das gesamte Wörterbuch zur Abfrage in den Speicher zu laden.

Das Laden des gesamten String-Wörterbuchs in den Speicher hat offensichtlich die schnellste Abfragegeschwindigkeit. Allerdings ist Spout zu konservativ und in vielen Fällen wird die erste Abfragemethode verwendet. Ändern Sie also den Spout-Code leicht und lassen Sie Spout versuchen, alle Wörterbücher in den Speicher zu laden:

# Spout/Reader/XLSX/Helper/SharedStringsCaching/CachingStrategyFactory.php
class CachingStrategyFactory {
  ....
  const MAX_NUM_STRINGS_PER_TEMP_FILE = 10000; // 改成50000
  ....
}

Versuchen Sie, zum Vergleich eine Excel-Datei mit 1,3 W Zeilen, 28 Spalten und 2,8 MB Größe in CSV zu konvertieren:

Methode Zeitaufwendig Speicher beanspruchen
Wörterbuch nicht in den Speicher geladen 185 s 1,3 MB
Wörterbuch in den Speicher geladen 43 s 9,4. MB

Sichtbare Verarbeitung Zeit Der Unterschied ist ziemlich groß.

Empfohlenes Lernen: php-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Box/Spout zum Parsen großer Excel-Tabellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen