Maison > développement back-end > tutoriel php > Explication détaillée sur l'optimisation de l'export PHP vers Excel

Explication détaillée sur l'optimisation de l'export PHP vers Excel

藏色散人
Libérer: 2023-04-08 13:52:01
avant
3187 Les gens l'ont consulté

Contexte

L'optimisation de l'export PHP vers Excel a été introduite dans mon article précédent : Réflexions sur le débordement de mémoire PHP Cet article présente principalement un composant avancé d'export de performances – ​​xlswriter. , qui est une extension PHP C. Pour l'adresse officielle du document, veuillez cliquer sur .

Recommandé : Tutoriel vidéo PHP

Installation

Installer pecl

Lorsque nous constatons que pecl n'est pas installé, nous devons installer pecl. Généralement, il est installé dans le répertoire d'installation de PHP. L'exemple de commande est le suivant :

# 进入PHP安装目录
cd /usr/local/php/bin
curl -o go-pear.php http://pear.php.net/go-pear.phar
php go-pear.php
# 安装完成后,软连接到bin目录下
ln -s /usr/local/php/bin/pecl /usr/bin/pecl
Copier après la connexion

Installer xlswriter

pecl install xlswriter
# 添加 extension = xlswriter.so 到 ini 配置
Copier après la connexion

Utiliser

Pour une utilisation spécifique, veuillez vous référer à la documentation officielle, qui sera présentée plus en détail. Voici le code que j'utilise :

Service d'exportation encapsulé

  /**
     * 下载
     * @param $header
     * @param $data
     * @param $fileName
     * @param $type
     * @return bool
     * @throws
     */
    public function download($header, $data, $fileName)
    {
        $config     = [
            'path' => $this->getTmpDir() . '/',
        ];
        $now        = date('YmdHis');
        $fileName   = $fileName . $now . '.xlsx';
        $xlsxObject = new \Vtiful\Kernel\Excel($config);
        // Init File
        $fileObject = $xlsxObject->fileName($fileName);
        // 设置样式
        $fileHandle = $fileObject->getHandle();
        $format     = new \Vtiful\Kernel\Format($fileHandle);
        $style      = $format->bold()->background(
            \Vtiful\Kernel\Format::COLOR_YELLOW
        )->align(Format::FORMAT_ALIGN_VERTICAL_CENTER)->toResource();
        // Writing data to a file ......
        $fileObject->header($header)
            ->data($data)
            ->freezePanes(1, 0)
            ->setRow('A1', 20, $style);
        // Outptu
        $filePath = $fileObject->output();
// 下载
 header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        header('Content-Disposition: attachment;filename="' . $fileName . '"');
        header('Cache-Control: max-age=0');
        header('Content-Length: ' . filesize($filePath));
        header('Content-Transfer-Encoding: binary');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        ob_clean();
        flush();
        if (copy($filePath, 'php://output') === false) {
            throw new RuntimeException('导出失败');
        }
      
        // Delete temporary file
        @unlink($filePath);
        return true;
    }
    /**
     * 获取临时文件夹
     * @return false|string
     */
    private function getTmpDir()
    {
      // 目录可以自定义
      // return \Yii::$app->params['downloadPath'];
      
        $tmp = ini_get('upload_tmp_dir');
        if ($tmp !== False && file_exists($tmp)) {
            return realpath($tmp);
        }
        return realpath(sys_get_temp_dir());
    }
    /**
     * 读取文件
     * @param $path
     * @param $fileName
     * @return array
     */
    public function readFile($path,$fileName)
    {
        // 读取测试文件
        $config = ['path' => $path];
        $excel  = new \Vtiful\Kernel\Excel($config);
        $data   = $excel->openFile($fileName)
            ->openSheet()
            ->getSheetData();
        return $data;
    }
Copier après la connexion

Code d'appel<🎜. >

Exporter

    /**
     * 导出
     */
    public function actionExport()
    {
        try {
            /**
             * @var $searchModel SkuBarCodeSearch
             */
            $searchModel                     = Yii::createObject(SkuBarCodeSearch::className());
            $queryParams[&#39;SkuBarCodeSearch&#39;] = [];
            $result = $searchModel->search($queryParams, true);
            $formatData = [];
            if (!empty($result)) {
                foreach ($result as $key => &$value) {
                    $tmpData      = [
                        &#39;sku_code&#39;   => $value[&#39;sku_code&#39;],
                        &#39;bar_code&#39;   => $value[&#39;bar_code&#39;],
                        &#39;created_at&#39; => $value[&#39;created_at&#39;],
                        &#39;updated_at&#39; => $value[&#39;updated_at&#39;],
                    ];
                    $formatData[] = array_values($tmpData);
                }
                unset($value);
            }
            $fields = [
                &#39;sku_code&#39;   => &#39;SKU编码&#39;,
                &#39;bar_code&#39;   => &#39;条形码&#39;,
                &#39;created_at&#39; => &#39;创建时间&#39;,
                &#39;updated_at&#39; => &#39;更新时间&#39;,
            ];
            /**
             * @var $utilService UtilService
             */
            $utilService = UtilService::getInstance();
            $utilService->download(array_values($fields), $formatData, &#39;sku_single_code&#39;);
        } catch (\Exception $e) {
            Yii::$app->getSession()->setFlash(&#39;error&#39;, &#39;导出失败&#39;);
        }
    }
Copier après la connexion

Importer

public function actionImportTmpSku()
    {
        try {
            /**
             * @var $utilService UtilService
             */
            $utilService = UtilService::getInstance();
            $path        = &#39;/tmp/&#39;; // 文件目录
            $fileName    = &#39;sku_0320.xlsx&#39;;
            $excelData   = $utilService->readFile($path, $fileName);
            unset($excelData[0]);
            $excelData = array_merge($excelData);
           // ... ... 业务代码
        } catch (\Exception $e) {
            echo $e->getMessage();
            exit;
        }
    }
Copier après la connexion

Conclusion

Après une utilisation globale, lors du traitement de grandes quantités de données, les performances sont en effet supérieures à le PHPExcel original Beaucoup.

Cet article est réimprimé, l'adresse originale est :

https://tsmliyun.github.io/php/PHP%E5%AF%BC%E5%87%BAExcel %E7 %9A%84%E4%BC%98%E5%8C%96/

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!

Étiquettes associées:
php
source:github.io
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal