PhpSpreadsheet导出Excel超过26列解决办法

文章目录

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

  • 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;

    protectedspread_sheet;

    protected x_lsx;

    public function __construct(DataTypedata_type, Spreadsheetspread_sheet, Xlsxx_lsx)

    {

        this->data_type=data_type;

        this->spread_sheet=spread_sheet;

        this->x_lsx=x_lsx;

    }

    /**

    * @ description 文件导出

    * @ date 2019-05-06

    * @ array field_name 字段名称 汉字(索引数组) ['产品','姓名']

    * @ arraydata 数据 ['a' => data, 'b' => data]

    * @ array field_column 数据中的下标名称 字段数据 (索引数组) ['a','b']

    * @ stringfile_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();

        //设置headeri= 0;

        foreach (field_name asvalue) {

            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 askey=> 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];

    }

}

zhaohao

大家好,欢迎来到赵豪博客!赵豪,94年生人,PHP程序员一枚,因为对PHP开发有着相对比较浓厚的兴趣,所以现在从事着PHP程序员的工作。 今天再次开通这个博客,这里将记录我的职业生涯的点点滴滴,感谢来访与关注!如果我的博客能给您带来一些帮助那真是一件非常荣幸的事情~

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

PhpSpreadsheet导出Excel超过26列解决办法
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close