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

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

醉折花枝作酒筹
풀어 주다: 2023-03-11 18:42:01
앞으로
2929명이 탐색했습니다.

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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿