使用PhpSpreadsheet怎么導(dǎo)入導(dǎo)出Excel

這篇文章給大家介紹使用PhpSpreadsheet怎么導(dǎo)入導(dǎo)出Excel,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

創(chuàng)新互聯(lián)公司專注于伊春企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城網(wǎng)站建設(shè)。伊春網(wǎng)站建設(shè)公司,為伊春等地區(qū)提供建站服務(wù)。全流程按需求定制開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

phpspreadsheet 引入

由于PHPExcel早就停止更新維護(hù),所以適用phpspreadsheet。不知道如何通過(guò)composer拉取項(xiàng)目包的同學(xué),可以查看Composer學(xué)習(xí)一文。引入方法:

composer require phpoffice/phpspreadsheet
引入命名空間

由于本人項(xiàng)目中需要居中、背景、單元格格式等各種操作,所以引入較多,大家使用的時(shí)候,可以根據(jù)自己實(shí)際需要引入。

use PhpOffice\PhpSpreadsheet\Reader\Xlsx;use PhpOffice\PhpSpreadsheet\Reader\Xls;use PhpOffice\PhpSpreadsheet\IOFactory;use PhpOffice\PhpSpreadsheet\Cell\Coordinate;use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;use PhpOffice\PhpSpreadsheet\Cell\DataType;use PhpOffice\PhpSpreadsheet\Style\Fill;use PhpOffice\PhpSpreadsheet\Style\Color;use PhpOffice\PhpSpreadsheet\Style\Alignment;use PhpOffice\PhpSpreadsheet\Style\Border;use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
Excel導(dǎo)入操作(importExcel)

除了單純的處理Excel數(shù)據(jù)外,還可以將Excel中的合并項(xiàng)、公式項(xiàng)、單元格格式提取,提取后可根據(jù)業(yè)務(wù)需求做對(duì)應(yīng)處理后存儲(chǔ)起來(lái),以便后續(xù)的各種操作。

 */function importExecl(string $file = '', int $sheet = 0, int $columnCnt = 0, &$options = []){
    try {
        /* 轉(zhuǎn)碼 */
        $file = iconv("utf-8", "gb2312", $file);

        if (empty($file) OR !file_exists($file)) {
            throw new \Exception('文件不存在!');
        }

        /** @var Xlsx $objRead */
        $objRead = IOFactory::createReader('Xlsx');

        if (!$objRead->canRead($file)) {
            /** @var Xls $objRead */
            $objRead = IOFactory::createReader('Xls');

            if (!$objRead->canRead($file)) {
                throw new \Exception('只支持導(dǎo)入Excel文件!');
            }
        }

        /* 如果不需要獲取特殊操作,則只讀內(nèi)容,可以大幅度提升讀取Excel效率 */
        empty($options) && $objRead->setReadDataOnly(true);
        /* 建立excel對(duì)象 */
        $obj = $objRead->load($file);
        /* 獲取指定的sheet表 */
        $currSheet = $obj->getSheet($sheet);

        if (isset($options['mergeCells'])) {
            /* 讀取合并行列 */
            $options['mergeCells'] = $currSheet->getMergeCells();
        }

        if (0 == $columnCnt) {
            /* 取得最大的列號(hào) */
            $columnH = $currSheet->getHighestColumn();
            /* 兼容原邏輯,循環(huán)時(shí)使用的是小于等于 */
            $columnCnt = Coordinate::columnIndexFromString($columnH);
        }

        /* 獲取總行數(shù) */
        $rowCnt = $currSheet->getHighestRow();
        $data   = [];

        /* 讀取內(nèi)容 */
        for ($_row = 1; $_row <= $rowCnt; $_row++) {
            $isNull = true;

            for ($_column = 1; $_column <= $columnCnt; $_column++) {
                $cellName = Coordinate::stringFromColumnIndex($_column);
                $cellId   = $cellName . $_row;
                $cell     = $currSheet->getCell($cellId);

                if (isset($options['format'])) {
                    /* 獲取格式 */
                    $format = $cell->getStyle()->getNumberFormat()->getFormatCode();
                    /* 記錄格式 */
                    $options['format'][$_row][$cellName] = $format;
                }

                if (isset($options['formula'])) {
                    /* 獲取公式,公式均為=號(hào)開頭數(shù)據(jù) */
                    $formula = $currSheet->getCell($cellId)->getValue();

                    if (0 === strpos($formula, '=')) {
                        $options['formula'][$cellName . $_row] = $formula;
                    }
                }

                if (isset($format) && 'm/d/yyyy' == $format) {
                    /* 日期格式翻轉(zhuǎn)處理 */
                    $cell->getStyle()->getNumberFormat()->setFormatCode('yyyy/mm/dd');
                }

                $data[$_row][$cellName] = trim($currSheet->getCell($cellId)->getFormattedValue());

                if (!empty($data[$_row][$cellName])) {
                    $isNull = false;
                }
            }

            /* 判斷是否整行數(shù)據(jù)為空,是的話刪除該行數(shù)據(jù) */
            if ($isNull) {
                unset($data[$_row]);
            }
        }

        return $data;
    } catch (\Exception $e) {
        throw $e;
    }}

將數(shù)據(jù)處理好后,可以通過(guò)額外配置,將導(dǎo)出的Excel做各種不同的配置,例如打印樣式、鎖定行、背景色、寬度等。

Excel導(dǎo)出操作(exportExcel)
/**
 * Excel導(dǎo)出,TODO 可繼續(xù)優(yōu)化
 *
 * @param array  $datas      導(dǎo)出數(shù)據(jù),格式['A1' => 'XXXX公司報(bào)表', 'B1' => '序號(hào)']
 * @param string $fileName   導(dǎo)出文件名稱
 * @param array  $options    操作選項(xiàng),例如:
 *                           bool   print       設(shè)置打印格式
 *                           string freezePane  鎖定行數(shù),例如表頭為第一行,則鎖定表頭輸入A2
 *                           array  setARGB     設(shè)置背景色,例如['A1', 'C1']
 *                           array  setWidth    設(shè)置寬度,例如['A' => 30, 'C' => 20]
 *                           bool   setBorder   設(shè)置單元格邊框
 *                           array  mergeCells  設(shè)置合并單元格,例如['A1:J1' => 'A1:J1']
 *                           array  formula     設(shè)置公式,例如['F2' => '=IF(D2>0,E42/D2,0)']
 *                           array  format      設(shè)置格式,整列設(shè)置,例如['A' => 'General']
 *                           array  alignCenter 設(shè)置居中樣式,例如['A1', 'A2']
 *                           array  bold        設(shè)置加粗樣式,例如['A1', 'A2']
 *                           string savePath    保存路徑,設(shè)置后則文件保存到服務(wù)器,不通過(guò)瀏覽器下載
 */function exportExcel(array $datas, string $fileName = '', array $options = []): bool{
    try {
        if (empty($datas)) {
            return false;
        }

        set_time_limit(0);
        /** @var Spreadsheet $objSpreadsheet */
        $objSpreadsheet = app(Spreadsheet::class);
        /* 設(shè)置默認(rèn)文字居左,上下居中 */
        $styleArray = [
            'alignment' => [
                'horizontal' => Alignment::HORIZONTAL_LEFT,
                'vertical'   => Alignment::VERTICAL_CENTER,
            ],
        ];
        $objSpreadsheet->getDefaultStyle()->applyFromArray($styleArray);
        /* 設(shè)置Excel Sheet */
        $activeSheet = $objSpreadsheet->setActiveSheetIndex(0);

        /* 打印設(shè)置 */
        if (isset($options['print']) && $options['print']) {
            /* 設(shè)置打印為A4效果 */
            $activeSheet->getPageSetup()->setPaperSize(PageSetup:: PAPERSIZE_A4);
            /* 設(shè)置打印時(shí)邊距 */
            $pValue = 1 / 2.54;
            $activeSheet->getPageMargins()->setTop($pValue / 2);
            $activeSheet->getPageMargins()->setBottom($pValue * 2);
            $activeSheet->getPageMargins()->setLeft($pValue / 2);
            $activeSheet->getPageMargins()->setRight($pValue / 2);
        }

        /* 行數(shù)據(jù)處理 */
        foreach ($datas as $sKey => $sItem) {
            /* 默認(rèn)文本格式 */
            $pDataType = DataType::TYPE_STRING;

            /* 設(shè)置單元格格式 */
            if (isset($options['format']) && !empty($options['format'])) {
                $colRow = Coordinate::coordinateFromString($sKey);

                /* 存在該列格式并且有特殊格式 */
                if (isset($options['format'][$colRow[0]]) &&
                    NumberFormat::FORMAT_GENERAL != $options['format'][$colRow[0]]) {
                    $activeSheet->getStyle($sKey)->getNumberFormat()
                        ->setFormatCode($options['format'][$colRow[0]]);

                    if (false !== strpos($options['format'][$colRow[0]], '0.00') &&
                        is_numeric(str_replace(['¥', ','], '', $sItem))) {
                        /* 數(shù)字格式轉(zhuǎn)換為數(shù)字單元格 */
                        $pDataType = DataType::TYPE_NUMERIC;
                        $sItem     = str_replace(['¥', ','], '', $sItem);
                    }
                } elseif (is_int($sItem)) {
                    $pDataType = DataType::TYPE_NUMERIC;
                }
            }

            $activeSheet->setCellValueExplicit($sKey, $sItem, $pDataType);

            /* 存在:形式的合并行列,列入A1:B2,則對(duì)應(yīng)合并 */
            if (false !== strstr($sKey, ":")) {
                $options['mergeCells'][$sKey] = $sKey;
            }
        }

        unset($datas);

        /* 設(shè)置鎖定行 */
        if (isset($options['freezePane']) && !empty($options['freezePane'])) {
            $activeSheet->freezePane($options['freezePane']);
            unset($options['freezePane']);
        }

        /* 設(shè)置寬度 */
        if (isset($options['setWidth']) && !empty($options['setWidth'])) {
            foreach ($options['setWidth'] as $swKey => $swItem) {
                $activeSheet->getColumnDimension($swKey)->setWidth($swItem);
            }

            unset($options['setWidth']);
        }

        /* 設(shè)置背景色 */
        if (isset($options['setARGB']) && !empty($options['setARGB'])) {
            foreach ($options['setARGB'] as $sItem) {
                $activeSheet->getStyle($sItem)
                    ->getFill()->setFillType(Fill::FILL_SOLID)
                    ->getStartColor()->setARGB(Color::COLOR_YELLOW);
            }

            unset($options['setARGB']);
        }

        /* 設(shè)置公式 */
        if (isset($options['formula']) && !empty($options['formula'])) {
            foreach ($options['formula'] as $fKey => $fItem) {
                $activeSheet->setCellValue($fKey, $fItem);
            }

            unset($options['formula']);
        }

        /* 合并行列處理 */
        if (isset($options['mergeCells']) && !empty($options['mergeCells'])) {
            $activeSheet->setMergeCells($options['mergeCells']);
            unset($options['mergeCells']);
        }

        /* 設(shè)置居中 */
        if (isset($options['alignCenter']) && !empty($options['alignCenter'])) {
            $styleArray = [
                'alignment' => [
                    'horizontal' => Alignment::HORIZONTAL_CENTER,
                    'vertical'   => Alignment::VERTICAL_CENTER,
                ],
            ];

            foreach ($options['alignCenter'] as $acItem) {
                $activeSheet->getStyle($acItem)->applyFromArray($styleArray);
            }

            unset($options['alignCenter']);
        }

        /* 設(shè)置加粗 */
        if (isset($options['bold']) && !empty($options['bold'])) {
            foreach ($options['bold'] as $bItem) {
                $activeSheet->getStyle($bItem)->getFont()->setBold(true);
            }

            unset($options['bold']);
        }

        /* 設(shè)置單元格邊框,整個(gè)表格設(shè)置即可,必須在數(shù)據(jù)填充后才可以獲取到最大行列 */
        if (isset($options['setBorder']) && $options['setBorder']) {
            $border    = [
                'borders' => [
                    'allBorders' => [
                        'borderStyle' => Border::BORDER_THIN, // 設(shè)置border樣式
                        'color'       => ['argb' => 'FF000000'], // 設(shè)置border顏色
                    ],
                ],
            ];
            $setBorder = 'A1:' . $activeSheet->getHighestColumn() . $activeSheet->getHighestRow();
            $activeSheet->getStyle($setBorder)->applyFromArray($border);
            unset($options['setBorder']);
        }

        $fileName = !empty($fileName) ? $fileName : (date('YmdHis') . '.xlsx');

        if (!isset($options['savePath'])) {
            /* 直接導(dǎo)出Excel,無(wú)需保存到本地,輸出07Excel文件 */
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
            header(
                "Content-Disposition:attachment;filename=" . iconv(
                    "utf-8", "GB2312//TRANSLIT", $fileName
                )
            );
            header('Cache-Control: max-age=0');//禁止緩存
            $savePath = 'php://output';
        } else {
            $savePath = $options['savePath'];
        }

        ob_clean();
        ob_start();
        $objWriter = IOFactory::createWriter($objSpreadsheet, 'Xlsx');
        $objWriter->save($savePath);
        /* 釋放內(nèi)存 */
        $objSpreadsheet->disconnectWorksheets();
        unset($objSpreadsheet);
        ob_end_flush();

        return true;
    } catch (Exception $e) {
        return false;
    }}

關(guān)于使用PhpSpreadsheet怎么導(dǎo)入導(dǎo)出Excel就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

本文題目:使用PhpSpreadsheet怎么導(dǎo)入導(dǎo)出Excel
文章出自:http://muchs.cn/article10/iegggo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、動(dòng)態(tài)網(wǎng)站網(wǎng)站導(dǎo)航、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站制作、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名