>  기사  >  백엔드 개발  >  26개 이상의 열이 포함된 Excel을 내보낼 때 PHPSpreadsheet에서 오류를 보고하면 어떻게 해야 합니까?

26개 이상의 열이 포함된 Excel을 내보낼 때 PHPSpreadsheet에서 오류를 보고하면 어떻게 해야 합니까?

WBOY
WBOY앞으로
2022-01-13 14:31:365519검색

PHSPreadsheet에서 Excel로 내보낸 열의 개수가 26개를 초과하여 오류가 발생하면 어떻게 해야 하나요? 다음 기사에서는 26개 이상의 열이 포함된 Excel을 내보내는 PhpSpreadsheet 솔루션을 소개합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다.

26개 이상의 열이 포함된 Excel을 내보낼 때 PHPSpreadsheet에서 오류를 보고하면 어떻게 해야 합니까?

PhpSpreadsheet를 사용하여 엑셀 파일을 내보냈을 때 오류가 보고되는 것을 발견했습니다. 문제를 문의한 결과 열 수가 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 字段名称 汉字(索引数组) [&#39;产品&#39;,&#39;姓名&#39;]
    * @ array $data 数据 [&#39;a&#39; => data, &#39;b&#39; => data]
    * @ array $field_column 数据中的下标名称 字段数据 (索引数组) [&#39;a&#39;,&#39;b&#39;]
    * @ 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(&#39;Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&#39;);//告诉浏览器输出07Excel文件
        header(&#39;Content-Disposition: attachment;filename="&#39; . $file_name . &#39;.xlsx"&#39;);//告诉浏览器输出浏览器名称
        header(&#39;Cache-Control: max-age=0&#39;);
        $writer->save(&#39;php://output&#39;);
        @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];
    }
}

관심이 있으시면 "PHP 비디오 튜토리얼"을 클릭하여 PHP 지식에 대해 자세히 알아볼 수 있습니다.

위 내용은 26개 이상의 열이 포함된 Excel을 내보낼 때 PHPSpreadsheet에서 오류를 보고하면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제