<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                簡介 PHP解析Excel有個比較有名的庫是phpoffice/phpexcel。在實際使用的過程中,解析一兩百行的Excel沒有問題,遇到上萬行的Excel時,phpexcel的內存使用量會飆升,很容易就能超過128M甚至更多。? 今天我來介紹另一個高效解析Excel的PHP庫box/spout,地址: https://github.com/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 s 1.3 MB 字典加載到內存 43 s 9.4 MB 可見處理時間相差還是挺大的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看