开发者

php使用phpoffice/phpspreadsheet拓展操作excel实例

开发者 https://www.devze.com 2023-11-19 12:41 出处:网络 作者: huaweichenai
目录一:安装phpoffice/phpspreadsheet二:phpoffice/phpspreadsheet API接口详解1:设置字体:2:设置颜色3:设置列宽4:设置行高5 : 对齐6:合并单元格7:将合并后的单元格拆分8:使用applyFromArray实现单元格样式
目录
  • 一:安装phpoffice/phpspreadsheet
  • 二:phpoffice/phpspreadsheet API接口详解
    • 1:设置字体:
    • 2:设置颜色
    • 3:设置列宽
    • 4:设置行高
    • 5 : 对齐
    • 6:合并单元格
    • 7:将合并后的单元格拆分
    • 8:使用applyFromArray实现单元格样式设置
    • 9:设置工作表标题
    • 10:设置单元格的格式
    • 11 : 换行
    • 12:超链接
    • 13:使用函数
    • 14:设置文档属性
  • 三:简单实现生成excel(这里我下载使用的Yii框架自带的下载方法)
    • 四:读取excel文件

      一:安装phpoffice/phpspreadsheet

      composer require phpoffice/phpspreadsheet

      二:phpoffice/phpspreadsheet API接口详解

      PhpSpreadsheet提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到

      在使用phpoffice/phpspreadsheet的API接口前,确保引入了正确的文件并实例化

      use PhpOffice\PhpSpreadsheet\Spreadsheet;//引入文件
      $spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();//创建一个新的excel文档
      $sheet = $spreadsheet->getActiveSheet();//获取当前操作sheet的对象

      1:设置字体:

      $sheet->getStyle('A7:B7')->getFont()->setBold(true)->setName('Arial')
                  ->setSize(10);//将A7至B7两单元格设置为粗体字,Arial字体,10号字
      $sheet->getStyle('B1')->getFont()->setBold(true);//将B1单元格设置为粗体字

      2:设置颜色

      $sheet->getStyle('A1')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);//将A1单元格文字颜色设为红色

      3:设置列宽

      $sheet->getColumnDimension('A')->setWidth(20);//将A列的宽度设为20(字符)
      $sheet->getColumnDimension('B')->setAutoSize(true);//将B列的宽度设为自动宽度
      $sheet->getDefaultColumnDimension()->setWidth(12);//设置默认列宽为12

      4:设置行高

      $sheet->getRowDimension('10')->setRowHeight(100);//将第十行的高度设为100pt
      $sheet->getDefaultRowDimension()->setRowHeight(15);//设置默认行高为15

      5 : 对齐

      $sheet->getStyle('A:D')->getAlignment()
                  ->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER) //设置垂直居中
                  ->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER) //设置水平居中
                  ->setWrapText(true); //设置自动换行

      6:合并单元格

      $sheet->mergeCells('A1:D2');//A1到D2合并为一个单元格

      7:将合并后的单元格拆分

      $sheet->unmergeCells('A1:D2');//将合并后的单元格拆分。

      8:使用applyFromArray实现单元格样式设置

      //样式变量
      $style = [
      //设置字体样式
      'font' => [
              'name' => 'Arial',
              'bold' => true,
              'italic' => false,
              'underline' => Font::UNDERLINE_DOUBLE,
              'strikethrough' => false,
              'color' => [
                  'rgb' => '808080'
              ]
          ],
      //设置边框线样式
      'borders' => [
               //allBorders所有的边框线样式
               //左边框线
             'bottom' => [
                 'borderStyle' => Border::BORDER_DASHDOT,
                 'color' => [
                    'rgb' => '808080'
                  ]
             ],
               //上边框线
             'top' => [
                 'borderStyle' => Border::BORDER_DASHDOT,
                 'color' => [
                     'rgb' => '808080'
                 ]
             ]
      ],
      //对齐样式
      'alignment' => [
         'horizontal' => Alignment::HORIZONTAL_CENTER,
         'vertical' =>javascript; Alignment::VERTICAL_CENTER,
         'wrapText' => true,
      ],
      //是否使用前缀
      'quotePrefix'    => true
      ];
      $sheet->getStyle('A1:D1')->applyFromArray($style);

      9:设置工作表标题

      $sheet->setTitle('Hello');;//设置当前工作表标题。

      10:设置单元格的格式

      $sheet->getStyle('D2')->getNumberFormat()
        www.devze.com          ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);//将D2单元格的格式设为文本格式
      $sheet->getStyle('A1:D2')->getNumberFormat()
                  ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);//将A1到D2的单元格设置为文本格式

      11 : 换行

      $sheet->getCell('A4')->setValue("hello\nworld");//将A4单元格的hello和world换行

      12:超链接

      //将A2单元格内容设置blog并点击跳转https://www.wj0511.com
      $sheet->setCellValue('A2', 'blog');
      $sheet->getCell('A2')->getHyperlink()->setUrl('https://www.wj0511.com');

      13:使用函数

      常用函数有:总和(SUM),最大数(MAX),最小数(MIN),平均值(AVERAGE)

      $sheet->setCellValue('B5', '=SUM(B1:B4)');//将B5单元格的内容设为B1到B4的之和

      14:设置文档属性

      $spreadsheet->getProperties()
          ->setCreator("author")    //作者
          ->setLastModifiedBy("last-author") //最后修改者
          ->setTitle("title")  //标题
          ->setSubject("subject") //副标题
          ->setDescription("description")  //描述
          ->setKeywords("keywords") //关键字
          ->setCategory("category"); //分类

      三:简单实现生成excel(这里我下载使用的Yii框架自带的下载方法)

      <?php
      /**
       * author: wangjian
       * date: 2019/7/15
       */
      namespace app\controllers;
      use PhpOffice\PhpSpreadsheet\Spreadsheet;
      use PhpOffice\PhpSpreadsheet\Style\Alignment;
      use PhpOffice\PhpSpreadsheet\Style\Border;
      www.devze.comuse PhpOffice\PhpSpreadsheet\Writer\Xlsx;
      use Yii;
      use yii\web\Controller;
      class ExcelController extends Controller
      {
          /**
           * 数字转字母 (类似于Excel列标)
           * @param Int $index 索引值
           * @param Int $start 字母起始值
           * @return String 返回字母
           */
          public function intToChr($index, $start = 65)
          {
              $str = '';
              if (floor($index / 26) > 0) {
                  $str .= $this->intToChr(floor($index / 26)-1);
              }
              return $str . chr($index % 26 + $start);
          }
          public function actionIndex()
          {
              //头信息
              $header = [
                  '姓名',
                  '性别',
                  '学历',
                  '年龄',
                  '身高',
              ];
              //内容
              $data = [
                  [
                      '小明',
                      '男',
                      '专科',
                      '18',
                      '175'
                  ],
                  [
                      '小红',
                      '女',
                      '本科',
                      '18',
                      '155'
                  ],
                  [
                      '小蓝',
                      '男',
                      '专科',
                      '20',
                      '170'
                  ],
                  [
                      '张三',
                      '男',
                      '本科',
                      '19',
                      '165'
                  ],
                  [
                      '李四',
                      '男',
                      '专科',
                      '22',
                      '175'
                  ],
                  [
                      '王二',
                      '男',
                      '专科',
                      '25',
                      '175'
                  ],
                  [
                      '麻子',
                      '男',
                      '本科',
                      '22',
                      '180'
                  ],
              ];
              $header = array_values($header);
              $data = array_values($data);
              //获取列信息
              $column = []; //['A','B','C','D','E']
              foreach ($header as $k => $item) {
                  $column[$k] = $this->intToChr($k);
              }
              //获取初始列和最终列
              $firstColum = $column[0];
              $lastColum = $column[count($column) - 1];
              //获取初始行和最终行
              $firstRow = 1;
              $lastRow = count($data) + 1;
              $row = 1;
              $spreadsheet = new Spreadsheet();//创建一个新的eoWbEuxcel文档
              $sheet = $spreadsheet->getActiveSheet();//获取当前操作sheet的对象
              $sheet->setTitle('标题'); //设置标题
              $sheet->getStyle("{$firstColum}:{$lastColum}")->getAlignment()
                  ->setVertical(Alignment::VERTICAL_CENTER) //设置垂直居中
                  ->setHorizontal(Alignment::HORIZONTAL_CENTER) //设置水平居中
                  ->setWrapText(true); //设置自动换行
              //设置宽度
              $sheet->getDefaultColumnDimension()->setWidth(20);
              $headerStyle = [
                  'alignment' => [
                      'horizontal' => Alignment::HORIZONTAL_CENTER,
                  ],
                  'font' => [
                      'bold' => true,
                      'size' => 14,
                  ],
              ];
              $cellStyle = [
                  'alignment' => [
                      'horizontal' => Alignment::HORIZONTAL_CENTER,
                  ],
                  'borders' => [
                      'allBorders' => [
                          'borderStyle' => Border::BORDER_THIN,
                          'color' => ['argb' => 'FF000000'],
                      ]
                  ],
                  'font' => [
                      'size' => 10,
                  ],
              ];
              //将excel的单元格格式设为文本格式
              $sheet->getStyle("{$firstColum}{$firstRow}:{$lastColum}{$lastRow}")->getNumberFormat()
                  ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);
              //设置头信息样式
              $sheet->getRowDimension($row)->setRowHeight(30);//设置行高
              $sheet->getStyle("{$firstColum}{$row}:{$lastColum}{$row}")->applyFromArray($headerStyle);
              //设置头信息
              foreach ($header as $key => $item) {
                  $sheet->setCellValue("{$column[$key]}{$row}", $item);
              }
              $row++;
              foreach ($data as $key => $model) {
                  $sheet->getRowDimension($row)->setRowHeight(30);//设置行高
                  $sheet->getStyle("{$firstColum}{$row}:{$lastColum}{$row}")->applyFromArray($cellStyle);
                  $i = 0;
                  foreach ($model as $value) {
                      $sheet->setCellValue("{$column[$i]}{$row}", $value);
                      $i++;
                  }
                  $row++;
              }
              $file = '表格' . '.xlsx';//保存地址
              $writer = new Xlsx($spreadsheet);
              $writer->save($file);//生成excel文件
              Yii::$app->response->sendFile($file, '下载的excel名称.xlsx')->send();
          }
      }

      四:读取excel文件

      $title = [];//excel工作表标题
      $info = [];//excel内容
      $fileName = "表格.xlsx";
      $spreadsheet = IOFactory::load($fileName);
      //$worksheet = $spreadsheet->getActiveSheet();   //获取当前javascript文件内容
      $sheetAllCount = $spreadsheet->getSheetCount(); // 工作表总数
      for ($index = 0; $index < $sheetAllCount; $index++) {   //工作表标题
          $title[] = $spreadsheet->getSheet($index)->getTitle();
      }
      //读取第一個工作表
      $whatTable = 0;
      $sheet = $spreadsheet->getSheet($whatTable);
      $highest_row = $sheet->getHighestRow(); // 取得总行数
      $highest_column = $sheet->getHighestColumn(); ///取得列数  字母abc...
      $highestColumnIndex = Coordinate::columnIndexFromString($highest_column);  //转化为数字;
      for ($i = 1; $i <= $highestColumnIndex; $i++) {
          for ($j = 1; $j <= $highest_row; $j++) {
              $conent = $sheet->getCellByColumnAndRow($i, $j)->getCalculatedValue();
              $info[$j][$i] = $conent;
          }
      }
      var_dump($info);

      参考:https://phpspreadsheet.readth...

      以上就是php使用phpoffice/phpspreadsheet拓展操作excel实例的详细内容,更多关于phpoffice/phpspreadsheet操作excel的资料请关注编程客栈(www.devze.com)其它相关文章!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消