PHPSpreadsheet导出Excel列数超过26报错怎么办?
3338
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 的整数部分和模部分计算出列的表示字母就可以了。
下面是解决方法
- <?php
- namespace AppLibrariesExcel;
- use PhpOfficePhpSpreadsheetCellDataType;
- use PhpOfficePhpSpreadsheetSpreadsheet;
- use PhpOfficePhpSpreadsheetWriterXlsx;
- class Export
- {
- protected $data_type;
- protected $spread_sheet;
- protected $x_lsx;
- public function __construct(DataType$data_type, Spreadsheet$spread_sheet, Xlsx$x_lsx)
- {
- $this->data_type= $data_type;
- $this->spread_sheet= $spread_sheet;
- $this->x_lsx= $x_lsx;
- }
- /**
- * @ description 文件导出
- * @ date 2019-05-06
- * @ array $field_name 字段名称 汉字(索引数组) ['产品','姓名']
- * @ array $data 数据 ['a' => data, 'b' => data]
- * @ array $field_column 数据中的下标名称 字段数据 (索引数组) ['a','b']
- * @ string $file_name 文件名称
- * @ array $arr 需要转换为数字的$field_column中的key(索引数组)
- * @ return file
- */
- public function export($field_name,$data,$field_column,$file_name,$field_numeric_keys= [])
- {
- @ob_clean();
- if (empty($field_name)|| empty($field_column)|| empty($data)|| empty($file_name))return false;
- $sheet= $this->spread_sheet->getActiveSheet();
- //设置header
- $i= 0;
- foreach ($field_name as $value) {
- $cellName= self::stringFromColumnIndex($i). "1";
- $sheet->setCellValue($cellName, $value)->calculateColumnWidths();
- $sheet->getColumnDimension(self::stringFromColumnIndex($i))->setWidth(15);
- $i++;
- }
- //设置value
- $len= count($field_column);
- foreach ($data as $key=> $item) {
- $row= 2 + ($key* 1);
- for ($i= 0; $i< $len; $i++) {
- $sheet->setCellValueExplicit(self::stringFromColumnIndex($i). $row, $item[$field_column[$i]]??"", DataType::TYPE_STRING);
- if (isset($item[$field_column[$i]])&& !empty($field_numeric_keys)&& in_array($field_column[$i],$field_numeric_keys)) {
- $sheet->setCellValueExplicit(self::stringFromColumnIndex($i). $row, $item[$field_column[$i]]??"", DataType::TYPE_NUMERIC);
- }
- }
- }
- $writer= new Xlsx($this->spread_sheet);
- header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告诉浏览器输出07Excel文件
- header('Content-Disposition: attachment;filename="' . $file_name . '.xlsx"');//告诉浏览器输出浏览器名称
- header('Cache-Control: max-age=0');
- $writer->save('php://output');
- @ob_flush();
- @flush();
- exit;
- }
- /**
- * @ description excel导出突破只能26个字段
- * @ date 2019-05-07
- * @ return string 字段
- */
- public static function stringFromColumnIndex($pColumnIndex = 0)
- {
- static $_indexCache= array();
- if (!isset($_indexCache[$pColumnIndex])) {
- if ($pColumnIndex < 26) {
- $_indexCache[$pColumnIndex]= chr(65 + $pColumnIndex);
- }elseif ($pColumnIndex < 702) {
- $_indexCache[$pColumnIndex]= chr(64 + ($pColumnIndex / 26)). chr(65 + $pColumnIndex % 26);
- }else {
- $_indexCache[$pColumnIndex]= chr(64 + (($pColumnIndex - 26)/ 676)). chr(65 + ((($pColumnIndex - 26)% 676)/ 26)). chr(65 + $pColumnIndex % 26);
- }
- }
- return $_indexCache[$pColumnIndex];
- }
- }
本文网址:https://www.zztuku.com/index.php/detail-10751.html
站长图库 - PHPSpreadsheet导出Excel列数超过26报错怎么办?
申明:本文转载于《learnku》,如有侵犯,请 联系我们 删除。
您还没有登录,请 登录 后发表评论!
提示:请勿发布广告垃圾评论,否则封号处理!!