詳解PhpSpreadsheet設置單元格 導入導出

PhpSpreadsheet提供了豐富的API接口,可以設置諸多單元格以及文檔屬性,包括樣式、圖片、日期、函數等等諸多應用,總之你想要什麼樣的Excel表格,PhpSpreadsheet都能做到。

在thinkphp中引入該三方庫的方法:

composer require phpoffice/phpspreadsheet

各個功能類說明如下:

use PhpOffice\PhpSpreadsheet\Spreadsheet;

use PhpOffice\PhpSpreadsheet\Style\Color;       //設置字體顏色

use PhpOffice\PhpSpreadsheet\Style\Alignment;   //設置對齊方式

use PhpOffice\PhpSpreadsheet\Style\Border;      //設置Border樣式

use PhpOffice\PhpSpreadsheet\Style\NumberFormat;//數字格式化

use PhpOffice\PhpSpreadsheet\Writer\Xlsx;       //導出XLSX文件

use PhpOffice\PhpSpreadsheet\Style\Fill;        //設置背景色

 

在調試設置時,確保引入了正確的文件並實例化。


 
  1. use PhpOffice\PhpSpreadsheet\Spreadsheet;

  2.  
  3. $spreadsheet = new Spreadsheet();

  4. $worksheet = $spreadsheet->getActiveSheet();

 

 

設置工作簿的默認樣式

可以設置工作簿的默認樣式。讓我們將默認字體設置爲Arial大小8:

$spreadsheet->getDefaultStyle()->getFont()->setName('Arial');
$spreadsheet->getDefaultStyle()->getFont()->setSize(8);

字體

第1行代碼將A7至B7兩單元格設置爲粗體字,Arial字體,10號字;第2行代碼將B1單元格設置爲粗體字。


 
  1. $spreadsheet->getActiveSheet()->getStyle('A7:B7')->getFont()->setBold(true)->setName('Arial')

  2. ->setSize(10);;

  3. $spreadsheet->getActiveSheet()->getStyle('B1')->getFont()->setBold(true);

顏色

將文字顏色設置爲紅色。


 
  1. $spreadsheet->getActiveSheet()->getStyle('A4')

  2. ->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);

圖片

可以將圖片加載到Excel中。


 
  1. $drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();

  2. $drawing->setName('Logo');

  3. $drawing->setDescription('Logo');

  4. $drawing->setPath('./images/officelogo.jpg');

  5. $drawing->setHeight(36);

列寬

將A列寬度設置爲30(字符)。

$spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(30);

如果需要自動計算列寬,可以這樣:

$spreadsheet->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);

設置默認列寬爲12。

$spreadsheet->getActiveSheet()->getDefaultColumnDimension()->setWidth(12);

行高

設置第10行行高爲100pt。

$spreadsheet->getActiveSheet()->getRowDimension('10')->setRowHeight(100);

設置默認行高。

$spreadsheet->getActiveSheet()->getDefaultRowDimension()->setRowHeight(15);

對齊

將A1單元格設置爲水平居中對齊。


 
  1. $styleArray = [

  2. 'alignment' => [

  3. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,

  4. ],

  5. ];

  6. $worksheet->getStyle('A1')->applyFromArray($styleArray);

給多行設置相同樣式的方法,多行設置

$worksheet->getStyle('A1:F15')->applyFromArray($styleArray);

合併

將A18到E22合併爲一個單元格。

$spreadsheet->getActiveSheet()->mergeCells('A18:E22');

$worksheet->getStyle('C1')->applyFromArray($styleArray);

$spreadsheet->getActiveSheet()->setCellValue('C1''C1居中');

 

//合併單元格 A7到F7,並且給合併的單元格設值;

$spreadsheet->getActiveSheet()->mergeCells('A7:F7');

$spreadsheet->getActiveSheet()->setCellValue('A7''合併單元格A7到F7');

 

拆分

將合併後的單元格拆分。

$spreadsheet->getActiveSheet()->unmergeCells('A18:E22');

邊框

將B2至G8的區域添加紅色邊框。


 
  1. $styleArray = [

  2. 'borders' => [

  3. 'outline' => [

  4. 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,

  5. 'color' => ['argb' => 'FFFF0000'],

  6. ],

  7. ],

  8. ];

  9. $worksheet->getStyle('B2:G8')->applyFromArray($styleArray);

工作表標題

設置當前工作表標題。

$spreadsheet->getActiveSheet()->setTitle('Hello');

日期時間

設置日期格式。


 
  1. $spreadsheet->getActiveSheet()

  2. ->setCellValue('D1', '2018-06-15');

  3.  
  4. $spreadsheet->getActiveSheet()->getStyle('D1')

  5. ->getNumberFormat()

  6. ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDD2);

換行

使用\n進行單元格內換行,相當於(ALT+"Enter")。


 
  1. $spreadsheet->getActiveSheet()->getCell('A4')->setValue("hello\nworld");

  2. $spreadsheet->getActiveSheet()->getStyle('A4')->getAlignment()->setWrapText(true);

超鏈接

將單元格設置爲超鏈接形式。


 
  1. $spreadsheet->getActiveSheet()->setCellValue('E6', 'www.helloweba.net');

  2. $spreadsheet->getActiveSheet()->getCell('E6')->getHyperlink()->setUrl('https://www.helloweba.net');

使用函數

使用SUM計算B5到C5之間單元格的總和。其他函數同理:最大數(MAX),最小數(MIN),平均值(AVERAGE)。


 
  1. $spreadsheet->getActiveSheet()

  2. ->setCellValue('B7', '=SUM(B5:C5)');

//設置F11爲A11到E11之間的總和

$spreadsheet->getActiveSheet()->setCellValue('A11', 1);

$spreadsheet->getActiveSheet()->setCellValue('B11', 2);

$spreadsheet->getActiveSheet()->setCellValue('C11', 3);

$spreadsheet->getActiveSheet()->setCellValue('D11', 4);

$spreadsheet->getActiveSheet()->setCellValue('E11', 5);

//計算總和

$spreadsheet->getActiveSheet()->setCellValue('F11''=SUM(A11:E11)');

 

 

設置文檔屬性

可以設置Excel文檔屬性。


 
  1. $spreadsheet->getProperties()

  2. ->setCreator("Helloweba") //作者

  3. ->setLastModifiedBy("Yuegg") //最後修改者

  4. ->setTitle("Office 2007 XLSX Test Document") //標題

  5. ->setSubject("Office 2007 XLSX Test Document") //副標題

  6. ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") //描述

  7. ->setKeywords("office 2007 openxml php") //關鍵字

  8. ->setCategory("Test result file"); //分類

此外,除了提供豐富的Excel文件處理接口外,PhpSpreadshee還提供了CSV,PDF,HTML以及XML等文件處理接口。

導入:


 
  1. <?php

  2. require 'vendor/autoload.php';

  3.  
  4. $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('tmp.xlsx');

  5. $sheet = $spreadsheet->getActiveSheet();

  6. $data = $sheet->toArray();

  7.  
  8. var_dump($data);

 

導出:


 
  1. <?php

  2. require 'vendor/autoload.php';

  3.  
  4. $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();

  5. $sheet = $spreadsheet->getActiveSheet();

  6. $sheet->getDefaultColumnDimension()->setWidth(40);

  7. $sheet->getColumnDimensionByColumn(2)->setWidth(100);

  8.  
  9. $sheet->setCellValue('A2', 'Hello World !');

  10. for ($i = 1; $i < 10; $i++) {

  11. $sheet->setCellValueByColumnAndRow($i, 1, 'Col'.$i);

  12. }

  13.  
  14. $fileName = '01simple.xlsx';

  15.  
  16. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

  17. header('Content-Disposition: attachment;filename="'. $fileName .'"');

  18. header('Cache-Control: max-age=0');

  19.  
  20. header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past

  21. header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified

  22. header('Cache-Control: cache, must-revalidate'); // HTTP/1.1

  23. header('Pragma: public'); // HTTP/1.0

  24.  
  25. $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);

  26. $writer->save('php://output');

  27. exit;

轉載自博客地址:https://blog.csdn.net/VI7591/article/details/102129994

導出網絡圖片的方法;

拉取oss圖片,使用GD庫讀取圖片

$objDrawing = new MemoryDrawing();

    // 圖片生成

    $objDrawing->setImageResource($img);
    $objDrawing->setRenderingFunction(MemoryDrawing::RENDERING_DEFAULT);//渲染方法

    $objDrawing->setMimeType(MemoryDrawing::MIMETYPE_DEFAULT);


    //設置寬度高度
    $objDrawing->setHeight(60);//照片高度
    $objDrawing->setWidth(60); //照片寬度

    // /*設置圖片要插入的單元格*/
    $objDrawing->setCoordinates('B'.$k);

    // // 圖片偏移距離
    $objDrawing->setOffsetX(40);
    $objDrawing->setOffsetY(100);
    $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());

 

上述轉載出自出處;https://segmentfault.com/q/1010000018476399?utm_source=tag-newest

 

有條件地格式化單元格

可以基於特定規則有條件地格式化單元格。例如,如果一個單元格的值小於零,則可以將其設置爲紅色,如果其值爲零或更大,則可以將其設置爲綠色。

可以使用以下代碼爲單元格設置條件樣式規則集:

$conditional1 = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional1->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_CELLIS);
$conditional1->setOperatorType(\PhpOffice\PhpSpreadsheet\Style\Conditional::OPERATOR_LESSTHAN);
$conditional1->addCondition('0');
$conditional1->getStyle()->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);
$conditional1->getStyle()->getFont()->setBold(true);

$conditional2 = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
$conditional2->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_CELLIS);
$conditional2->setOperatorType(\PhpOffice\PhpSpreadsheet\Style\Conditional::OPERATOR_GREATERTHANOREQUAL);
$conditional2->addCondition('0');
$conditional2->getStyle()->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_GREEN);
$conditional2->getStyle()->getFont()->setBold(true);

$conditionalStyles = $spreadsheet->getActiveSheet()->getStyle('B2')->getConditionalStyles();
$conditionalStyles[] = $conditional1;
$conditionalStyles[] = $conditional2;

$spreadsheet->getActiveSheet()->getStyle('B2')->setConditionalStyles($conditionalStyles);

如果要將規則集複製到其他單元格,則可以複製樣式對象:

$spreadsheet->getActiveSheet()
    ->duplicateStyle(
        $spreadsheet->getActiveSheet()->getStyle('B2'),
        'B3:B7'
    );

在單元格中添加評論

要將註釋添加到單元格,請使用以下代碼。下面的示例向單元格E11添加註釋:

$spreadsheet->getActiveSheet()
    ->getComment('E11')
    ->setAuthor('Mark Baker');
$commentRichText = $spreadsheet->getActiveSheet()
    ->getComment('E11')
    ->getText()->createTextRun('PhpSpreadsheet:');
$commentRichText->getFont()->setBold(true);
$spreadsheet->getActiveSheet()
    ->getComment('E11')
    ->getText()->createTextRun("\r\n");
$spreadsheet->getActiveSheet()
    ->getComment('E11')
    ->getText()->createTextRun('Total amount on the current invoice, excluding VAT.')

將自動過濾器應用於一系列單元格

要將自動過濾器應用於一系列單元格,請使用以下代碼:

$spreadsheet->getActiveSheet()->setAutoFilter('A1:C9');

確保您始終包括完整的過濾器範圍!Excel確實僅支持設置標題行,但這不是最佳實踐。

在電子表格上設置安全性

Excel提供3個級別的“保護”:

  • 文檔:允許您在完整的電子表格上設置密碼,僅當輸入該密碼時纔可以進行更改。
  • 工作表:提供其他安全選項:您可以禁止在特定工作表上插入行,禁止排序,...
  • 單元格:提供用於鎖定/解鎖單元格以及顯示/隱藏內部公式的選項。

有關設置文檔安全性的示例:

$spreadsheet->getSecurity()->setLockWindows(true);
$spreadsheet->getSecurity()->setLockStructure(true);
$spreadsheet->getSecurity()->setWorkbookPassword("PhpSpreadsheet");

有關設置工作表安全性的示例:

$spreadsheet->getActiveSheet()
    ->getProtection()->setPassword('PhpSpreadsheet');
$spreadsheet->getActiveSheet()
    ->getProtection()->setSheet(true);
$spreadsheet->getActiveSheet()
    ->getProtection()->setSort(true);
$spreadsheet->getActiveSheet()
    ->getProtection()->setInsertRows(true);
$spreadsheet->getActiveSheet()
    ->getProtection()->setFormatCells(true);

有關設置單元安全性的示例:

$spreadsheet->getActiveSheet()->getStyle('B1')
    ->getProtection()
    ->setLocked(\PhpOffice\PhpSpreadsheet\Style\Protection::PROTECTION_UNPROTECTED);

如果需要任何工作表保護功能,請確保啓用工作表保護!可以使用以下代碼完成此操作:

$spreadsheet->getActiveSheet()->getProtection()->setSheet(true);

在單元上設置數據驗證

數據驗證是Xlsx的強大功能。它允許在可以插入特定單元格的數據上指定輸入過濾器。該過濾器可以是一個範圍(即值必須在0到10之間),列表(即值必須從列表中選取),...

以下代碼僅允許在單元格B3中輸入10到20之間的數字:

$validation = $spreadsheet->getActiveSheet()->getCell('B3')
    ->getDataValidation();
$validation->setType( \PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_WHOLE );
$validation->setErrorStyle( \PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_STOP );
$validation->setAllowBlank(true);
$validation->setShowInputMessage(true);
$validation->setShowErrorMessage(true);
$validation->setErrorTitle('Input error');
$validation->setError('Number is not allowed!');
$validation->setPromptTitle('Allowed input');
$validation->setPrompt('Only numbers between 10 and 20 are allowed.');
$validation->setFormula1(10);
$validation->setFormula2(20);

以下代碼僅允許從數據列表中選取的項輸入到單元格B5中:

$validation = $spreadsheet->getActiveSheet()->getCell('B5')
    ->getDataValidation();
$validation->setType( \PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST );
$validation->setErrorStyle( \PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_INFORMATION );
$validation->setAllowBlank(false);
$validation->setShowInputMessage(true);
$validation->setShowErrorMessage(true);
$validation->setShowDropDown(true);
$validation->setErrorTitle('Input error');
$validation->setError('Value is not in list.');
$validation->setPromptTitle('Pick from list');
$validation->setPrompt('Please pick a value from the drop-down list.');
$validation->setFormula1('"Item A,Item B,Item C"');

當使用上述數據驗證列表時,請確保將列表放在和之間""並用逗號(,)分隔項目。

重要的是要記住,參與Excel公式的任何字符串最多可以包含255個字符(而不是字節)。這對字符串“ Item A,Item B,Item C”中可以包含的項目設置了限制。因此,通常最好直接在某個單元格區域(例如A1:A3)中鍵入項目值,而改爲使用 $validation->setFormula1('Sheet!$A$1:$A$3')。另一個好處是,項目值本身可以包含逗號,字符本身。

如果您需要在多個單元格上進行數據驗證,則可以克隆規則集:

$spreadsheet->getActiveSheet()->getCell('B8')->setDataValidation(clone $validation);

 

經常需要使用的excel知識點:(圖片的導出與讀入)

將工程圖添加到工作表

工程圖始終表示爲單獨的對象,可以將其添加到工作表中。因此,您必須首先實例化new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing,然後爲其屬性分配一個有意義的值:

$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawing->setName('Logo');
$drawing->setDescription('Logo');
$drawing->setPath('./images/officelogo.jpg');
$drawing->setHeight(36);

要將上述圖形添加到工作表中,請使用以下代碼片段。PhpSpreadsheet在圖形和工作表之間創建鏈接:

$drawing->setWorksheet($spreadsheet->getActiveSheet());

您可以在工程圖上設置許多屬性,以下是一些示例:

$drawing->setName('Paid');
$drawing->setDescription('Paid');
$drawing->setPath('./images/paid.png');
$drawing->setCoordinates('B15');
$drawing->setOffsetX(110);
$drawing->setRotation(25);
$drawing->getShadow()->setVisible(true);
$drawing->getShadow()->setDirection(45);

您也可以添加使用GD功能創建的圖像,而無需先將它們作爲內存中圖形保存到磁盤。

//  Use GD to create an in-memory image
$gdImage = @imagecreatetruecolor(120, 20) or die('Cannot Initialize new GD image stream');
$textColor = imagecolorallocate($gdImage, 255, 255, 255);
imagestring($gdImage, 1, 5, 5,  'Created with PhpSpreadsheet', $textColor);

//  Add the In-Memory image to a worksheet
$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing();
$drawing->setName('In-Memory image 1');
$drawing->setDescription('In-Memory image 1');
$drawing->setCoordinates('A1');
$drawing->setImageResource($gdImage);
$drawing->setRenderingFunction(
    \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::RENDERING_JPEG
);
$drawing->setMimeType(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_DEFAULT);
$drawing->setHeight(36);
$drawing->setWorksheet($spreadsheet->getActiveSheet());

從工作表中讀取圖像

一個常見的問題是如何從已加載的工作簿中檢索圖像,並將其作爲單獨的圖像文件保存到磁盤。

以下代碼從當前活動的工作表中提取圖像,並將每個圖像寫爲一個單獨的文件。

$i = 0;
foreach ($spreadsheet->getActiveSheet()->getDrawingCollection() as $drawing) {
    if ($drawing instanceof \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing) {
        ob_start();
        call_user_func(
            $drawing->getRenderingFunction(),
            $drawing->getImageResource()
        );
        $imageContents = ob_get_contents();
        ob_end_clean();
        switch ($drawing->getMimeType()) {
            case \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_PNG :
                $extension = 'png';
                break;
            case \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_GIF:
                $extension = 'gif';
                break;
            case \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_JPEG :
                $extension = 'jpg';
                break;
        }
    } else {
        $zipReader = fopen($drawing->getPath(),'r');
        $imageContents = '';
        while (!feof($zipReader)) {
            $imageContents .= fread($zipReader,1024);
        }
        fclose($zipReader);
        $extension = $drawing->getExtension();
    }
    $myFileName = '00_Image_'.++$i.'.'.$extension;
    file_put_contents($myFileName,$imageContents);
}

向單元格添加富文本

可以使用\PhpOffice\PhpSpreadsheet\RichText\RichText實例將富文本添加到單元格 。這是一個示例,它創建以下富文本字符串:

除非發票上另有說明,否則該發票應在月底後的三十天內支付

$richText = new \PhpOffice\PhpSpreadsheet\RichText\RichText();
$richText->createText('This invoice is ');
$payable = $richText->createTextRun('payable within thirty days after the end of the month');
$payable->getFont()->setBold(true);
$payable->getFont()->setItalic(true);
$payable->getFont()->setColor( new \PhpOffice\PhpSpreadsheet\Style\Color( \PhpOffice\PhpSpreadsheet\Style\Color::COLOR_DARKGREEN ) );
$richText->createText(', unless specified otherwise on the invoice.');
$spreadsheet->getActiveSheet()->getCell('A18')->setValue($richText);

定義一個命名範圍

PhpSpreadsheet支持命名範圍的定義。可以使用以下代碼定義它們:

// Add some data
$spreadsheet->setActiveSheetIndex(0);
$spreadsheet->getActiveSheet()->setCellValue('A1', 'Firstname:');
$spreadsheet->getActiveSheet()->setCellValue('A2', 'Lastname:');
$spreadsheet->getActiveSheet()->setCellValue('B1', 'Maarten');
$spreadsheet->getActiveSheet()->setCellValue('B2', 'Balliauw');

// Define named ranges
$spreadsheet->addNamedRange( new \PhpOffice\PhpSpreadsheet\NamedRange('PersonFN', $spreadsheet->getActiveSheet(), 'B1') );
$spreadsheet->addNamedRange( new \PhpOffice\PhpSpreadsheet\NamedRange('PersonLN', $spreadsheet->getActiveSheet(), 'B2') );

可選地,可以傳遞第四個參數來定義本地命名範圍(即僅在當前工作表上可用)。默認情況下,命名範圍是全局的。

將輸出重定向到客戶端的Web瀏覽器

有時,人們確實希望將文件輸出到客戶的瀏覽器,尤其是在動態創建電子表格時。有一些簡單的步驟可以執行以下操作:

  1. 創建您的PhpSpreadsheet電子表格
  2. 輸出您要輸出的文檔類型的HTTP標頭
  3. 使用\PhpOffice\PhpSpreadsheet\Writer\*您選擇的,然後保存到'php://output'

\PhpOffice\PhpSpreadsheet\Writer\Xlsx寫入時使用臨時存儲php://output。默認情況下,臨時文件存儲在腳本的工作目錄中。如果沒有訪問權限,它將退回到操作系統的臨時文件位置。

未經授權觀看可能不安全!根據您操作系統的配置,任何人都可以使用同一臨時存儲文件夾讀取臨時存儲。當需要對文檔保密時,建議不要使用php://output

HTTP標頭

將Excel 2007文件重定向到客戶端瀏覽器的腳本示例:

/* Here there will be some code where you create $spreadsheet */

// redirect output to client browser
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="myfile.xlsx"');
header('Cache-Control: max-age=0');

$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');

將Xls文件重定向到客戶端瀏覽器的腳本示例:

/* Here there will be some code where you create $spreadsheet */

// redirect output to client browser
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="myfile.xls"');
header('Cache-Control: max-age=0');

$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('php://output');

將GD工程圖添加到工作表

在某些情況下,您可能想使用GD生成內存中映像並將其添加到中,Spreadsheet而無需先將此文件保存到臨時位置。

這是一個在內存中生成圖像並將其添加到活動工作表的示例:

// Generate an image
$gdImage = @imagecreatetruecolor(120, 20) or die('Cannot Initialize new GD image stream');
$textColor = imagecolorallocate($gdImage, 255, 255, 255);
imagestring($gdImage, 1, 5, 5,  'Created with PhpSpreadsheet', $textColor);

// Add a drawing to the worksheet
$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing();
$drawing->setName('Sample image');
$drawing->setDescription('Sample image');
$drawing->setImageResource($gdImage);
$drawing->setRenderingFunction(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::RENDERING_JPEG);
$drawing->setMimeType(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_DEFAULT);
$drawing->setHeight(36);
$drawing->setWorksheet($spreadsheet->getActiveSheet());

設置工作表縮放級別

要設置工作表的縮放級別,可以使用以下代碼:

$spreadsheet->getActiveSheet()->getSheetView()->setZoomScale(75);

請注意,縮放級別應在10-400的範圍內。

工作表標籤顏色

有時您想爲工作表標籤設置顏色。例如,您可以有一個紅色工作表標籤:

$worksheet->getTabColor()->setRGB('FF0000');

在工作簿中創建工作表

如果您需要在工作簿中創建更多工作表,請按照以下步驟操作:

$worksheet1 = $spreadsheet->createSheet();
$worksheet1->setTitle('Another sheet');

可以將其createSheet()視爲Excel中的“插入工作表”按鈕。當您單擊該按鈕時,新的工作表將添加到工作簿中現有的工作表集合中。

隱藏的工作表(Sheet狀態)

使用以下代碼將工作表設置爲隱藏

$spreadsheet->getActiveSheet()
    ->setSheetState(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::SHEETSTATE_HIDDEN);

有時,您甚至可能希望工作表“非常隱藏”。可用的工作表狀態爲:

  • \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::SHEETSTATE_VISIBLE
  • \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::SHEETSTATE_HIDDEN
  • \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::SHEETSTATE_VERYHIDDEN

在Excel中,只能以編程方式(例如,使用Visual Basic Macro)設置工作表狀態“非常隱藏”。不能通過用戶界面使此類工作表可見。

從右到左的工作表

可以分別設置工作表,無論列A應從左側還是右側開始。保留默認值。這是從右到左設置列的方法。

// right-to-left worksheet
$spreadsheet->getActiveSheet()->setRightToLeft(true);

上述轉載出自博客地址:https://www.cnblogs.com/zx-admin/p/11653863.html

 

導出一組圖片參考博客地址:PhpSpreadsheet 導出圖片到 Excel,https://learnku.com/articles/26965

導入包含圖片的excel表格詳細參考方法

導入包含圖片的excel表格詳細參考方法;參考博客地址:https://www.cnblogs.com/myIvan/p/11431248.html

use PhpOffice\PhpSpreadsheet\Reader\Xls;

獲取到文件地址

 

           $file = '/uploads/201908/13355zz.xls'’;
           if (!$file) {
               $this->error(__('Parameter %s can not be empty', 'file'));
           }
           $inputFileName = ROOT_PATH . DS . 'public' . DS . $file;
           if (!is_file($inputFileName)) {
               $this->error(__('No results were found'));
           }
           //實例化reader
           $ext = pathinfo($inputFileName, PATHINFO_EXTENSION);
           if (!in_array($ext, ['xls'])) {
               $this->error(__('Unknown data format'));
           }
           $reader = new Xls();
          
           // 讀取excel文件
           try {
               if (!$PHPExcel = $reader->load($inputFileName)) {
                   $this->error(__('Unknown data format'));
               }
               $sheet = $PHPExcel->getSheet(0);
           } catch(Exception $e) {
               die('加載文件發生錯誤:"'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());
           }   

 

從excel文件裏讀取數據,圖片單獨處理(進行上傳保存)

 

           $data=$sheet->toArray();//該方法讀取不到圖片 圖片需單獨處理
           
           /*************圖片單獨處理開始*****************/
           $imageFilePath=ROOT_PATH.'/public/uploads/images/' ;//圖片保存目錄
           if (!file_exists ( $imageFilePath )) {
               mkdir("$imageFilePath", 0777, true);
           }
           //處理圖片
           foreach($sheet->getDrawingCollection() as $img) {
               list($startColumn,$startRow)= PHPExcel_Cell::coordinateFromString($img->getCoordinates());//獲取圖片所在行和列
               $imageFileName = Random::uuid();//圖片名字隨機生成,如果你沒這個類,自己用其他隨機函數生成
               switch($img->getMimeType()) {
                   case 'image/jpg':
                   case 'image/jpeg':
                       $imageFileName.='.jpg';
                       imagejpeg($img->getImageResource(),$imageFilePath.$imageFileName);
                       break;
                   case 'image/gif':
                       $imageFileName.='.gif';
                       imagegif($img->getImageResource(),$imageFilePath.$imageFileName);
                       break;
                   case 'image/png':
                       $imageFileName.='.png';
                       imagepng($img->getImageResource(),$imageFilePath.$imageFileName);
                       break;
               }
               $startColumn = ABC2decimal($startColumn);//由於圖片所在位置的列號爲字母,轉化爲數字
               $data[$startRow-1][$startColumn]='/uploads/images/'.$imageFileName;//把圖片插入到數組中
           } 
           /*************圖片單獨處理結束*****************/

複製代碼

然後打印$data 就會發現 圖片那一欄的值都變成了 圖片所在的地址。後面就直接整理數據插入數據庫。

 

 

 

 

 

 

 

發佈了30 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章