Implementierung eines schnellen Imports von Excel nach PHP

    Wir sprechen weiterhin über die Technologien, die in unserem E-Mail-Marketing-Service Pechkin-mail.ru verwendet werden . Eine der Hauptaufgaben eines Dienstes im Zusammenhang mit Kundendaten besteht darin, diese Daten in den Dienst hochzuladen. Für Pechkin ist es sehr wichtig, die Adressdatenbanken mit E-Mail-Adressen, Namen, Nachnamen und anderen zusätzlichen Daten schnell und einfach herunterzuladen.

    Was als Werkzeug verwenden?


    Als Grundstandard für den Import von Adressdatenbanken haben wir Microsoft Excel verwendet. Die Erklärung ist einfach:
    • Es ist ein Standardwerkzeug, das im Grunde genommen 100% der Computerbenutzer gehört. Darüber hinaus ist es im Geschäftsleben ein De-facto-Unternehmensstandard und wird auch auf Mac- oder Linux-Computern verwendet.
    • Fast alle CRM-, CMS-, Cloud- oder Desktop-Systeme werden nach Excel oder CSV exportiert, die durch einfaches erneutes Speichern in das XLS- oder XLSX-Format konvertiert werden können.
    • Es ist auch bekannt, dass „90% der Softwarefehler einen halben Meter vom Monitor entfernt sind“. Gewöhnliche Benutzer werden nicht beleidigt, aber wir müssen das grundlegendste Schulungsniveau und diese berücksichtigen. Die Unterstützung für Erklärungen reicht aus, um "Excel-Datei herunterladen" zu sagen und nicht um das Verfahren zum Vorbereiten der Datei im gewünschten Format zu erläutern.


    Das Problem der Benutzer beim Importieren von Adressdatenbanken wurde behoben. Aber hier tritt das Problem der Entwicklung selbst auf.


    Unser Schmerz als Entwickler


    Excel ist keine Open-Source-Entwicklung, sondern eine proprietäre Lösung. Das Datenformat, insbesondere in neuen Versionen nach 2007 (xlsx), ist nicht trivial. PHP wird auf Pechkina verwendet, daher haben wir nach Bibliotheken gesucht, mit denen wir dieses Problem lösen können. Hier stießen sie jedoch auf das Problem, dass einige Bibliotheken das Lesen von xlsx nicht zulassen:
    • PHP-Spreadsheetreader liest eine Vielzahl von Formaten (.xls, .ods UND .csv)
    • PHP-ExcelReader (nur XLS )
    • PHP_Excel_Reader (nur xls)
    • PHP_Excel_Reader2 (nur xls)
    • XLS File Reader Kommerziell und nur XLS
    • SimpleXLSX Aus der Beschreibung, die xlsx lesen kann, bezieht sich der Autor jedoch nur auf xls
    • Nur PHP Excel Explorer Commercial und XLS


    Die PHPExcel- Bibliothek hat unsere Aufmerksamkeit erregt . Wir haben es vor einigen Jahren im SMS-Mailing-Dienst SMS24X7.ru verwendet . Petya Sokolov ( Petr_Sokolov ), unser talentierter Entwickler, hat einen Wrapper für diese Bibliothek geschrieben, der einige ihrer Fehler und Bugs korrigiert.

    Die Bibliothek ist sicherlich interessant und entwickelt. Aber für Pechkin wurde es nach ein paar Jahren, als sowohl wir als auch unsere Kunden wuchsen, unmöglich, es zu verwenden - seine katastrophalen Anforderungen an die Ressourcen und die enorme Zeit für das Parsen von Dateien. Beispielsweise ist es nicht ungewöhnlich, Adressdatenbanken> 100.000 Zeilen mit einer komplexen Struktur in den Dienst herunterzuladen. Und wenn die Datei bereits 500.000 Zeilen lang ist und mehr als 30 MB „wiegt“?

    Und dann wurden wir losgelassen ...


    Während der Suche stießen wir auf die libxl- Handelsbibliothek und sahen die Ergebnisse eines „provisorischen Benchmarks“ für Stackoverflow.

    Die Bibliothek ist in C ++ geschrieben und dank der hervorragenden objektorientierten Erweiterung für PHP von Ilia Alshanetsky leicht zu erlernen und zu integrieren (zum Beispiel dauerte die Übertragung unserer aktuellen Lösung von PHPExcel auf LibXL etwa 3 Stunden). Das ist sehr cool, wenn man bedenkt, dass es leider keine Dokumentation vom Erweiterungsentwickler gibt und Sie die Reflection-Erweiterung verwenden müssen.

    Der Installationsvorgang ist sehr einfach.

    cd /usr/local/src/
    wget http://libxl.com/download/libxl.tar.gz
    tar zxfv libxl.tar.gz
    cd libxl-3.5.4.1/
    ln -s include_c include
    cd ../
    wget https://github.com/iliaal/php_excel/archive/master.zip
    unzip master.zip
    cd php_excel-master/
    ./configure --with-excel --with-libxl-libdir=../libxl-3.5.4.1/lib64 --with-libxl-incdir=../libxl-3.5.4.1/include_c
    make
    make test
    make install


    Als Ergebnis der Kompilierung erhalten Sie die Datei excel.so im Ordner / usr / lib / php5 / 20090626 /. Erstellen Sie nun einfach die Datei /etc/php5/conf.d/excel.ini mit dem Inhalt.
    extension=excel.so


    Überprüfen Sie, ob das Modul installiert ist, und starten Sie den Webserver neu.
    php -m | grep excel
    service lighttpd restart
    


    Im Code ist auch alles sehr einfach. Laden Sie die Datei herunter und lesen Sie die erforderlichen Zellen. Zum Beispiel so:
    $doc = new ExcelBook(); 
    $doc->loadFile(‘example.xls’);
    for($r=$sheet->firstRow();$r<=$sheet->lastRow();$r++){
    	for($c=$sheet-> firstCol();$c<=$sheet-> lastCol();$c++){
    		echo ‘Строка: ’.$r.’ Столбец: ’.$c.’ Значение: ’.$sheet->read($r,$c).’
    ’; } }


    Leistungsergebnisse


    Das Fehlen von RAM (beim Herunterladen und Lesen der Datei) war angenehm erfreut.


    Und hier ist die Erhöhung der Geschwindigkeit, mit der eine Excel-Datei geladen und auf verschiedenen Größen von Adressbasen gelesen wird.


    Diese Tests wurden an xlsx-Dateien mit N Abonnenten in einem Hundertstel per E-Mail durchgeführt. Die realen Adressbasen sind noch größer und komplexer, und der Vorteil in Bezug auf Geschwindigkeit und Speicherverbrauch ist noch größer.

    Die Kosten für die Bibliothek betragen 199 US-Dollar für eine Entwicklungslizenz, aber glauben Sie mir, es lohnt sich. Natürlich empfehlen wir jedem, der mit dem Problem des Importierens von Excel-Dateien in seinen Dienst konfrontiert ist.

    Jetzt auch beliebt: