PhpSpreadsheet 导出图片到 Excel

使用 Laravel Excel 3.1 版本来做导出图片到 Excel 的功能没有成功,后来作者回复了相关的写法 点击查看 因为回复的时候已经用 PhpSpreadsheet 实现了,所以没有再尝试 Laravel Excel 的写法

以下是 PhpSpreadsheet 导出部分的代码

    public function export($data)
    {
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        //设置sheet的名字  两种方法
        $sheet->setTitle('phpspreadsheet——demo');
        $spreadsheet->getActiveSheet()->setTitle('Hello');
        //设置第一行小标题
        $k = 1;
        $sheet->setCellValue('A' . $k, '问题');
        $sheet->setCellValue('B' . $k, '选项');
        $sheet->setCellValue('C' . $k, '答案');
        $sheet->setCellValue('D' . $k, '图片');

        // 设置个表格宽度
        $spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(16);
        $spreadsheet->getActiveSheet()->getColumnDimension('B')->setWidth(80);
        $spreadsheet->getActiveSheet()->getColumnDimension('C')->setWidth(15);
        $spreadsheet->getActiveSheet()->getColumnDimension('D')->setWidth(20);

        // 垂直居中
        $spreadsheet->getActiveSheet()->getStyle('A')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
        $spreadsheet->getActiveSheet()->getStyle('B')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
        $spreadsheet->getActiveSheet()->getStyle('C')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
        $spreadsheet->getActiveSheet()->getStyle('D')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);

        $info = $data;
        //  设置A单元格的宽度 同理设置每个
        $spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(20);
        //  设置第三行的高度
        $spreadsheet->getActiveSheet()->getRowDimension('3')->setRowHeight(50);
        //  A1水平居中
        $styleArray = [
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
            ],
        ];
        $sheet->getStyle('A1')->applyFromArray($styleArray);
        //  将A3到D4合并成一个单元格
        $spreadsheet->getActiveSheet()->mergeCells('A3:D4');
        //  拆分合并单元格
        $spreadsheet->getActiveSheet()->unmergeCells('A3:D4');
        //  将A2到D8表格边框 改变为红色
        $styleArray = [
            'borders' => [
                'outline' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                    'color' => ['argb' => 'FFFF0000'],
                ],
            ],
        ];
        //  $sheet->getStyle('A2:E8')->applyFromArray($styleArray);
        //  设置超链接
        //  $sheet->setCellValue('D6', 'www.baidu.com');
        //  $spreadsheet->getActiveSheet()->setCellValue('E6', 'www.baidu.com');
        //  循环赋值
        $k = 2;
        foreach ($info as $key => $value) {
            $sheet->setCellValue('A' . $k, $value['question']);
            $sheet->setCellValue('B' . $k, $value['question_options']);
            $sheet->setCellValue('C' . $k, $value['answer']);

            $img = self::curlGet($value['img']);
            $dir = public_path('/temp/image/');
            $file_info = pathinfo($value['img']);
            if (!empty($file_info['basename'])) { //过滤非文件类型
                $basename = $file_info['basename'];
                is_dir($dir) OR mkdir($dir, 0777, true); //进行检测文件是否存在
                file_put_contents($dir . $basename, $img);

                $drawing[$k] = new Drawing();
                $drawing[$k]->setName('Logo');
                $drawing[$k]->setDescription('Logo');
                $drawing[$k]->setPath($dir . $basename);
                $drawing[$k]->setWidth(80);
                $drawing[$k]->setHeight(80);
                $drawing[$k]->setCoordinates('D'.$k);
                $drawing[$k]->setOffsetX(12);
                $drawing[$k]->setOffsetY(12);
                $drawing[$k]->setWorksheet($spreadsheet->getActiveSheet());
            } else {
                $sheet->setCellValue('D' . $k, '');
            }
            $sheet->getRowDimension($k)->setRowHeight(80);
            $k++;
        }
        $file_name = date('Y-m-d', time()) . rand(1000, 9999);
        //  第一种保存方式
        /*$writer = new Xlsx($spreadsheet);
        //保存的路径可自行设置
        $file_name = '../'.$file_name . ".xlsx";
        $writer->save($file_name);*/
        //  第二种直接页面上显示下载
        $file_name = $file_name . ".xls";
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="' . $file_name . '"');
        header('Cache-Control: max-age=0');
        $writer = IOFactory::createWriter($spreadsheet, 'Xls');
        //  注意createWriter($spreadsheet, 'Xls') 第二个参数首字母必须大写
        $writer->save('php://output');
    }

    public function getClient(){
        $client = new Client();
        return $client;
    }

    public static function curlGet($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 这个是重点 请求https。
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
本作品采用《CC 协议》,转载必须注明作者和本文链接
www.haowuliaoa.com
本帖由系统于 3年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 16

@王某人的用户名 如果不是导出图片建议用 Laravel Excel 这个只是导出图片用的

4年前 评论
猪猪

这个导出图片的同时也导出其它数据吗?

4年前 评论
22 (楼主) 4年前
猪猪

我使用laravel-excel3.1导出图片我看了文档不过好像不太明白,做不出来导出图片,所以我想用你这种方法

4年前 评论
22 (楼主) 4年前
猪猪

好像不行,还是我的用法有问题,老哥可以加你的qq问问你吗

4年前 评论
22 (楼主) 4年前
猪猪

好的

4年前 评论
猪猪

老哥这个好像有点看不太懂

4年前 评论
22 (楼主) 4年前

Class 'App\Http\Controllers\Admin\Drawing' not found 怎么引入这个

4年前 评论
22 (楼主) 4年前
22 (楼主) 4年前
Gstar 6个月前

我看了下代码 如果我要导出这个图片,那么这个代码在运行的时候一定要把图片(或者图片在七牛云)下载到运行代码的服务器中才能生成这个带有图片的excel文件的吧。

1年前 评论

怎么导出的时候 导出嵌入式单元格图片

9个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!