Pustaka yang agak terkenal untuk PHP menghuraikan Excel ialah phpoffice/phpexcel. Dalam penggunaan sebenar, apabila menghadapi puluhan ribu baris Excel, penggunaan memori phpexcel akan melonjak. Hari ini saya akan memperkenalkan kotak/spout, satu lagi perpustakaan PHP yang cekap menghuraikan Excel.
Lihat pengenalan rasmi: Baca dan tulis fail hamparan dengan cara yang pantas dan berskala Ia dapat dilihat apabila perpustakaan ini menghuraikan Excel, saiz fail Excel tidak akan menjejaskan ingatan terlalu banyak. Ia boleh dikatakan sebagai alternatif kepada PHPExcel.
Memandangkan pautan dokumen pada halaman utama Github pustaka kotak/spout telah dimatikan, berikut ialah contoh mudah untuk menukar fail XLSX kepada 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();
Kaedah penggunaan ialah masih sangat mudah dan jelas.
Seperti yang dinyatakan sebelum ini, saiz memori yang digunakan oleh kotak/spout semasa penghuraian tidak dipengaruhi oleh saiz fail Excel. Bagaimanakah ini dicapai?
Berikut ialah pengenalan ringkas: Format fail XLSX mematuhi piawaian yang dipanggil OOXML (https://zh.wikipedia.org/zh-cn/Office_Open_XML). XLSX sebenarnya adalah pakej Zip yang boleh dinyahmampat untuk melihat kandungannya.
Dalam jadual XLSX, jika kandungan sel ialah rentetan, hanya stringId disimpan apabila benar-benar menyimpan dan kandungan sebenar rentetan disimpan dalam kamus Rentetan.
Apabila membaca fail XLSX, jika sel itu adalah rentetan, Spout akan menanyakan kamus Rentetan. Spout mempunyai dua kaedah pertanyaan Satu ialah membaca sebahagian kamus daripada fail setiap kali, dan satu lagi ialah memuatkan keseluruhan kamus ke dalam memori untuk pertanyaan.
Jelas sekali, memuatkan keseluruhan kamus String ke dalam memori mempunyai kelajuan pertanyaan terpantas. Walau bagaimanapun, Spout terlalu konservatif dan menggunakan kaedah pertanyaan pertama dalam banyak kes. Jadi ubah suai sedikit kod Spout dan biarkan Spout cuba memuatkan semua kamus ke dalam memori:
# Spout/Reader/XLSX/Helper/SharedStringsCaching/CachingStrategyFactory.php class CachingStrategyFactory { .... const MAX_NUM_STRINGS_PER_TEMP_FILE = 10000; // 改成50000 .... }
Cuba tukar EXCEL dengan baris 1.3w, 28 lajur dan saiz 2.8MB ke dalam CSV sebagai perbandingan:
方式 | 耗时 | 占用内存 |
---|---|---|
字典不加载到内存 | 185 s | 1.3 MB |
字典加载到内存 | 43 s | 9.4 MB |
Dapat dilihat perbezaan masa pemprosesan agak besar.
Pembelajaran yang disyorkan: tutorial video php
Atas ialah kandungan terperinci Cara menggunakan kotak/spout untuk menghuraikan jadual Excel yang besar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!