91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用php庫boxspout解析大型Excel表格

發布時間:2021-07-23 17:34:28 來源:億速云 閱讀:220 作者:chen 欄目:編程語言

這篇文章主要介紹“怎么用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();

使用方法還是很簡潔明了的。

使用內存緩存String字典

前面說到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 s1.3 MB
字典加載到內存43 s9.4 MB

可見處理時間相差還是挺大的。

到此,關于“怎么用php庫boxspout解析大型Excel表格”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

蒲江县| 乌拉特前旗| 大厂| 连云港市| 南郑县| 留坝县| 衡水市| 松原市| 望城县| 栾川县| 亳州市| 确山县| 宁海县| 方山县| 通道| 长沙市| 灯塔市| 大宁县| 泸水县| 屏山县| 鄂伦春自治旗| 迁安市| 潢川县| 顺义区| 谷城县| 维西| 和平区| 德惠市| 新田县| 龙山县| 常宁市| 钦州市| 巴东县| 云南省| 丽江市| 云龙县| 龙川县| 寿光市| 武定县| 德兴市| 峨边|