PhpSpreadsheet处理Excel

PHPOffice
是一个用来处理办公相关软件的php类库

PhpSpreadsheet
专门处理excle的类库
导出如下:

引入类库

composer require maatwebsite/excel
("maatwebsite/excel": "^3.1")

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

public static function excelWriter($fileName, $style = 1, $columnName = null, $data = null, $sheetIndex = 0, $cell = null)
    {
        $spreadsheet = new Spreadsheet();
        //默认为26列,如需要再自定义加
        if (!isset($cell)) {
            $cell = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
        }
        $sheet = $spreadsheet->getActiveSheet();

//设置excel的sheet,默认0
        $spreadsheet->setActiveSheetIndex($sheetIndex);

switch ($style) {
            case 1:
                //常规格式
                self::setExcelStyleOne($sheet, $columnName, $data, $cell);
                break;
            case 2:
                //特别格式
                self::setExcelStyleTwo($sheet, $cell);
                break;
        }

//下载输出excel页面
//        // Redirect output to a client’s web browser (Excel5)
//        header('Content-Type: application/vnd.ms-excel');
//        header('Content-Disposition: attachment;filename="' . $fileName . '"');
//        header('Cache-Control: max-age=0');
//        // If you're serving to IE 9, then the following may be needed
//        header('Cache-Control: max-age=1');
//
//        // If you're serving to IE over SSL, then the following may be needed
//        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
//        header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
//        header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
//        header('Pragma: public'); // HTTP/1.0

// 保存到本地服务器文件
        $filename = date('YmdHis') . '-' . $fileName . '-' . uniqid() . '.xlsx';
        $path = public_path() . '/download/excel/' . date('Ym') . '/';
        $objWriter = IOFactory::createWriter($spreadsheet, 'Xlsx');
//        File::makeDirectory($path);

File::makeDirectory($path, $mode = 0777, true, true);
        $objWriter->save($path . $filename);
        $res = array(
            'path' => $path,
            'filename' => $filename
        );
        return $res;
        //$objWriter->save('php://output');
    }

protected static function setExcelStyleOne($sheet, $columnName, $data, $cell)
    {
        //列表标题
        //$columnName = array('标题1','标题2');
        $count = count($columnName);
        //列表标题=>输入到excel第一行中
        foreach ($columnName as $k => $v) {
            $sheet->setCellValue($cell[$k] . '1', $v);
        }

//列表标题对应的数据=>输入到excel第二行以下
        foreach ($data as $key => $value) {
            $i = $key + 1;
            for ($j = 0; $j < $count; $j++) {
                $sheet->setCellValue($cell[$j] . ($i + 1), $value[$j]);
            }
        }

}

protected static function setExcelStyleTwo($sheet, $cell)
    {
        //样式设置 - 水平、垂直居中
        $styleArray = [
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
                'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER
            ],
        ];
        $sheet->getStyle('A1:H8')->applyFromArray($styleArray);

//样式设置 - 字体
        $sheet->getStyle('A10:A24')->getFont()->setBold(true)->setName('Arial')->setSize(10);
        $sheet->getStyle('A18:A24')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED); //设置单元格A1的字体颜色

//样式设置 - 边框
        $styleArray = [
            'borders' => [
                'outline' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                    'color' => ['argb' => '000000'],
                ],
                'inside' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                ]
            ],
        ];
        $sheet->getStyle('A1:F2')->applyFromArray($styleArray);

//设置宽度
        foreach ($cell as $k => $v) {
            $sheet->getColumnDimension($v)->setWidth(13);
        }
        $sheet->getColumnDimension('A')->setWidth(20);

//样式设置 - 合并和拆分
        $sheet->mergeCells('A1:A2'); //合并单元格
        //$sheet -> unmergeCells('C3:G3'); //拆分单元格
        $sheet->setCellValue('A1', '人员概况');

$column_arr = array('B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M');
        $sheet->setCellValue('A10', '人员对比(正式工+毕业生)');
        foreach ($column_arr as $key => $val) {
            $mon = $key + 1;
            $sheet->setCellValue($column_arr[$key] . '10', $mon . '月');
        }
        $sheet->setCellValue('N10', '合计');
        $sheet->setCellValue('O10', '平均');

$data_arr = array('B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O');
        $data_row_arr = array('11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24');
        $sheet->setCellValue('A11', '2019年人数(不含外包派遣)');
        foreach ($data_row_arr as $kkk => $vvv) {
            foreach ($data_arr as $kk => $vv) {
                $sheet->setCellValue($data_arr[$kk] . $vvv, 0);
            }
        }

}

导入如下:

use PhpOffice\PhpSpreadsheet\IOFactory;

public function upload(Request $request)
    {
        $file = $request->file('file');
        t_log($file);
        if ($file->isValid()) {
            // 获取文件相关信息
            $originalName = $file->getClientOriginalName(); // 文件原名
            $ext = $file->getClientOriginalExtension();     // 扩展名
            $realPath = $file->getRealPath();   //临时文件的绝对路径
            $type = $file->getClientMimeType();     // image/jpeg
            if (!in_array($ext, ['xls', 'xlsx', 'csv'])) {
                return error('文件类型错误!');
            }
            // 上传文件
            $filename = date('YmdHis') . '-' . uniqid() . '.' . $ext;
            // 使用我们新建的uploads本地存储空间(目录)
            //这里的uploads是配置文件的名称

//把临时文件移动到指定的位置,并重命名
            $path = public_path() . '/uploads/excel/' . date('Ym') . '/';

$bool = $file->move($path, $filename);

if ($bool) {
                $img_path = public_path() . '/uploads/excel/' . date('Ym') . '/' . $filename;
                $res = $this->_readExcel($img_path);
                if ($res === true) {
                    return success('上传存储成功');
                } else {
                    return success($res);
                }
            } else {
                return success('上传文件失败');
            }

}

return success('没有获取到文件');
    }

private function _readExcel($filePath = '')
    {
        $data = array();
        $end_row = null;

$objPHPExcelReader = IOFactory::load($filePath);
        $sheet = $objPHPExcelReader->getSheet(0);
        $highestRow = $sheet->getHighestRow(); // 取得最大行数
        $highestColumn = $sheet->getHighestColumn(); // 取得最大列数

$arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ', 'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK', 'BL', 'BM', 'BN', 'BO', 'BP', 'BQ', 'BR', 'BS', 'BT', 'BU', 'BV', 'BW', 'BX', 'BY', 'BZ', 'ZZ']; // 目标列标号

$start_row = 2;//从第二行开始
        $row_arr = [];

for ($column = 0; $arr[$column] != 'ZZ'; $column++) {
            $vale = $sheet->getCellByColumnAndRow($column, 1)->getValue();
            if (is_null($vale)) {
                continue;
            }
            $temp_keys[] = $vale;
        }
        $value_key = WorkersService::getReportField(WorkersService::MAIN, true);
        //当前操作人的组织id
        $org_id = $this->admin->org_id;
        for ($row = $start_row; $row <= $highestRow; $row++) { // 一次读取一列
            $row_arr_one = $row_arr_other = array();
            for ($column = 0; $arr[$column] != 'ZZ'; $column++) {
                $val = $sheet->getCellByColumnAndRow($column, $row)->getValue();
                if (is_null($val)) {
                    continue;
                }
                if (isset($value_key[$temp_keys[$column]])) {
                    $keys = $value_key[$temp_keys[$column]];
                    //$row_arr_one判断两个唯一字段是user_id,user_name否表中已存在的数据
                    if($keys=='user_id'){
                        $row_arr_one[$keys] = $val;
                    }
                    if($keys=='user_name'){
                        $row_arr_one[$keys] = $val;
                    }
                    $row_arr_one['org_id'] = $org_id;

if(in_array($keys,['entry_date','trial_end','first_time','quit_time'])){
                        $row_arr_other[$keys] =$this->changeTime($val);
                    }else{
                        //有则更新的数组
                        $row_arr_other[$keys]  = $val;
                    }
                    unset($row_arr_other['user_id']);
                    unset($row_arr_other['user_name']);
                }

}
            DB::connection('kg_report')->table('workers')->updateOrInsert($row_arr_one, $row_arr_other);

}

return true;
    }

PhpSpreadsheet处理Excel 导入、导出并设置样式相关推荐

  1. php Spreadsheet Csv,基于 PhpSpreadsheet 简单 Excel 导入导出

    GitHub 安装 composer require jianyan74/php-excel 引入 use jianyan\excel\Excel; Demo 目前只支持文字.函数.选择.日期转换 / ...

  2. Excel 导入导出、样式设计、Excel各种工具类整合,FileUtil、ExcelUtil

    2022-12-09 今天整理一下最近的excel导入导出经验,整理出了几个工具类,放心使用,可应付8成需求 excel导入导出现实需求可能很复杂,但基本都可以通过原生和easyexcel配合实现,开 ...

  3. easyexcel 设置标题_EasyExcel,让 excel 导入导出更加简单

    做积极的人,而不是积极废人! 来源:jianshu.com/p/8f3defdc76d4EasyExcelGitHub上的官方说明快速开始maven仓库地址导入导出总结 EasyExcel 在做exc ...

  4. easyexcel 在 设置标题_EasyExcel,让excel导入导出更加简单

    EasyExcel 在做excel导入导出的时候,发现项目中封装的工具类及其难用,于是去gitHub上找了一些相关的框架,最终选定了EasyExcel.之前早有听闻该框架,但是一直没有去了解,这次借此 ...

  5. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  6. 一款Excel导入导出解决方案组成的轻量级开源组件

    Excel-Boot GitHub地址:gitee.com/nw1992/easy- 码云地址:github.com/programmere- Excel-Boot是一款Excel导入导出解决方案组成 ...

  7. easypoi导入校验跳过空行_Easy-POI是一款Excel导入导出解决方案组成的轻量级开源组件...

    Excel-Boot是一款Excel导入导出解决方案组成的轻量级开源组件. 如果喜欢或愿意使用, 请star本项目或者点击donate图标捐赠我们 如果是企业使用, 为了产品推广, 请通过评论.Iss ...

  8. java Excel导入导出工具类 及使用demo

    java Excel导入导出工具类 及使用demo 前言:相信进来的都是想尽快解决问题的,话不多说,按照以下步骤来,可以操作导出excel到本地,导入同理,自行学习.步骤一:直接复制以下excel工具 ...

  9. SpringBoot中使用Easyexcel实现Excel导入导出功能(三)

    导出的数据包含有图片 导出excel表格的数据包含有图片,这种场景比较少.通Easyexcel实现这样的需求,我认为最简便的方法就是使用前面提到的自定义转换器(com.alibaba.excel.co ...

  10. 开发指南专题十五 JEECG微云快速开发平台EXCEL导入导出

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴!  开 ...

最新文章

  1. 【转】浅谈MS-SQL锁机制
  2. 【山西】2021年下半年软考报考时间及通知
  3. what to do next?
  4. PC SERVER 序列号查询
  5. android 自定义view控件,Android 自定义View——自定义View控件
  6. Navicat for MySQL中如何新建用户并赋予权限
  7. 基于 AVPlayer 自定义播放器
  8. 键盘上在方向键上面的9个键是干什么的?
  9. 强悍的 Python —— 读取大文件
  10. amqp activemq_Spring AMQP ActiveMQ教程(第1部分)
  11. java.util.stream.LongStream
  12. HDU 4403 A very hard Aoshu problem (DFS暴力)
  13. ps画画模糊笔刷_杨雪果ps笔刷|杨雪果CG绘画笔刷(Blur's good brush)下载v7.0 免费版 - 欧普软件下载...
  14. WordPress小程序源码 社区论坛小程序源码 知识付费商城小程序下载
  15. oracle+bmp转为txt,Bmp2Txt下载-图像转换成文字(Bmp2Txt )下载1.0-西西软件下载
  16. 疯狂的程序员 41-50
  17. 计算机专业师范类分析,师范生应具备的信息技术能力分析
  18. ECCV 2020 目标检测论文大盘点(49篇论文)
  19. 自己封装特定的Windows系统镜像
  20. VP9编码器客观及主观质量优化

热门文章

  1. LED装饰照明中应用到的LED炫彩灯
  2. NGINX负载均衡+监控
  3. flag兑现:这次聊一聊Deep AR 模型用于PHM2012工况1轴承数据集的RUL预测
  4. [Spark基础]--雾计算
  5. 牵手SAP,吼吼科技筑梦智能制造
  6. hive操作总结DML
  7. 微信小程序插值语法和数组变量检测踩过的坑
  8. 有时候觉得,电脑就像一个高贵冷艳的妹纸
  9. 【Proteus仿真】Arduino UNO+继电器控制照明设备
  10. ​McDSP APB Royal Mu母带压缩、Royal Q 母带均衡演示