• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 如何使用PhpSpreadsheet导入导出Excel

如何使用PhpSpreadsheet导入导出Excel

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了PhpSpreadsheet,导入导出Excel等相关知识,希望对您有所帮助

本篇文章给大家介绍一下使用PhpSpreadsheet导入导出Excel的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。


如何使用PhpSpreadsheet导入导出Excel


PHP对Excel导入&导出操作

最近公司要做报表功能,各种财务报表、工资报表、考勤报表等,复杂程度让人头大,于是特地封装适用各大场景的导入&导出操作,希望各界大神支出不足之处,以便小弟继续完善。


phpspreadsheet 引入

由于PHPExcel早就停止更新维护,所以适用phpspreadsheet。不知道如何通过composer拉取项目包的同学,可以查看Composer学习一文。引入方法:

composer require phpoffice/phpspreadsheet


引入命名空间

由于本人项目中需要居中、背景、单元格格式等各种操作,所以引入较多,大家使用的时候,可以根据自己实际需要引入。

use PhpOffice\PhpSpreadsheet\Reader\Xlsx;use PhpOffice\PhpSpreadsheet\Reader\Xls;use PhpOffice\PhpSpreadsheet\IOFactory;use PhpOffice\PhpSpreadsheet\Cell\Coordinate;use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;use PhpOffice\PhpSpreadsheet\Cell\DataType;use PhpOffice\PhpSpreadsheet\Style\Fill;use PhpOffice\PhpSpreadsheet\Style\Color;use PhpOffice\PhpSpreadsheet\Style\Alignment;use PhpOffice\PhpSpreadsheet\Style\Border;use PhpOffice\PhpSpreadsheet\Style\NumberFormat;


Excel导入操作(importExcel)

除了单纯的处理Excel数据外,还可以将Excel中的合并项、公式项、单元格格式提取,提取后可根据业务需求做对应处理后存储起来,以便后续的各种操作。

/** * 使用PHPEXECL导入 * * @param string $file      文件地址 * @param int    $sheet     工作表sheet(传0则获取第一个sheet) * @param int    $columnCnt 列数(传0则自动获取最大列) * @param array  $options   操作选项 *                          array mergeCells 合并单元格数组 *                          array formula    公式数组 *                          array format     单元格格式数组 * * @return array * @throws Exception */function importExecl(string $file = '', int $sheet = 0, int $columnCnt = 0, &$options = []){    try {        /* 转码 */        $file = iconv("utf-8", "gb2312", $file);         if (empty($file) OR !file_exists($file)) {            throw new \Exception('文件不存在!');        }         /** @var Xlsx $objRead */        $objRead = IOFactory::createReader('Xlsx');         if (!$objRead->canRead($file)) {            /** @var Xls $objRead */            $objRead = IOFactory::createReader('Xls');             if (!$objRead->canRead($file)) {                throw new \Exception('只支持导入Excel文件!');            }        }         /* 如果不需要获取特殊操作,则只读内容,可以大幅度提升读取Excel效率 */        empty($options) && $objRead->setReadDataOnly(true);        /* 建立excel对象 */        $obj = $objRead->load($file);        /* 获取指定的sheet表 */        $currSheet = $obj->getSheet($sheet);         if (isset($options['mergeCells'])) {            /* 读取合并行列 */            $options['mergeCells'] = $currSheet->getMergeCells();        }         if (0 == $columnCnt) {            /* 取得最大的列号 */            $columnH = $currSheet->getHighestColumn();            /* 兼容原逻辑,循环时使用的是小于等于 */            $columnCnt = Coordinate::columnIndexFromString($columnH);        }         /* 获取总行数 */        $rowCnt = $currSheet->getHighestRow();        $data   = [];         /* 读取内容 */        for ($_row = 1; $_row <= $rowCnt; $_row++) {            $isNull = true;             for ($_column = 1; $_column <= $columnCnt; $_column++) {                $cellName = Coordinate::stringFromColumnIndex($_column);                $cellId   = $cellName . $_row;                $cell     = $currSheet->getCell($cellId);                 if (isset($options['format'])) {                    /* 获取格式 */                    $format = $cell->getStyle()->getNumberFormat()->getFormatCode();                    /* 记录格式 */                    $options['format'][$_row][$cellName] = $format;                }                 if (isset($options['formula'])) {                    /* 获取公式,公式均为=号开头数据 */                    $formula = $currSheet->getCell($cellId)->getValue();                     if (0 === strpos($formula, '=')) {                        $options['formula'][$cellName . $_row] = $formula;                    }                }                 if (isset($format) && 'm/d/yyyy' == $format) {                    /* 日期格式翻转处理 */                    $cell->getStyle()->getNumberFormat()->setFormatCode('yyyy/mm/dd');                }                 $data[$_row][$cellName] = trim($currSheet->getCell($cellId)->getFormattedValue());                 if (!empty($data[$_row][$cellName])) {                    $isNull = false;                }            }             /* 判断是否整行数据为空,是的话删除该行数据 */            if ($isNull) {                unset($data[$_row]);            }        }         return $data;    } catch (\Exception $e) {        throw $e;    }}

将数据处理好后,可以通过额外配置,将导出的Excel做各种不同的配置,例如打印样式、锁定行、背景色、宽度等。


Excel导出操作(exportExcel)

/** * Excel导出,TODO 可继续优化 * * @param array  $datas      导出数据,格式['A1' => 'XXXX公司报表', 'B1' => '序号'] * @param string $fileName   导出文件名称 * @param array  $options    操作选项,例如: *                           bool   print       设置打印格式 *                           string freezePane  锁定行数,例如表头为第一行,则锁定表头输入A2 *                           array  setARGB     设置背景色,例如['A1', 'C1'] *                           array  setWidth    设置宽度,例如['A' => 30, 'C' => 20] *                           bool   setBorder   设置单元格边框 *                           array  mergeCells  设置合并单元格,例如['A1:J1' => 'A1:J1'] *                           array  formula     设置公式,例如['F2' => '=IF(D2>0,E42/D2,0)'] *                           array  format      设置格式,整列设置,例如['A' => 'General'] *                           array  alignCenter 设置居中样式,例如['A1', 'A2'] *                           array  bold        设置加粗样式,例如['A1', 'A2'] *                           string savePath    保存路径,设置后则文件保存到服务器,不通过浏览器下载 */function exportExcel(array $datas, string $fileName = '', array $options = []): bool{    try {        if (empty($datas)) {            return false;        }         set_time_limit(0);        /** @var Spreadsheet $objSpreadsheet */        $objSpreadsheet = app(Spreadsheet::class);        /* 设置默认文字居左,上下居中 */        $styleArray = [            'alignment' => [                'horizontal' => Alignment::HORIZONTAL_LEFT,                'vertical'   => Alignment::VERTICAL_CENTER,            ],        ];        $objSpreadsheet->getDefaultStyle()->applyFromArray($styleArray);        /* 设置Excel Sheet */        $activeSheet = $objSpreadsheet->setActiveSheetIndex(0);         /* 打印设置 */        if (isset($options['print']) && $options['print']) {            /* 设置打印为A4效果 */            $activeSheet->getPageSetup()->setPaperSize(PageSetup:: PAPERSIZE_A4);            /* 设置打印时边距 */            $pValue = 1 / 2.54;            $activeSheet->getPageMargins()->setTop($pValue / 2);            $activeSheet->getPageMargins()->setBottom($pValue * 2);            $activeSheet->getPageMargins()->setLeft($pValue / 2);            $activeSheet->getPageMargins()->setRight($pValue / 2);        }         /* 行数据处理 */        foreach ($datas as $sKey => $sItem) {            /* 默认文本格式 */            $pDataType = DataType::TYPE_STRING;             /* 设置单元格格式 */            if (isset($options['format']) && !empty($options['format'])) {                $colRow = Coordinate::coordinateFromString($sKey);                 /* 存在该列格式并且有特殊格式 */                if (isset($options['format'][$colRow[0]]) &&                    NumberFormat::FORMAT_GENERAL != $options['format'][$colRow[0]]) {                    $activeSheet->getStyle($sKey)->getNumberFormat()                        ->setFormatCode($options['format'][$colRow[0]]);                     if (false !== strpos($options['format'][$colRow[0]], '0.00') &&                        is_numeric(str_replace(['¥', ','], '', $sItem))) {                        /* 数字格式转换为数字单元格 */                        $pDataType = DataType::TYPE_NUMERIC;                        $sItem     = str_replace(['¥', ','], '', $sItem);                    }                } elseif (is_int($sItem)) {                    $pDataType = DataType::TYPE_NUMERIC;                }            }             $activeSheet->setCellValueExplicit($sKey, $sItem, $pDataType);             /* 存在:形式的合并行列,列入A1:B2,则对应合并 */            if (false !== strstr($sKey, ":")) {                $options['mergeCells'][$sKey] = $sKey;            }        }         unset($datas);         /* 设置锁定行 */        if (isset($options['freezePane']) && !empty($options['freezePane'])) {            $activeSheet->freezePane($options['freezePane']);            unset($options['freezePane']);        }         /* 设置宽度 */        if (isset($options['setWidth']) && !empty($options['setWidth'])) {            foreach ($options['setWidth'] as $swKey => $swItem) {                $activeSheet->getColumnDimension($swKey)->setWidth($swItem);            }             unset($options['setWidth']);        }         /* 设置背景色 */        if (isset($options['setARGB']) && !empty($options['setARGB'])) {            foreach ($options['setARGB'] as $sItem) {                $activeSheet->getStyle($sItem)                    ->getFill()->setFillType(Fill::FILL_SOLID)                    ->getStartColor()->setARGB(Color::COLOR_YELLOW);            }             unset($options['setARGB']);        }         /* 设置公式 */        if (isset($options['formula']) && !empty($options['formula'])) {            foreach ($options['formula'] as $fKey => $fItem) {                $activeSheet->setCellValue($fKey, $fItem);            }             unset($options['formula']);        }         /* 合并行列处理 */        if (isset($options['mergeCells']) && !empty($options['mergeCells'])) {            $activeSheet->setMergeCells($options['mergeCells']);            unset($options['mergeCells']);        }         /* 设置居中 */        if (isset($options['alignCenter']) && !empty($options['alignCenter'])) {            $styleArray = [                'alignment' => [                    'horizontal' => Alignment::HORIZONTAL_CENTER,                    'vertical'   => Alignment::VERTICAL_CENTER,                ],            ];             foreach ($options['alignCenter'] as $acItem) {                $activeSheet->getStyle($acItem)->applyFromArray($styleArray);            }             unset($options['alignCenter']);        }         /* 设置加粗 */        if (isset($options['bold']) && !empty($options['bold'])) {            foreach ($options['bold'] as $bItem) {                $activeSheet->getStyle($bItem)->getFont()->setBold(true);            }             unset($options['bold']);        }         /* 设置单元格边框,整个表格设置即可,必须在数据填充后才可以获取到最大行列 */        if (isset($options['setBorder']) && $options['setBorder']) {            $border    = [                'borders' => [                    'allBorders' => [                        'borderStyle' => Border::BORDER_THIN, // 设置border样式                        'color'       => ['argb' => 'FF000000'], // 设置border颜色                    ],                ],            ];            $setBorder = 'A1:' . $activeSheet->getHighestColumn() . $activeSheet->getHighestRow();            $activeSheet->getStyle($setBorder)->applyFromArray($border);            unset($options['setBorder']);        }         $fileName = !empty($fileName) ? $fileName : (date('YmdHis') . '.xlsx');         if (!isset($options['savePath'])) {            /* 直接导出Excel,无需保存到本地,输出07Excel文件 */            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');            header(                "Content-Disposition:attachment;filename=" . iconv(                    "utf-8", "GB2312//TRANSLIT", $fileName                )            );            header('Cache-Control: max-age=0');//禁止缓存            $savePath = 'php://output';        } else {            $savePath = $options['savePath'];        }         ob_clean();        ob_start();        $objWriter = IOFactory::createWriter($objSpreadsheet, 'Xlsx');        $objWriter->save($savePath);        /* 释放内存 */        $objSpreadsheet->disconnectWorksheets();        unset($objSpreadsheet);        ob_end_flush();         return true;    } catch (Exception $e) {        return false;    }}


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • PHPSpreadsheet导出Excel列数超过26报错怎么办?
  • 如何使用PhpSpreadsheet导入导出Excel

相关文章

  • 2022-04-29教你怎么使用Vue实现动画效果(附代码)
  • 2022-04-293个小时内网站被谷歌,搜搜,有道收录
  • 2022-04-29织梦DedeCMS系统列表页调用TAG标签并带上链接的实
  • 2022-04-29PS打造飘起来的房子‘飞屋环游记’合成教程
  • 2022-04-29全平台通用评论神器一键自动填写昵称、邮箱和网址
  • 2022-04-29PHP中如何利用define定义常量
  • 2022-04-29宝塔面板使用中常见的9个问题(附答案)
  • 2022-04-29WordPress主题文章作者评论区留言高亮显示
  • 2022-04-29ThinkPHP6.0 重写URL去掉Index.php的解决方法
  • 2022-04-29如何修改织梦cms的幻灯片调用为全站调用

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • PHPCMS系统mysql优化教程
    • Photoshop制作地裂火焰效果艺术字教程
    • 使用CorelDRAW绘制椭圆和圆形
    • 帝国CMS如何修改网址+标题+关键字+描叙方法
    • PHP7留言板开发之 Ajax异步提交
    • Dede网站布局搜索引擎优化优化技能汇总
    • 教你一招搞定mysql中的sql_mode设置
    • 浅谈Nodejs中的callback回调
    • DEDECMS robots文件SEO优化设置的具体方法
    • Photoshop制作金属质感的艺术字教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有