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)

Explication détaillée de PHP utilisant xlswriter pour optimiser les performances d'exportation Excel (avec exemples de code)

藏色散人
藏色散人avant
2023-02-24 15:46:114146parcourir

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.

À propos de xlswriter

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

  • Graphiques Excel 100% compatibles
  • Validation des données et listes déroulantes
  • Feuilles d'images PNG/JPEG
  • Mode mémoire optimisé pour l'écriture de fichiers volumineux
  • Travaux sous Linux, FreeBSD, OpenBSD, OS X, Windows
  • Compilé pour 32 bits et 64
  • Licence FreeBSD
  • La seule dépendance est zlib
  • 2. Lire
  • Données de lecture complètes
  • Lire les données avec curseur
Lire par type de données

xlsx vers CSV

Comparaison des performances
  • Merci d'avance de fournir des données
  • Télécharger et installer
  • code source github
  • https://github.com/viest/php-ext-xlswriter
  • document xlswriter
https://xlswriter-docs.viest.me/zh-cn/an-zhuang/huan-jing-yao-qiu

Télécharger l'idée helper

composer 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

Ensuite, copiez plusieurs classes à l'intérieur dans un xlswriter_ide_helper. php. Mettez ce fichier dans votre projet et vous obtiendrez des invites de code.

Installez l'extension xlswriter

Installez dans Docker ici

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

Test de performance : Données de test : 20 colonnes, chaque longueur de colonne est de 19 lettres anglaises

Xlswriter

PHPSpreadSheet

Explication détaillée de PHP utilisant xlswriter pour optimiser les performances dexportation Excel (avec exemples de code)

PHP_XLSXWriter

Explication détaillée de PHP utilisant xlswriter pour optimiser les performances dexportation Excel (avec exemples de code)

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

Explication détaillée de PHP utilisant xlswriter pour optimiser les performances dexportation Excel (avec exemples de code)

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer