Excel 내보내기 성능을 최적화하기 위해 xlswriter를 사용하는 PHP에 대한 자세한 설명(코드 예제 포함)

藏色散人
풀어 주다: 2023-04-11 10:40:02
앞으로
4170명이 탐색했습니다.

이 기사에서는 PHP에 대한 관련 지식을 제공하고 주로 xlswriter 확장이 무엇인지에 대해 설명합니다. xlswriter 확장 프로그램을 사용하여 Excel 내보내기 성능을 최적화하는 방법 관심 있는 친구는 아래를 살펴보는 것이 모든 사람에게 도움이 되기를 바랍니다.

xlswriter 정보

xlswriter는 PHP C 확장으로, 대용량 데이터를 내보낼 때 PHP의 성능을 향상하도록 설계되었으며 Windows/Linux를 지원합니다. Excel 2007+ XLSX 파일의 데이터를 읽고, 여러 워크시트를 삽입하고, 텍스트, 숫자, 수식, 날짜, 차트, 그림 및 하이퍼링크를 쓰는 데 사용할 수 있습니다.

다음 기능이 있습니다:

1. 쓰기

  • 100% 호환되는 Excel 차트
  • 데이터 확인 및 드롭다운
  • PNG/JPEG 이미지 시트
  • 대용량 파일 쓰기를 위한 메모리 최적화 모드
  • 작품 Linux, FreeBSD, OpenBSD, OS X, Windows
  • 32비트 및 64용으로 컴파일됨
  • FreeBSD 라이센스
  • 유일한 종속성은 zlib
  • 2. 읽기
  • 전체 읽기 데이터
  • 다음으로 데이터 읽기 커서
데이터 유형별로 읽기

xlsx를 CSV로

성능 비교
  • 데이터를 제공해 주셔서 미리 감사드립니다
  • 다운로드 및 설치
  • github 소스 코드
  • https://github.com/viest/php-ext-xlswriter
    로그인 후 복사
  • xlswriter 문서
https://xlswriter-docs.viest.me/zh-cn/an-zhuang/huan-jing-yao-qiu
로그인 후 복사

IDE 다운로드 helper

composer require viest/php-ext-xlswriter-ide-helper:dev-master
로그인 후 복사
그런데 계속 다운로드가 안되서 github Warehouse에 가서 직접 다운로드 하게 되었습니다 https:/ /github.com/viest/php-ext-xlswriter-ide-helper

그런 다음 내부의 여러 클래스를 xlswriter_ide_helper에 복사해 주세요. php 파일을 프로젝트에 넣으면 코드 프롬프트가 나타납니다.

xlswriter 확장 설치

여기에서 docker를 설치하세요

docker exec -it php72-fpm bashcd /usr/local/bin
pecl install xlswriter
docker-php-ext-enable xlswriter
php -m

php --ri xlswriter
Version => 1.3.6

docker restart php72-fpm
로그인 후 복사

성능 테스트: 테스트 데이터: 20열, 각 열 길이는 영문 19자

X lswriter

PHPSpreadSheet

Excel 내보내기 성능을 최적화하기 위해 xlswriter를 사용하는 PHP에 대한 자세한 설명(코드 예제 포함)

PHP_XLSXWriter

Excel 내보내기 성능을 최적화하기 위해 xlswriter를 사용하는 PHP에 대한 자세한 설명(코드 예제 포함)

사용 예:

private function rankPersonExport($activityInfo, $list){
    $date = date('Y-m-d');
    $filename = "{$activityInfo['orgname']}-{$activityInfo['name']}-个人排行榜-{$date}";
    $header = ['名次', '用户ID', '对接账号', '姓名', '电话', '部门ID', '一级部门', '二级部门', '三级部门', '总积分', '最后积分时间', "毫秒"];
    if (!empty($activityInfo['ext'])) {
        $extArr = json_decode($activityInfo['ext'], true);
        foreach ($extArr as $errItem) {
            array_push($header, $errItem['name']);
        }
    }
    // list
    $listVal = [];
    foreach($list as $v){
        $temp = [
            $v['rank'],
            $v['userid'],
            $v['userName'],
            $v['nickName'],
            $v['phone'],
            $v['departid'],
            $v['topDepartName'],
            $v['secDepartName'],
            $v['thirdDepartName'],
            $v['score'],
            $v['updatetime'],
            $v['micro'],
        ];

        if (!empty($v['ext'])) {
            $extArr = explode('|', $v['ext']);
            foreach ($extArr as $k2 => $v2) {
                $errItemArr = explode('^', $v2);
                array_push($temp, $errItemArr[1]);
            }
        }
        array_push($listVal, $temp);
    }

    $re = downloadXLSX($filename, $header, $listVal);
    if($re){
        return $this->output(0, $re);
    }else{
        return $this->output(1, 'success');
    }}
로그인 후 복사
function getTmpDir(): string{
    $tmp = ini_get('upload_tmp_dir');

    if ($tmp !== False && file_exists($tmp)) {
        return realpath($tmp);
    }

    return realpath(sys_get_temp_dir());}/**
 * download xlsx file
 *
 * @param string $filename
 * @param array $header
 * @param array $list
 * @return string errmsg
 */function downloadXLSX(string $filename, array $header, array $list): string{
    try {
        $config = ['path' => getTmpDir() . '/'];
        $excel  = (new \Vtiful\Kernel\Excel($config))->fileName($filename.'.xlsx', 'Sheet1');
        $fileHandle = $excel->getHandle();
        $format1    = new \Vtiful\Kernel\Format($fileHandle);
        $format2    = new \Vtiful\Kernel\Format($fileHandle);

        // title style
        $titleStyle = $format1->fontSize(16)
            ->bold()
            ->font("Calibri")
            ->align(\Vtiful\Kernel\Format::FORMAT_ALIGN_CENTER, \Vtiful\Kernel\Format::FORMAT_ALIGN_VERTICAL_CENTER)
            ->toResource();

        // global style
        $globalStyle = $format2->fontSize(10)
            ->font("Calibri")
            ->align(\Vtiful\Kernel\Format::FORMAT_ALIGN_CENTER, \Vtiful\Kernel\Format::FORMAT_ALIGN_VERTICAL_CENTER)
            ->border(\Vtiful\Kernel\Format::BORDER_THIN)
            ->toResource();

        $headerLen = count($header);

        // header
        array_unshift($list, $header);

        // title
        $title = array_fill(1, $headerLen - 1, '');
        $title[0] = $filename;
        array_unshift($list, $title);

        $end = strtoupper(chr(65 + $headerLen - 1));
        // column style
        $excel->setColumn("A:{$end}", 15, $globalStyle);
        // title
        $excel->MergeCells("A1:{$end}1", $filename)->setRow("A1", 25, $titleStyle);
        // 冻结前两行,列不冻结
        $excel->freezePanes(2, 0);
        // 数据
        $filePath = $excel->data($list)->output();

        header("Content-Disposition:attachment;filename={$filename}.xlsx");

        $re = copy($filePath, 'php://output');
        if ($re === false) {
            $err = 'failed to write output';
        } else {
            $err = '';
        }
        @unlink($filePath);

        return $err;
    } catch (\Vtiful\Kernel\Exception $e) {
        return $e->getMessage();
    }}
로그인 후 복사
찾을 수 없는 경우 공식 DEMO를 사용했기 때문일 수 있습니다. 문제는 filesize()에 있으며 이 함수는 캐시되므로 다운로드한 파일의 크기가 원본 파일과 다르다는 것을 알 수 있습니다. 나처럼 Content-Length를 설정하지 않거나,clearstatcache()를 사용하여 수동으로 캐시를 지우십시오. 정확히 50,000개의 레코드를 내보내는 데 1.5초가 소요되며, 그 효과는 여전히 매우 강력합니다. 내보내기 효과

Excel 내보내기 성능을 최적화하기 위해 xlswriter를 사용하는 PHP에 대한 자세한 설명(코드 예제 포함)

추천 학습: "

PHP 비디오 튜토리얼

"

위 내용은 Excel 내보내기 성능을 최적화하기 위해 xlswriter를 사용하는 PHP에 대한 자세한 설명(코드 예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿