首页 > 解决方案 > 使用 phpSpreedSheet 加载图形

问题描述

我正在使用 PhpSpreedSheet 加载一个 excel,更新它并再次保存它......我发现的问题是它不能很好地保存图形,当你打开 excel 它告诉你典型的事情已经一个问题和“您希望我们尝试恢复尽可能多的内容吗?”并删除图形。

Excel 已完成文件级别的验证和修复。本书的某些部分可能已被修复或丢弃。部分已移除:文档的部分属性。(图纸形式) 部分删除:图纸形式。删除部分:图纸表格。

    $reader = IOFactory::createReader('Xlsx');
    $reader->setIncludeCharts(true);


    $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($this->spreadsheet);
    $writer->setIncludeCharts(true);

标签: phpphpspreadsheet

解决方案


要包含绘图,您应该使用以下内容:

$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawing->setName('Logo');
$drawing->setDescription('Logo');
$drawing->setPath('./images/officelogo.jpg');
$drawing->setCoordinates('B15');
$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);
}

推荐阅读