您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么用php庫boxspout解析大型Excel表格”,在日常操作中,相信很多人在怎么用php庫boxspout解析大型Excel表格問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用php庫boxspout解析大型Excel表格”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
PHP解析Excel有個比較有名的庫是phpoffice/phpexcel。在實際使用的過程中,遇到上萬行的Excel時,phpexcel的內存使用量會飆升。今天我來介紹另一個高效解析Excel的PHP庫box/spout。
看官方介紹是:Read and write spreadsheet files in a fast and scalable way,可見這個庫在解析Excel時,Excel文件的大小不會太影響內存的使用量。可以說是PHPExcel一種替代方案。
由于box/spout庫的Github主頁上的文檔鏈接已經掛了,這里簡單寫了一個XLSX文件轉化成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();
使用方法還是很簡潔明了的。
前面說到box/spout在解析時消耗的內存大小,不受Excel文件大小的影響,這是如何做到的呢?
這里簡單科普一下:XLSX文件格式是符合一項標準的,這項標準叫做OOXML(https://zh.wikipedia.org/zh-cn/Office_Open_XML)。XLSX實際上就是一個Zip包,可以解壓縮出來看看其中的內容。
XLSX表格中,如果單元格的內容是一串字符串時,實際保存的時候只保存一個stringId,字符串真正的內容保存在一個String字典中。
在讀取XLSX文件時,如果單元格是字符串,Spout就要去查詢String字典。Spout有兩種查詢方法,一是每次從文件里讀取字典的一部分查詢,二是把整個字典加載到內存里查詢。
顯然把String字典整個加載到內存里,查詢速度最快。但Spout過于保守,很多情況下都是采用第一種查詢方式。所以稍微修改下Spout的代碼,讓Spout盡量把字典全部加載到內存:
# Spout/Reader/XLSX/Helper/SharedStringsCaching/CachingStrategyFactory.php class CachingStrategyFactory { .... const MAX_NUM_STRINGS_PER_TEMP_FILE = 10000; // 改成50000 .... }
試驗一個1.3w行、28列、2.8MB大小的EXCEL轉化成CSV,做個對比:
方式 | 耗時 | 占用內存 |
---|---|---|
字典不加載到內存 | 185 s | 1.3 MB |
字典加載到內存 | 43 s | 9.4 MB |
可見處理時間相差還是挺大的。
到此,關于“怎么用php庫boxspout解析大型Excel表格”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。