PhpSpreadsheet生成excel表格

Spreadsheet 在线文档 https://phpoffice.github.io/PhpSpreadsheet/
相关文档:https://www.cnblogs.com/zx-admin/p/11652187.html
听说PHPEXCEL已经不维护了,而且没有使用命名空间真的很蛋疼,

安装

composer require phpoffice/phpspreadsheet

用法

<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

function demo(): string
{
    $spreadsheet = new Spreadsheet();
    //获取活动工作薄
    $sheet = $spreadsheet->getActiveSheet();
    //获取单元格
    //方法1
    $cell = $sheet->getCell('A1');   
    //方法2
    $cell = $sheet->getCellByColumnAndRow(1,1); 
    //设置文本格式
    $sheet->getCell('A1')->setValueExplicit($val, DataType::TYPE_STRING);
    //生成文件并保存到指定路径
    $writer = new Xlsx($spreadsheet);
    $filename = '/tmp/demo.xlsx';
    $writer->save($filename);
    return $filename;
}

封装

data数组里有表头和数据,如果包含isHead这个元素,表示当前数组是表头

$data=[
    [
        'id'
        'name',
        'age',
        'sex'
    ],
    [
        '1'
        '张三',
        '18',
        '男'
    ],
    [
        '2'
        '李四',
        '19',
        '男'
    ],
];

$headerMap里定义表头的字段名和中文的键值对

$headerMap=[
    'name'=>'姓名',
    'age'=>'年龄,
    'sex'=>'性别',
];
<?php
/**
 *excel工具类
 */

namespace common\helper;


use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;

class SpreadsheetHelper
{
    public static function formatArray(Worksheet $sheet, $arr, $headerMap)
    {
        try {
            foreach ($arr as $y => $list) {
                if (!empty($list['isHeader'])) {
                    unset($list['isHeader']);
                    $isHeader = true;
                }
                $list = array_values($list);
                foreach ($list as $x => $v) {
                    $crd = self::getCrd($x, $y);
                    $val = !empty($isHeader) ? ($headerMap[$v] ?? $v) : $v;
                    $sheet->setCellValue($crd, $val);
                    if (is_numeric($val) && strlen($val) >= 11) {
                        $sheet->getCell($crd)->setValueExplicit($val, DataType::TYPE_STRING);
                    }
                }
                $isHeader = false;
            }
        } catch (\Exception $e) {
            \Yii::error([
                'errorTitle' => '生成表格失败',
                'errorMsg' => $e->getMessage(),
                'errorList' => $list ?? [],
                'errorTrace' => $e->getTraceAsString(),
            ]);
            throw  $e;
        }
    }

    /**
     * 获取X轴坐标 A~Z
     * @param int $index 下标
     * @return string
     */
    public static function getXCrd($index = 0)
    {
        $temp = '';
        $c = floor($index / 26);
        if ($c == 0 || $index == 25) {
            $temp .= chr($index + 65);
        } else {
            $y = $index % 26;
            $temp .= chr($c + 64) . chr($y + 65);
        }
        return $temp;
    }

    /**
     * 获取Y轴下标 1~∞
     * @param int $index
     * @return int|mixed
     */
    public static function getYCrd($index = 0)
    {
        return ++$index;
    }

    /**
     * 获取坐标 X1~X∞
     * @param $xIndex
     * @param $yIndex
     * @return string
     */
    public static function getCrd($xIndex, $yIndex)
    {
        return self::getXCrd($xIndex) . self::getYCrd($yIndex);
    }
}

使用封装好的工具类

function demo($data,$headerMap){
    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
    $data[0]['isHeader'] = true;
    SpreadsheetHelper::formatArray($sheet, $data, $headerMap);
    $writer = new Xlsx($spreadsheet);
    $filename = '/tmp/demo.xlsx';
    $writer->save($filename);
    return $filename;
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值