• phpoffice/phpspreadsheet读取excel表格中的图片并保存到本地


    我们开发导入excel表格功能时,会遇到表格中带有图片的情况,怎样获取到表格的图片并且把图片保存到本地,这样就可以展示你导入的数据和图片,实现此功能。
    这里介绍一下分别使用phpspreadsheet和PHPExcel扩展库来实现读取Excel内图片的功能:
    表格是这样的。
    开始使用
     

    composer require phpoffice/phpspreadsheet
    

    部分代码:

    1. use PhpOffice\PhpSpreadsheet\IOFactory;
    2. use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
    3. // 获取excel表格的图片
    4. public function readexcel1()
    5. {
    6. $imageFilePath = ROOT_PATH . 'public/uploads/imgs/'; //图片本地存储的路径
    7. if (!file_exists($imageFilePath)) { //如果目录不存在则递归创建
    8. mkdir($imageFilePath, 0777, true);
    9. }
    10. try {
    11. $file = ROOT_PATH . 'public/excel/2.xlsx';; //包含图片的Excel文件
    12. $objRead = IOFactory::createReader('Xlsx');
    13. $objSpreadsheet = $objRead->load($file);
    14. $objWorksheet = $objSpreadsheet->getSheet(0);
    15. $data = $objWorksheet->toArray();
    16. foreach ($objWorksheet->getDrawingCollection() as $drawing) {
    17. list($startColumn, $startRow) = Coordinate::coordinateFromString($drawing->getCoordinates());
    18. $imageFileName = $drawing->getCoordinates() . mt_rand(1000, 9999);
    19. switch ($drawing->getExtension()) {
    20. case 'jpg':
    21. case 'jpeg':
    22. $imageFileName .= '.jpg';
    23. $source = imagecreatefromjpeg($drawing->getPath());
    24. imagejpeg($source, $imageFilePath . $imageFileName);
    25. break;
    26. case 'gif':
    27. $imageFileName .= '.gif';
    28. $source = imagecreatefromgif($drawing->getPath());
    29. imagegif($source, $imageFilePath . $imageFileName);
    30. break;
    31. case 'png':
    32. $imageFileName .= '.png';
    33. $source = imagecreatefrompng($drawing->getPath());
    34. imagepng($source, $imageFilePath . $imageFileName);
    35. break;
    36. }
    37. $data[$startRow-1][$startColumn] = '/uploads/imgs/' . $imageFileName;
    38. }
    39. dump($data);die();
    40. } catch (\Exception $e) {
    41. throw $e;
    42. }
    43. }

    输出表格的数据:

    1. array(3) {
    2. [0] => array(3) {
    3. [0] => string(6) "编码"
    4. [1] => string(6) "名称"
    5. [2] => string(6) "图片"
    6. }
    7. [1] => array(4) {
    8. [0] => string(4) "B101"
    9. [1] => string(9) "票据夹"
    10. [2] => NULL
    11. ["C"] => string(25) "./uploads/imgs/C26829.png"
    12. }
    13. [2] => array(4) {
    14. [0] => string(4) "B102"
    15. [1] => string(6) "油笔"
    16. [2] => NULL
    17. ["C"] => string(25) "./uploads/imgs/C39403.png"
    18. }
    19. }

    图片在第三列也就是C列,但是这样的数据不方便保存到数据库。所以我们将图片数据重新保存在一个图片数组中,然后再和获取的表格数据合并下,最后得到的数组就可以直接拿来保存到数据库了。

    1. public function readexcel2()
    2. {
    3. $imageFilePath = ROOT_PATH . 'public/uploads/imgs/'; //图片本地存储的路径
    4. if (!file_exists($imageFilePath)) { //如果目录不存在则递归创建
    5. mkdir($imageFilePath, 0777, true);
    6. }
    7. try {
    8. $file = ROOT_PATH . 'public/excel/2.xlsx';; //包含图片的Excel文件
    9. $objRead = IOFactory::createReader('Xlsx');
    10. $objSpreadsheet = $objRead->load($file);
    11. $objWorksheet = $objSpreadsheet->getSheet(0);
    12. $data = $objWorksheet->toArray();
    13. $img_data = [];// 图片数组
    14. foreach ($objWorksheet->getDrawingCollection() as $drawing) {
    15. list($startColumn, $startRow) = Coordinate::coordinateFromString($drawing->getCoordinates());
    16. $imageFileName = $drawing->getCoordinates() . mt_rand(1000, 9999);
    17. switch ($drawing->getExtension()) {
    18. case 'jpg':
    19. case 'jpeg':
    20. $imageFileName .= '.jpg';
    21. $source = imagecreatefromjpeg($drawing->getPath());
    22. imagejpeg($source, $imageFilePath . $imageFileName);
    23. break;
    24. case 'gif':
    25. $imageFileName .= '.gif';
    26. $source = imagecreatefromgif($drawing->getPath());
    27. imagegif($source, $imageFilePath . $imageFileName);
    28. break;
    29. case 'png':
    30. $imageFileName .= '.png';
    31. $source = imagecreatefrompng($drawing->getPath());
    32. imagepng($source, $imageFilePath . $imageFileName);
    33. break;
    34. }
    35. $img_data[$startRow-1][$startColumn] = '/uploads/imgs/' . $imageFileName;
    36. }
    37. dump($img_data);
    38. // 合并表格数据
    39. if(!empty($img_data)){
    40. foreach ($img_data as $key => $value){
    41. //$data[$key][2] 是导入表格图片的哪一行
    42. $data[$key][2] = $value['C'];
    43. }
    44. }
    45. dump($data);
    46. } catch (\Exception $e) {
    47. throw $e;
    48. }
    49. }

    再看看最后输出的数据:

    1. // 图片数组
    2. array(2) {
    3. [1] => array(1) {
    4. ["C"] => string(24) "/uploads/imgs/C27788.png"
    5. }
    6. [2] => array(1) {
    7. ["C"] => string(24) "/uploads/imgs/C35897.png"
    8. }
    9. }
    10. // 合并的表格数据数组
    11. array(3) {
    12. [0] => array(3) {
    13. [0] => string(6) "编码"
    14. [1] => string(6) "名称"
    15. [2] => string(6) "图片"
    16. }
    17. [1] => array(3) {
    18. [0] => string(4) "B101"
    19. [1] => string(9) "票据夹"
    20. [2] => string(24) "/uploads/imgs/C27788.png"
    21. }
    22. [2] => array(3) {
    23. [0] => string(4) "B102"
    24. [1] => string(6) "油笔"
    25. [2] => string(24) "/uploads/imgs/C35897.png"
    26. }
    27. }

  • 相关阅读:
    场馆如何智能化升级?
    AI落地制造业:智能机器人应具备这4种能力
    Java手写栈和案例拓展
    将Abp默认事件总线改造为分布式事件总线
    Redis学习笔记13:基于spring data redis及lua脚本list列表实现环形结构案例
    硬件电路(3)设计篇----为什么栅极型推挽电路不用上P下N?
    基于Redis商品库存扣减方案
    FPGA-结合协议时序实现UART收发器(四):串口驱动模块uart_drive、例化uart_rx、uart_tx
    Android仿QQ个人界面,抽屉布局 NavigationView使用详解
    BST基本性质,LeetCode 235. 二叉搜索树的最近公共祖先
  • 原文地址:https://blog.csdn.net/qq_36264795/article/details/133693978