Maison  >  Article  >  développement back-end  >  Que dois-je faire si PHPSpreadsheet signale une erreur lors de l'exportation d'Excel avec plus de 26 colonnes ?

Que dois-je faire si PHPSpreadsheet signale une erreur lors de l'exportation d'Excel avec plus de 26 colonnes ?

WBOY
WBOYavant
2022-01-13 14:31:365508parcourir

Que dois-je faire si le nombre de colonnes exportées par PHPSpreadsheet vers Excel dépasse 26 et qu'une erreur se produit ? L'article suivant vous présentera la solution permettant à PhpSpreadsheet d'exporter Excel avec plus de 26 colonnes. J'espère qu'il sera utile à tout le monde.

Que dois-je faire si PHPSpreadsheet signale une erreur lors de l'exportation d'Excel avec plus de 26 colonnes ?

Lorsque j'ai utilisé PhpSpreadsheet pour exporter un fichier Excel, j'ai constaté qu'une erreur avait été signalée. Après avoir interrogé le problème, j'ai constaté que le nombre de colonnes dépassait 26. Jetons un coup d'œil à la solution.

représentation des colonnes Excel

  • Les règles de représentation des colonnes xexcel vont de A, B, C jusqu'à Z. Lorsque plus de 26 lettres sont utilisées, deux lettres sont utilisées : AA, AB, AC.. AZ, BA, BB, BC...BZ..., lorsqu'il dépasse 702, c'est un autre mode de représentation. La représentation des

  • lignes est 1, 2, 3, 4, 5, 6, 7... et ainsi de suite. Pour définir la valeur d'une cellule dans phpexcel, utilisez simplement la méthode setCellValue. Le premier paramètre représente la valeur épissée de la colonne et de la ligne, telle que : A1, B1, AA1, BA1.

Après avoir connu cela, calculez simplement la lettre représentant la colonne en fonction de la partie entière et de la partie modulo de $i/26.

Voici la solution

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

Si vous êtes intéressé, vous pouvez cliquer sur "Tutoriel vidéo PHP" pour en savoir plus sur les connaissances PHP.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer