>  기사  >  백엔드 개발  >  Box/Spout를 사용하여 대형 Excel 테이블을 구문 분석하는 방법

Box/Spout를 사용하여 대형 Excel 테이블을 구문 분석하는 방법

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-07-22 17:34:052843검색

PHP 구문 분석 Excel용으로 잘 알려진 라이브러리는 phpoffice/phpexcel입니다. 실제 사용 시 수만 개의 Excel 행을 만나면 phpexcel의 메모리 사용량이 급증하게 됩니다. 오늘은 엑셀을 효율적으로 파싱하는 또 다른 PHP 라이브러리인 box/spout를 소개하겠습니다.

Box/Spout를 사용하여 대형 Excel 테이블을 구문 분석하는 방법

공식 소개를 보세요: 빠르고 확장 가능한 방식으로 스프레드시트 파일을 읽고 작성합니다. 이 라이브러리가 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();

사용법은 여전히 ​​매우 간단하고 명확합니다.

메모리를 사용하여 문자열 사전 캐시

앞서 언급한 것처럼 구문 분석 중 상자/스파우트에서 소비하는 메모리 크기는 Excel 파일 크기에 영향을 받지 않습니다.

간단한 과학은 다음과 같습니다. XLSX 파일 형식은 OOXML(https://zh.wikipedia.org/zh-cn/Office_Open_XML)이라는 표준을 따릅니다. XLSX는 실제로 압축을 풀어 내용을 볼 수 있는 Zip 패키지입니다.

XLSX 테이블에서 셀의 내용이 문자열인 경우 실제로 저장할 때는 stringId만 저장되고, 문자열의 실제 내용은 String 사전에 저장됩니다.

XLSX 파일을 읽을 때 셀이 문자열이면 Spout는 문자열 사전을 쿼리합니다. Spout에는 두 가지 쿼리 방법이 있는데, 하나는 매번 파일에서 사전의 일부를 읽는 것이고, 다른 하나는 쿼리를 위해 전체 사전을 메모리에 로드하는 것입니다.

분명히 전체 문자열 사전을 메모리에 로드하는 것이 쿼리 속도가 가장 빠릅니다. 하지만 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로 변환해 보세요.

method 시간이 많이 걸립니다 메모리를 차지합니다
사전이 메모리에 로드되지 않았습니다 185초 1.3MB
사전이 메모리에 로드되었습니다 43초 9.4MB

가시적 처리 시간 차이가 꽤 크네요.

추천 학습: php 비디오 튜토리얼

위 내용은 Box/Spout를 사용하여 대형 Excel 테이블을 구문 분석하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제