Rumah > pembangunan bahagian belakang > masalah PHP > Cara menggunakan kotak/spout untuk menghuraikan jadual Excel yang besar

Cara menggunakan kotak/spout untuk menghuraikan jadual Excel yang besar

醉折花枝作酒筹
Lepaskan: 2023-03-11 18:42:01
ke hadapan
2929 orang telah melayarinya

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.

Cara menggunakan kotak/spout untuk menghuraikan jadual Excel yang besar

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();
Salin selepas log masuk

Kaedah penggunaan ialah masih sangat mudah dan jelas.

Gunakan memori untuk menyimpan kamus String

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
  ....
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:csdn.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan