- 示例代码在模块市场中的数据导出管理, 看情况是否需要安装(可能会同时安装SpReadSheet, 但是因为已安装了, 所以不用在模块市场中按钮), 导出或测试按钮皆可, 使用测试的
- 按钮代码:
- 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);