Rumah >pembangunan bahagian belakang >tutorial php >Apakah yang perlu saya lakukan jika PHPSpreadsheet melaporkan ralat semasa mengeksport Excel dengan lebih daripada 26 lajur?

Apakah yang perlu saya lakukan jika PHPSpreadsheet melaporkan ralat semasa mengeksport Excel dengan lebih daripada 26 lajur?

WBOY
WBOYke hadapan
2022-01-13 14:31:365551semak imbas

Apakah yang perlu saya lakukan jika PHPSpreadsheet melaporkan ralat semasa mengeksport Excel dengan lebih daripada 26 lajur? Artikel berikut akan memperkenalkan kepada anda penyelesaian kepada PhpSpreadsheet mengeksport Excel dengan lebih daripada 26 lajur saya harap ia akan membantu semua orang.

Apakah yang perlu saya lakukan jika PHPSpreadsheet melaporkan ralat semasa mengeksport Excel dengan lebih daripada 26 lajur?

Apabila menggunakan PhpSpreadsheet untuk mengeksport fail excel, saya mendapati ralat telah dilaporkan Selepas menanyakan masalah, saya mendapati bilangan lajur melebihi 26. Mari kita ambil a tengok penyelesaiannya.

perwakilan baris dan lajur excel

  • peraturan perwakilan lajur xexcel adalah dari A, B, C sehingga ke Z, Apabila melebihi 26 huruf, ia diwakili oleh dua huruf: AA, AB, AC...AZ, BA, BB, BC...BZ..., apabila melebihi 702, ia diwakili oleh kaedah lain. Perwakilan baris

  • ialah 1, 2, 3, 4, 5, 6, 7.... dan seterusnya. Untuk menetapkan nilai sel dalam phpexcel, hanya gunakan kaedah setCellValue Parameter pertama mewakili nilai bersambung bagi lajur dan baris, seperti: A1, B1, AA1, BA1.

Selepas mengetahui perkara ini, cuma kira huruf yang mewakili lajur berdasarkan bahagian integer dan bahagian modular $i/26.

Berikut ialah penyelesaiannya

<?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];
    }
}

Jika anda berminat, anda boleh klik pada "Tutorial Video PHP" untuk mengetahui lebih lanjut tentang pengetahuan PHP.

Atas ialah kandungan terperinci Apakah yang perlu saya lakukan jika PHPSpreadsheet melaporkan ralat semasa mengeksport Excel dengan lebih daripada 26 lajur?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam