導出excel表格,csv文件,將xls,csv轉數組,保存至服務器

瀏覽:192 發布日期:2020/04/03 分類:技術分享 關鍵字: phpexcel excel csv
php 7.0
composer require phpoffice/phpspreadsheet:1.8.2
可以直接使用mysql的select語句 直接導出文件
2020-04-03, 導出 導入
2020-04-04 發現少寫了下載,晚上花點時間
2020-04-05,增加保存至服務器端<?php

/**
 *  +----------------------------------------------------------------------
 *  | ThinkPHP [ WE CAN DO IT JUST THINK ]
 *  +----------------------------------------------------------------------
 *  | Copyright (c) 2020 ahai574 All rights reserved.
 *  +----------------------------------------------------------------------
 *  | Licensed ( ++++ahai574++++ )
 *  +----------------------------------------------------------------------
 *  | Author: 阿海 <[email protected]>
 *  +----------------------------------------------------------------------
 *  處理導入excel 導入csv  導出xls xlsx csv
 */

namespace app\common\library;

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;

class PHPExcelLib
{
    /**
     * 文件保存名稱 不用寫后綴 ,默認會使用下載驅動作為后綴
     */
    private $fileName = 'excel';

    /**
     * 下載文件的驅動類
     *  如Xls,Xlsx
     */
    private $downloadClass = 'Xlsx';

    /**
     * 是下載還是保存至本地  默認是下載文件
     */
    private $isDownload = true;

   /**
     * 保存至服務器的路徑
     */
    private $filePath = "";

     /**
     * 保存至服務器的路徑+文件名稱 -- 這個不需要設置 ---自動使用 $filePath+$fileName+時間
     */
    private $saveFilePath = "";

    /**
     * excel表的數據 --- 模擬數據格式 是mysql查詢的二維數組
     * [
     *  ['id' => 1, 'name' => '阿海', 'age' => 'unknow', 'gender' => 'male'],
     *  ['id' => 2, 'name' => '小鬼', 'age' => '18', 'gender' => 'male']
     * ]
     */
    private $excelData = [];


    public function __construct($config = [])
    {
        isset($config['fileName']) && $this->fileName =  mb_convert_encoding($config['fileName'], 'UTF-8', 'UTF-8,GBK,GB2312,BIG5');
        isset($config['downloadClass']) && $this->downloadClass = $config['downloadClass'];
        isset($config['excelData']) && $this->excelData = $config['excelData'];
        isset($config['isDownload']) && $this->isDownload = (bool) $config['isDownload'];
        $this->filePath = isset($config['filePath']) ? $config['filePath'] : "runtime/uploads/files/" . date("Y-m-d");     
        //文件名去除后綴
        if (strripos($this->fileName, ".") !== false) {
            $this->fileName = substr($this->fileName, 0, strripos($this->fileName, "."));
        }
        //如果是保存至本地 則設置保存的文件路徑及名稱,同樣由于可能存在同名稱 所以給加了一個隨機數給這個文件名稱,一般夠用
        $this->saveFilePath = !($this->isDownload) ? $this->filePath."/". $this->fileName."_".time().rand(0,1000). "." . strtolower($this->downloadClass):'';
    }

    /**
     * 下載時的header頭 
     */
    private function header()
    { 
        if($this->isDownload){
            // Redirect output to a client’s web browser (Xlsx)
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
            header('Content-Disposition: attachment;filename="' . $this->fileName . "." . strtolower($this->downloadClass) . '"');
            header('Cache-Control: max-age=0');
            // If you're serving to IE 9, then the following may be needed
            header('Cache-Control: max-age=1');
            // If you're serving to IE over SSL, then the following may be needed
            header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
            header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
            header('Pragma: public'); // HTTP/1.0
        }else{ 
            // 確保文件沒有緩存,在ios上可能會出現問題
            header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
            header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
            header("Cache-Control: no-store, no-cache, must-revalidate");
            header("Cache-Control: post-check=0, pre-check=0", false);
            header("Pragma: no-cache");
        }
        
       
    }

    /**
     * 設置數據源,可以用于被下載的文件  -- 以mysql select() 的查詢結果(二維數組,默認會把索引作為標題行)即可
     * @param Array $data
     */
    public function SetExcelData($data)
    {
        if (!is_array($data)) {
            throw new \Exception('數據格式必須是二維數組');
        }

        $this->excelData = $data;
        return $this;
    }

    /**
     * 下載文件支持: xls xlsx csv
     */
    public function createServer()
    {   
        $this->header();

        //設置允許的請求時間
        @set_time_limit(5 * 60);

        $spreadsheet = new Spreadsheet();

        // Set document properties
        $spreadsheet->getProperties()->setCreator('Maarten Balliauw')
            ->setLastModifiedBy('Maarten Balliauw')
            ->setTitle('Office 2007 XLSX Test Document')
            ->setSubject('Office 2007 XLSX Test Document')
            ->setDescription('Test document for Office 2007 XLSX, generated using PHP classes.')
            ->setKeywords('office 2007 openxml php')
            ->setCategory('Test result file');

        $spreadsheet->setActiveSheetIndex(0);
        // Add some data
        foreach ($this->excelData as $key => $val) {
            $i = 0;
            //首次 第一行放數組的索引名稱
            if ($key == 0) {
                foreach ($val as $k => $v) {
                
                    //總共可以有52列
                    if ($i <= 25) {
                        $spreadsheet->setActiveSheetIndex(0)->setCellValue(chr(65 + $i) . ($key + 1), $k);
                    } else if ($i > 25 && $i <= 51) {
                        $spreadsheet->setActiveSheetIndex(0)->setCellValue(chr(65) . chr(39 + $i) . ($key + 1), $k);
                    } else {
                        throw new \Exception("數據列比較長了,請在此處繼續擴展");
                    }
                    $i++;
                }
            }

            $i = 0;
            //從excel第二行開始放數據
            foreach ($val as $k => $v) {
          
                //總共可以有52列
                if ($i <= 25) {
                    $spreadsheet->setActiveSheetIndex(0)->setCellValue(chr(65 + $i) . ($key + 2), $v);
                } else if ($i > 25 && $i <= 51) {
                    $spreadsheet->setActiveSheetIndex(0)->setCellValue(chr(65) . chr(39 + $i) . ($key + 2), $v);
                } else {
                    throw new \Exception("數據列比較長了,請在此處繼續擴展");
                }
                $i++;
            }
        }

        $writer = IOFactory::createWriter($spreadsheet, ucfirst($this->downloadClass));

        if($this->isDownload){   
            $writer->save('php://output');
            exit;
        }else{         
            $writer->save($this->saveFilePath);
            //返回文件路徑
            return $this->saveFilePath;
        }            
    }

    /**
     * .xls文件 .csv文件 .tsv數據轉數組
     * @param string $filePath  相對路徑 如 runtime/example1.csv
     * @return Array
     */
    public function fileToArray($filePath)
    {
        if(!file_exists($filePath)){
            throw new \Exception("文件不存在,請檢查文件路徑");
        }
        $spreadsheet = IOFactory::load($filePath);
        $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);
        return $sheetData;
    }

}
最佳答案
評論( 相關
后面還有條評論,點擊查看>>
滚雪球理财骗局揭秘