Maison > Article > développement back-end > Explication détaillée de PHP utilisant xlswriter pour optimiser les performances d'exportation Excel (avec exemples de code)
Cet article vous apporte des connaissances pertinentes sur php, et parle principalement de qu'est-ce que l'extension xlswriter ? Comment utiliser l'extension xlswriter pour optimiser les performances d'exportation Excel. Les amis intéressés peuvent jeter un œil ci-dessous. J'espère que cela sera utile à tout le monde.
xlswriter est une extension PHP C, conçue pour améliorer les performances de PHP lors de l'exportation de grandes quantités de données, et prend en charge Windows/Linux. Peut être utilisé pour lire des données dans des fichiers Excel 2007+ XLSX, insérer plusieurs feuilles de calcul, écrire du texte, des nombres, des formules, des dates, des graphiques, des images et des hyperliens.
Il possède les fonctionnalités suivantes :
1. Écrire
xlsx vers CSV
Comparaison des performanceshttps://github.com/viest/php-ext-xlswriter
https://xlswriter-docs.viest.me/zh-cn/an-zhuang/huan-jing-yao-qiu
Télécharger l'idée helpercomposer require viest/php-ext-xlswriter-ide-helper:dev-master
Mais je n'arrivais pas à télécharger, alors je suis allé à l'entrepôt github pour télécharger directement https://github.com/viest/php-ext-xlswriter-ide-helper
Installez l'extension xlswriter
Installez dans Docker icidocker 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
Test de performance : Données de test : 20 colonnes, chaque longueur de colonne est de 19 lettres anglaises
Exemple d'utilisation :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(); }}Si trouvé, les fichiers téléchargés ne peuvent parfois pas être ouvert. C'est peut-être parce que vous avez utilisé le DEMO officiel. Le problème réside dans filesize(), cette fonction est mise en cache, vous constaterez donc que la taille du fichier téléchargé est différente de celle du fichier d'origine. Soit ne définissez pas Content-Length comme je l'ai fait, soit effacez le cache manuellement à l'aide de clearstatcache(). Précisément, il faut 1,5 seconde pour exporter 50 000 enregistrements, et l'effet est toujours très puissant. Effet d'exportation
Apprentissage recommandé : "
Tutoriel vidéo PHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!