Detailed explanation on optimization of PHP export to Excel

藏色散人
Release: 2023-04-08 13:52:01
forward
3116 people have browsed it

Background

The optimization of PHP export to Excel has been introduced in my previous article: Thinking about PHP memory overflow, this article mainly introduces an advanced Performance export component – ​​xlswriter, which is a PHP C extension. For the official document address, please click.

Recommended: PHP video tutorial

Installation

Install pecl

When we find that pecl is not installed, we need to install pecl. Generally, it is installed in the PHP installation directory. The example command is as follows:

# 进入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
Copy after login

Install xlswriter

pecl install xlswriter
# 添加 extension = xlswriter.so 到 ini 配置
Copy after login

Use

For specific usage, please refer to the official documentation, which will be introduced in more detail. Here is the code I am using:

Encapsulated export service

  /**
     * 下载
     * @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;
    }
Copy after login

Call code

Export

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

Import

public function actionImportTmpSku()
    {
        try {
            /**
             * @var $utilService UtilService
             */
            $utilService = UtilService::getInstance();
            $path        = '/tmp/'; // 文件目录
            $fileName    = 'sku_0320.xlsx';
            $excelData   = $utilService->readFile($path, $fileName);
            unset($excelData[0]);
            $excelData = array_merge($excelData);
           // ... ... 业务代码
        } catch (\Exception $e) {
            echo $e->getMessage();
            exit;
        }
    }
Copy after login

Conclusion

After overall use, when processing large amounts of data, the performance is indeed higher than the original PHPExcel A lot.

This article is reprinted, the original address is:

https://tsmliyun.github.io/php/PHP Optimization of Excel Export/

The above is the detailed content of Detailed explanation on optimization of PHP export to Excel. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
php
source:github.io
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!