新奇的 php做成excel文件方式

最近接手一个新项目。但是客户给过来的代码。excel做成出来的文件无论如何都不好用。经过一番调查。发现这个项目的excel做成方式很特别。特,记载一下,以防自己忘记

在介绍这个做成excel之前,首先得excel文件的组成
详情看下面的连接。我就不介绍了

https://blog.csdn.net/hejingyuan6/article/details/79044256

知道这个原理之后,我们就按照这个原理反向。就可以做成一个excel文件了

在这里插入图片描述
将,解压生成的几个文件copy到工程目录下

这里会用到 ZipStream-PHP

public function export(Request $request, ExcelStream $stream)
    {
        // $query = $this->getQuery($request)->with([
        //     // current=1を優先、qualificationidの昇順で最初の1件を取得
        //     'wgusers' => function ($q) { $q->orderBy('current', 'desc')->orderBy('qualificationid', 'asc'); }
        // ]);

        $query = $this->getQuery($request);
        /* ->with([
            // current=1を優先、qualificationidの昇順で最初の1件を取得
            'wgusers' => function ($q) { $q->orderBy('current', 'desc')->orderBy('qualificationid', 'asc'); }
        ]);*/

        set_time_limit(0);

        $headers = [
            'loginid' => 'ログインID',
            'lastname' => '姓',
            'firstname' => '名',
            'lastkana' => '姓フリガナ',
            'firstkana' => '名フリガナ',
            'sex' => '性別',
            'officename' => '所属',
            'title' => '職種',
            'zipcode' => '勤務先郵便番号',
            'pref' => '勤務先都道府県',
            'address1' => '勤務先住所',
            'address2' => 'ビル名等',
            'phone' => '緊急連絡先電話番号',
            'provider' => 'プロバイダー番号',
            'instructor' => 'インストラクター番号',
            'email' => 'メールアドレス',
            'active' => '学習者権限',
            'admin' => '事務局権限',
            'potential' => '現在の資格',
        ];

        return $stream->stream([
            'basename' => 'users',
            'sheetname' => 'ユーザー情報',
            'headers' => array_values($headers),
        ], function ($callback) use ($query) {
            $query->chunk(10, function ($chunk) use ($callback) {
                foreach ($chunk as $user) {
                    try {
                        $callback([
                            $user->loginid,
                            $user->lastname,
                            $user->firstname,
                            $user->lastkana,
                            $user->firstkana,
                            $user->gender,
                            $user->officename,
                            $user->title,
                            $user->zipcode,
                            \App\Prefs::getName($user->pref ?? 0),
                            $user->address1,
                            $user->address2,
                            $user->phone,
                            $user->provider,
                            $user->instructor,
                            $user->email,
                            $user->active ? '○' : '',
                            $user->isAdmin() ? '○' : '',
                            array_get(User::POTENTIALS, $user->potential ?? 0),
                        ]);
                    } catch (Exception $e) { Log::error($e); }
                }
            });
        });

    }
public function stream($param, $callback)
    {
        try {

            return response()->stream(function () use ($param, $callback) {
                $zip = app(ZipStream::class);

                // 不変のファイルを格納
                foreach (self::getFiles(resource_path('xlsx')) as $path => $file) {
                    $zip->addFileFromPath($path, $file);
                }
                // workbook.xmlをストリーム生成
                $zip->addFileFromCallback('xl/workbook.xml', function ($sender) use ($param) {
                    $workbook = simplexml_load_string(self::EXCEL_WORKBOOK);
                    $workbook->sheets->sheet['name'] = $param['sheetname'] ? $param['sheetname'] : 'Sheet1';
                    $sender($workbook->asXML());
                });

                // sheet1.xmlをストリーム生成
                $zip->addFileFromCallback('xl/worksheets/sheet1.xml', function ($sender) use ($param, $callback) {
                    $sender(self::EXCEL_SHEET_HEADER);

                    // ヘッダ行
                    $sender('<row r="1">');
                    foreach ($param['headers'] as $column => $value) {
                        $sender(self::getColumnXml(1, $column, $value));
                    }
                    $sender('</row>');

                    $index = 2;
                    $callback(function ($row) use ($sender, & $index) {
                        $sender("<row r=\"$index\">");
                        foreach ($row as $column => $value) {
                            $sender(self::getColumnXML($index, $column, $value));
                        }
                        $sender('</row>');
                        $index++;
                    });

                    $sender(self::EXCEL_SHEET_FOOTER);
                });

                $zip->finish();
            }, 200, [
                'Content-disposition' => 'attachment; filename="' . $param['basename'] . '.xlsx"',
                'Content-type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=UTF-8',
            ]);
        } catch (Exception $e) {
            return $this->errorResponse($e);
        }
    }

原理就是依次读取这几个文件。放到一个zip流中。最后,强行转成xlsx格式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值