使用PhpSpreadsheet導出Excel文件


最近接到個新需求:導出一個包含多個sheet的Excel文件。

本打算用PHPExcel,然后查了一下 發現PHPExcel已經不再維護,PhpSpreadsheet是PHPExcel的下一個版本,那么暫時就用它實現新需求吧。

Composer安裝: composer require phpoffice/phpspreadsheet 

D:\Sites>composer require phpoffice/phpspreadsheet
Using version ^1.8 for phpoffice/phpspreadsheet
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 4 installs, 0 updates, 0 removals
  - Installing markbaker/matrix (1.2.0): Loading from cache
  - Installing markbaker/complex (1.4.7): Loading from cache
  - Installing psr/simple-cache (1.0.1): Loading from cache
  - Installing phpoffice/phpspreadsheet (1.8.2): Loading from cache
phpoffice/phpspreadsheet suggests installing mpdf/mpdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing dompdf/dompdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing tecnickcom/tcpdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing jpgraph/jpgraph (Option for rendering charts, or including charts with PDF or HTML Writers)
Package yiisoft/yii2-codeception is abandoned, you should avoid using it. Use codeception/codeception instead.
Writing lock file
Generating autoload files
安裝過程

 

  

GitHub:https://github.com/PHPOffice/PhpSpreadsheet

實現代碼:

<?php

namespace frontend\controllers;

use Yii;
use yii\web\Controller;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Style\Border;

/**
 * 導出Excel
 */
class ExcelController extends Controller
{
    public function actionIndex()
    {
        $data = [
            ['title_A' => 'A', 'title_B' => 'B', 'title_C' => 'C', 'title_D' => 'D', 'title_E' => 'E', 'title_F' => 'F', 'title_G' => 'G'],
            ['title_A' => 'A1', 'title_B' => 'B1', 'title_C' => 'C1', 'title_D' => 'D1', 'title_E' => 'E1', 'title_F' => 'F1', 'title_G' => 'G1'],
            ['title_A' => 'A2', 'title_B' => 'B2', 'title_C' => 'C2', 'title_D' => 'D2', 'title_E' => 'E2', 'title_F' => 'F2', 'title_G' => 'G2'],
        ];
        $data2 = [
            ['title_A' => 'A', 'title_B' => 'B', 'title_C' => 'C', 'title_D' => 'D', 'title_E' => 'E', 'title_F' => 'F', 'title_G' => 'G'],
            ['title_A' => 'A1', 'title_B' => 'B1', 'title_C' => 'C1', 'title_D' => 'D1', 'title_E' => 'E1', 'title_F' => 'F1', 'title_G' => 'G1'],
            ['title_A' => 'A2', 'title_B' => 'B2', 'title_C' => 'C2', 'title_D' => 'D2', 'title_E' => 'E2', 'title_F' => 'F2', 'title_G' => 'G2'],
        ];
        $data3 = [
            ['title_A' => 'A', 'title_B' => 'B'],
            ['title_A' => 'A1', 'title_B' => 'B1'],
            ['title_A' => 'A2', 'title_B' => 'B2'],
        ];
        
        $title = ['類別', '子類', '需求編號', '需求', '建議采用', '確認是否采用', '不采用原因'];
        $title2 = ['類別', '子類', '需求編號', '需求', '建議采用', '確認是否采用', '不采用原因'];
        $title3 = ['需求編號', '需求詳解'];

        // Create new Spreadsheet object
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet()->setTitle('基礎需求');
        $sheet2 = $spreadsheet->createSheet(1)->setTitle('場景需求');
        $sheet3 = $spreadsheet->createSheet(2)->setTitle('需求說明');

        // 使用 setCellValueByColumnAndRow

        //設置單元格內容
        //設置表頭
        foreach ($title as $key => $value) {
            // 單元格內容寫入
            $sheet->setCellValueByColumnAndRow($key + 1, 1, $value);
        }

        foreach ($title2 as $key => $value) {
            $sheet2->setCellValueByColumnAndRow($key + 1, 1, $value);
        }

        foreach ($title3 as $key => $value) {
            $sheet3->setCellValueByColumnAndRow($key + 1, 1, $value);
        }


        // sheet1 基礎安全需求
        $row = 2; // 從第二行開始
        foreach ($data as $item) {
            $column = 1;
            foreach ($item as $value) {
                // 單元格內容寫入
                $sheet->setCellValueByColumnAndRow($column, $row, $value);
                $column++;
            }
            $row++;
        }

        // sheet2 場景安全需求
        $rowOfSheet2 = 2; // 從第二行開始
        foreach ($data2 as $item) {
            $column = 1;
            foreach ($item as $value) {
                // 單元格內容寫入
                $sheet2->setCellValueByColumnAndRow($column, $rowOfSheet2, $value);
                $column++;
            }
            $rowOfSheet2++;
        }

        // sheet3 安全需求詳解
        $rowOfSheet3 = 2; // 從第二行開始
        foreach ($data3 as $item) {
            $column = 1;
            foreach ($item as $value) {
                // 單元格內容寫入
                $sheet3->setCellValueByColumnAndRow($column, $rowOfSheet3, $value);
                $column++;
            }
            $rowOfSheet3++;
        }

        //設定樣式
        //所有sheet的表頭樣式 加粗
        $font = [
            'font' => [
                'bold' => true,
            ],
        ];
        //所有sheet的內容樣式 加黑色邊框
        $borders = [
            'borders' => [
                'allBorders' => [
                    'borderStyle' => Border::BORDER_THIN,
                    'color' => ['argb' => 'black'],
                ],
            ],
        ];
        $sheet->getStyle('A1:G1')->applyFromArray($font);
        $sheet->getColumnDimension('C')->setWidth(12);
        $sheet->getColumnDimension('D')->setWidth(101);
        $sheet->getColumnDimension('F')->setWidth(25);
        $sheet->getColumnDimension('G')->setWidth(25);

        $sheet2->getStyle('A1:G1')->applyFromArray($font);
        $sheet2->getColumnDimension('C')->setWidth(12);
        $sheet2->getColumnDimension('D')->setWidth(101);
        $sheet2->getColumnDimension('F')->setWidth(25);
        $sheet2->getColumnDimension('G')->setWidth(25);

        $sheet3->getStyle('A1:B1')->applyFromArray($font);
        $sheet3->getColumnDimension('A')->setWidth(15);
        $sheet3->getColumnDimension('B')->setWidth(130);
        $sheet->getStyle('A1:G' . ($row - 1))->applyFromArray($borders);
        $sheet2->getStyle('A1:G' . ($rowOfSheet2 - 1))->applyFromArray($borders);
        $sheet3->getStyle('A1:B' . ($rowOfSheet3 - 1))->applyFromArray($borders)->getAlignment()->setWrapText(true);

        
        // Redirect output to a client’s web browser (Xlsx)
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="安全需求.xlsx"');
        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

        $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
        $writer->save('php://output');
        exit;
    }
}

 

官方文檔:

https://phpspreadsheet.readthedocs.io/en/latest/

  

參考:

https://www.cnblogs.com/woods1815/p/11372007.html

https://www.cnblogs.com/zx-admin/p/11653863.html

https://blog.csdn.net/jaray/article/details/9159147

https://github.com/moonlandsoft/yii2-phpexcel

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM