PHP讀取超大的excel檔案資料的方案

2021-09-13 11:50:29 字數 4106 閱讀 1803

今天因為乙個老同學找我,說自己公司的物流業務都是現在用excel處理,按月因為資料量大,乙個excel差不多有百萬資料,檔案有接近100m,開啟和搜尋就相當的慢

聯想到場景:要匯入資料,可能excel資料量很大,這裡利用常用的一些方法比如phpexcel會常有時間和記憶體限制問題

下面我們就利用乙個利用流處理的類庫spreadsheetreader來做大excel的讀取

關鍵具體在**裡注釋
<?php

/** * created by phpstorm.

* user: qkl

* date: 2018/7/11

* time: 15:14

*/set_time_limit(0); // 設定指令碼最大執行時間 為0 永不過期

//ini_set('memory_limit','200m'); // 臨時設定最大記憶體占用

function convert($size)

require '../vendor/autoload.php';

$start = memory_get_usage();

echo convert($start) . php_eol;

//$inputfilename = './11111111.xlsx';

$inputfilename = './example1.xlsx';

// if you need to parse xls files, include php-excel-reader

$starttime = microtime(true);

$reader = new spreadsheetreader($inputfilename);

//獲取當前檔案所有的工作表

$sheets = $reader->sheets();

if (!$sheets)

//改變當前處理的工作表

$reader->changesheet(0);

//列印當前所在工作表的當前所在行資料

var_dump($reader->current());

//因為reader類整合了iter所以可以用迭代方式處理

//這裡提醒 如果檔案超大,這邊的處理速度會過慢,不過不會引發記憶體效能問題

//$i = 0;

//foreach ($reader as $row)

////

// echo $i . php_eol;

// print_r($row);

//// $i++;

//}$endtime = microtime(true);

$memoryuse = memory_get_usage();

echo "記憶體占用:" . convert($memoryuse) . "; 用時:" . ($endtime - $starttime) . php_eol;

上面讀取的example1.xlsx檔案有100m左右,讀寫過慢,測試只開了讀取當前預設工作表的當前所在行資料

因資料敏感,已做遮蔽

147.77 kb

array (size=50)

0 => string '************xx' (length=25)

1 => string '************xx' (length=15)

2 => string '************xx' (length=18)

3 => string '************xx' (length=12)

4 => string '************xx' (length=12)

5 => string '************xx' (length=12)

6 => string '************xx' (length=24)

7 => string '************xx' (length=12)

8 => string '************xx' (length=27)

9 => string '************xx' (length=12)

10 => string '************xx' (length=15)

11 => string '************xx' (length=28)

12 => string '************xx' (length=9)

13 => string '************xx' (length=12)

14 => string '************xx' (length=9)

15 => string '************xx' (length=6)

16 => string '************xx' (length=9)

17 => string '************xx' (length=3)

18 => string '************xx' (length=6)

19 => string '************xx' (length=3)

20 => string '************xx' (length=15)

21 => string '************xx' (length=15)

22 => string '************xx' (length=19)

23 => string '************xx' (length=13)

24 => string '************xx' (length=19)

25 => string '************xx' (length=12)

26 => string '************xx' (length=12)

27 => string '************xx' (length=12)

28 => string '************xx' (length=6)

29 => string '************xx' (length=12)

30 => string '************xx' (length=6)

31 => string '************xx' (length=15)

32 => string '************xx' (length=24)

33 => string '************xx' (length=18)

34 => string '************xx' (length=18)

35 => string '************xx' (length=24)

36 => string '************xx' (length=12)

37 => string '************xx' (length=18)

38 => string '************xx' (length=21)

39 => string '************xx' (length=9)

40 => string '************xx' (length=9)

41 => string '************xx' (length=18)

42 => string '************xx' (length=21)

43 => string '************xx' (length=15)

44 => string '************xx' (length=12)

45 => string '************xx' (length=6)

46 => string '************xx' (length=12)

47 => string '************xx' (length=22)

48 => string '************xx' (length=22)

49 => string '' (length=0)

記憶體占用:207.55 kb; 用時:9.5835480690002

php 讀取超大檔案

php開發很多時候都要讀取大檔案,比如csv檔案 text檔案等。這些檔案如果很大,比如10個g。這時,直接一次性把所有的內容讀取到記憶體中計算不太現實。遇到這種情況,往往覺得php太弱,實則不然。利用生成器 關鍵字yield 就能解決。好了,上 created by phpstorm.user a...

php讀取超大檔案fseek

function readmaxfile fp start 0 fseek fp,start,seek set res fread fp,1 content res if substr content,strlen tag tag start 1 if feof fp sleep 3 echo 從位...

php實現讀取超大檔案的方法

通常來說在php讀取大檔案的時候,我們採用的方法一般是一行行來講取,而不是一次性把檔案全部寫入記憶體中,這樣會導致php程式卡死,下面就給大家介紹這樣乙個例子。讀取大檔案最後幾行資料 取檔案最後 n行 param string filename 檔案路徑 param int n 最後幾行 retur...