PHPSpreadsheet导出Excel列数超过26报错怎么办?

 3338

PHPSpreadsheet导出Excel列数超过26报错怎么办?下面本篇文章给大家介绍一下PhpSpreadsheet导出Excel超过26列解决办法,希望对大家有帮助。


PHPSpreadsheet导出Excel列数超过26报错怎么办?


使用PhpSpreadsheet导出excel文件的时候,发现报了一个错误,后来查询问题才发现是列数超过26列的问题,下面看看解决方法。


excel 行列表示方式

xexcel 的列的表示规则从 A,B,C 一直到 Z,当超过 26 个字母的时候用两个字母进行表示:AA,AB,AC…AZ,BA,BB,BC…BZ…,当超过 702 时又是另外一个种表示方法。

行的表示就是 1,2,3,4,5,6,7…. 这样下去。在 phpexcel 中要设一个单元格的值通过 setCellValue 方法就可以了,其中第一个参数表示列和行的拼接的值,如:A1,B1,AA1,BA1 这样。

知道这个之后,只要根据 $i/26 的整数部分和模部分计算出列的表示字母就可以了。

下面是解决方法

  1. <?php
  2. namespace AppLibrariesExcel;
  3. use PhpOfficePhpSpreadsheetCellDataType;
  4. use PhpOfficePhpSpreadsheetSpreadsheet;
  5. use PhpOfficePhpSpreadsheetWriterXlsx;
  6. class Export
  7. {
  8.     protected $data_type;
  9.     protected $spread_sheet;
  10.     protected $x_lsx;
  11.     public function __construct(DataType$data_type, Spreadsheet$spread_sheet, Xlsx$x_lsx)
  12.     {
  13.         $this->data_type= $data_type;
  14.         $this->spread_sheet= $spread_sheet;
  15.         $this->x_lsx= $x_lsx;
  16.     }
  17.     /**
  18.     * @ description 文件导出
  19.     * @ date 2019-05-06
  20.     * @ array $field_name 字段名称 汉字(索引数组) ['产品','姓名']
  21.     * @ array $data 数据 ['a' => data, 'b' => data]
  22.     * @ array $field_column 数据中的下标名称 字段数据 (索引数组) ['a','b']
  23.     * @ string $file_name 文件名称
  24.     * @ array $arr 需要转换为数字的$field_column中的key(索引数组)
  25.     * @ return  file
  26.     */
  27.     public function export($field_name,$data,$field_column,$file_name,$field_numeric_keys= [])
  28.     {
  29.         @ob_clean();
  30.         if (empty($field_name)|| empty($field_column)|| empty($data)|| empty($file_name))return false;
  31.         $sheet= $this->spread_sheet->getActiveSheet();
  32.         //设置header
  33.         $i= 0;
  34.         foreach ($field_name as $value) {
  35.             $cellName= self::stringFromColumnIndex($i). "1";
  36.             $sheet->setCellValue($cellName, $value)->calculateColumnWidths();
  37.             $sheet->getColumnDimension(self::stringFromColumnIndex($i))->setWidth(15);
  38.             $i++;
  39.         }
  40.         //设置value
  41.         $len= count($field_column);
  42.         foreach ($data as $key=> $item) {
  43.             $row= 2 + ($key* 1);
  44.             for ($i= 0; $i< $len; $i++) {
  45.                 $sheet->setCellValueExplicit(self::stringFromColumnIndex($i). $row, $item[$field_column[$i]]??"", DataType::TYPE_STRING);
  46.                 if (isset($item[$field_column[$i]])&& !empty($field_numeric_keys)&& in_array($field_column[$i],$field_numeric_keys)) {
  47.                 $sheet->setCellValueExplicit(self::stringFromColumnIndex($i). $row, $item[$field_column[$i]]??"", DataType::TYPE_NUMERIC);
  48.                 }
  49.             }
  50.         }
  51.         $writer= new Xlsx($this->spread_sheet);
  52.         header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告诉浏览器输出07Excel文件
  53.         header('Content-Disposition: attachment;filename="' . $file_name . '.xlsx"');//告诉浏览器输出浏览器名称
  54.         header('Cache-Control: max-age=0');
  55.         $writer->save('php://output');
  56.         @ob_flush();
  57.         @flush();
  58.         exit;
  59.     }
  60.     /**
  61.     * @ description excel导出突破只能26个字段
  62.     * @ date 2019-05-07
  63.     * @ return  string 字段
  64.     */
  65.     public static function stringFromColumnIndex($pColumnIndex = 0)
  66.     {
  67.         static $_indexCache= array();
  68.         if (!isset($_indexCache[$pColumnIndex])) {
  69.             if ($pColumnIndex < 26) {
  70.                 $_indexCache[$pColumnIndex]= chr(65 + $pColumnIndex);
  71.             }elseif ($pColumnIndex < 702) {
  72.                 $_indexCache[$pColumnIndex]= chr(64 + ($pColumnIndex / 26)). chr(65 + $pColumnIndex % 26);
  73.             }else {
  74.                 $_indexCache[$pColumnIndex]= chr(64 + (($pColumnIndex - 26)/ 676)). chr(65 + ((($pColumnIndex - 26)% 676)/ 26)). chr(65 + $pColumnIndex % 26);
  75.             }
  76.         }
  77.         return $_indexCache[$pColumnIndex];
  78.     }
  79. }


本文网址:https://www.zztuku.com/index.php/detail-10751.html
站长图库 - PHPSpreadsheet导出Excel列数超过26报错怎么办?
申明:本文转载于《learnku》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐

    美图秀秀图片批处理工具V1.2