详解PhpSpreadsheet设置单元格 导入导出
阅读原文时间:2021年04月15日阅读:1

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. $spreadsheet = new Spreadsheet();

  3. $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. $spreadsheet->getActiveSheet()->getStyle('D1')

  4. ->getNumberFormat()

  5. ->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. $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('tmp.xlsx');

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

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

  6. var_dump($data);

导出:

  1. <?php

  2. require 'vendor/autoload.php';

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

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

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

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

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

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

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

  10. }

  11. $fileName = '01simple.xlsx';

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

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

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

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

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

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

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

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

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

  21. 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 就会发现 图片那一栏的值都变成了 图片所在的地址。后面就直接整理数据插入数据库。