PhpOffice\PhpSpreadsheet导出excel列表

基本使用调用

$keys = ['姓名', '年龄'];
$fields = ['name', 'age'];
$list = [
	['name' => 'clown', 'age' => 18],
	['name' => '小苏', 'age' => 25]
];
$result = (new ExportDataTool())->exportExecl($keys, $fields, $list, 'test');

ExportDataTool工具类

<?php

namespace app\common\tool;

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Style\Alignment;

include_once "./../vendor/autoload.php";
/**
 * 数据导出
 * Class Aes
 * @package app\common\tool
 */
class ExportDataTool
{

    /**
     * @var string 导出数据根目录
     */
    public $export_path = './export';

    /**
     * 导出excel列表
     * @param $keys array 对应列名称, 要和list里面的一一对应 举例: ['姓名', '年龄']
     * @param array $fields 对应字段值 要和$keys里面一致    举例: ['name', 'age']
     * @param $list array 列表数据 举例: [['name' => 'clown', 'age' => 18]]
     * @param $file_name string 文件名称
     * @param $title string sheet标题
     * @return bool|string
     */
    public function exportExecl($keys = [], $fields = [], $list = [], $file_name = '', $title = '')
    {
        if(empty($keys)) return false;
        if(empty($list)) return false;
        if(empty($fields)) return false;

        $columns = $this->getColumnArr($keys);

        $date = date('Y-m-d H:i:s');

        if(empty($file_name)){
            $file_name = $date . '.xlsx';
        }else{
            $file_name = $file_name . '-' . $date . '.xlsx';
        }

        //导出表格
        $objExcel = new Spreadsheet();
        $objWriter = IOFactory::createWriter($objExcel, 'Xlsx');
        $objActSheet = $objExcel->getActiveSheet(0);

        if(!empty($title)){
            $objActSheet->setTitle($title);//设置excel的标题
        }

        //写入列抬头
        foreach ($columns as $key => $column){
            $objActSheet->setCellValue($column . '1', $keys[$key]);
        }

        $i = 2;//因为从第二行开始

        foreach ($list as $k => $v){
            foreach ($fields as $kk => $vv){
                $objActSheet->setCellValueByColumnAndRow($kk + 1, $i, $v[$vv]);
            }
            ++$i;
        }

        $dir_name = $this->export_path . '/' . date('Ymd') . '/';

        $this->createDir($dir_name);

        $new_dir_name = str_replace('.', '', $dir_name);

        $objWriter->save($dir_name . $file_name);

        return '你的域名:' . $new_dir_name;
    }

    /**
     * 获取列数组
     * @param $keys 要获取列名的数组
     * @return void
     */
    public function getColumnArr($keys = [])
    {
        $length = count($keys);

        $column = [];

        for ($i = 0; $i < $length; $i++){
            $column[] = $this->getColumnName($i);
        }

        return $column;
    }

    /**
     * 获取生成列名
     * @param $keys 对应列名称
     * @return void
     */
    public function getColumnName($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];

    }

    /**
     * 创建文件夹
     * @param $dir_name 文件夹名称
     * @return void
     */
    public function createDir($dir_name = '')
    {
        if(!is_dir($this->export_path)){
            mkdir($this->export_path, 0777);
        }

        if(!is_dir($dir_name)){
            mkdir($dir_name, 0777);
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值