이 기사에서는 PHP에 대한 관련 지식을 제공하고 주로 xlswriter 확장이 무엇인지에 대해 설명합니다. xlswriter 확장 프로그램을 사용하여 Excel 내보내기 성능을 최적화하는 방법 관심 있는 친구는 아래를 살펴보는 것이 모든 사람에게 도움이 되기를 바랍니다.
xlswriter는 PHP C 확장으로, 대용량 데이터를 내보낼 때 PHP의 성능을 향상하도록 설계되었으며 Windows/Linux를 지원합니다. Excel 2007+ XLSX 파일의 데이터를 읽고, 여러 워크시트를 삽입하고, 텍스트, 숫자, 수식, 날짜, 차트, 그림 및 하이퍼링크를 쓰는 데 사용할 수 있습니다.
다음 기능이 있습니다:
1. 쓰기
xlsx를 CSV로
성능 비교https://github.com/viest/php-ext-xlswriter
https://xlswriter-docs.viest.me/zh-cn/an-zhuang/huan-jing-yao-qiu
IDE 다운로드 helpercomposer require viest/php-ext-xlswriter-ide-helper:dev-master
그런데 계속 다운로드가 안되서 github Warehouse에 가서 직접 다운로드 하게 되었습니다 https:/ /github.com/viest/php-ext-xlswriter-ide-helper
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자
사용 예: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초가 소요되며, 그 효과는 여전히 매우 강력합니다. 내보내기 효과
추천 학습: "
PHP 비디오 튜토리얼"
위 내용은 Excel 내보내기 성능을 최적화하기 위해 xlswriter를 사용하는 PHP에 대한 자세한 설명(코드 예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!