[BD]Excel导出分析

112 阅读1分钟
  1. 示例代码在模块市场中的数据导出管理, 看情况是否需要安装(可能会同时安装SpReadSheet, 但是因为已安装了, 所以不用在模块市场中按钮), 导出或测试按钮皆可, 使用测试的

image.png

  1. 按钮代码:

image.png

  1. api封装, 返回URL web\src\api\backend\routine\dataexport.ts
export function buildDownloadUrl(id: number) {
    const adminInfo = useAdminInfo()
    return getUrl() + controllerUrl + 'task/subId/0/download/true/id/' + id + '?batoken=' + adminInfo.getToken() + '&server=1'
}

二.后端代码

分析可得这是传统的导出方式, 使用了SpReadSheet, 然后通过windows.location.href直接访问下载

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Cell\DataType;

 public function task(int $id, int $subId, bool $download)
 {
        if (!$this->auth->check('routine/dataexport/start')) {
            $this->error(__('You have no permission'), ['routePath' => '/admin'], 302);
        }
        $row    = $this->model->find($id);
        $export = new ExportLib($id);   

        // 省略N行代码 **********************

        // xls文件处理
        if ($download) {
            // 直接下载
            ob_end_clean();
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
            header("Content-Type:application/force-download");
            header("Content-Type:application/vnd.ms-execl");
            header("Content-Type:application/octet-stream");
            header("Content-Type:application/download");

            $taskName        = $id . '.' . $taskName . '.xlsx';
            $encodedFilename = urlencode($taskName);
            $ua              = $_SERVER["HTTP_USER_AGENT"];
            if (preg_match("/MSIE/", $ua)) {
                header('Content-Disposition: attachment; filename="' . $encodedFilename . '"');
            } else if (preg_match("/Firefox/", $ua)) {
                header('Content-Disposition: attachment; filename*="utf8\'\'' . $taskName . '"');
            } else {
                header('Content-Disposition: attachment; filename="' . $taskName . '"');
            }
            header("Content-Transfer-Encoding:binary");
            header('Cache-Control: max-age=0');

            $writer = new Xlsx($spreadsheet);
            $writer->save('php://output');
            $spreadsheet->disconnectWorksheets();
            unset($spreadsheet);
        } else {
           
        }
}

可以看出使用了spreadsheet

    $writer = new Xlsx($spreadsheet);
    $writer->save('php://output');
    $spreadsheet->disconnectWorksheets();
    unset($spreadsheet);