如何将客户端jQuery table2excel生成的xlsx文件通过PHP发送邮件
实现动态生成XLSX文件并作为邮件附件发送的方案
你可以通过前端收集所有表格数据传给后端,后端生成XLSX文件后发送邮件,具体实现步骤如下:
一、前端代码调整
不再直接触发table2excel下载,先收集动态生成的所有表格商品数据,通过AJAX传给后端,请求完成后可保留原下载逻辑:
$('.btn-primary-1').on('click', function(){ // 遍历表格收集所有商品数据,无数量限制 let goodsList = []; $('.tbody1 tr').each(function(){ goodsList.push({ tovar: $(this).find('.td_tovar').text(), value: $(this).find('td:eq(1)').text(), itog: $(this).find('.td_itog').text() }); }); // 提交数据到后端 $.ajax({ url: 'send_email.php', type: 'POST', data: {goods: goodsList}, dataType: 'json', success: function(res){ if(res.status == 'ok'){ alert('邮件发送成功'); // 保留原有下载逻辑,用户仍可本地保存文件 $("#table1").table2excel({ name:"Worksheet Name", filename:"fileName", fileext:".xlsx", preserveColors:true }); }else{ alert('邮件发送失败:'+res.msg); } } }); });
二、后端PHP实现
使用PhpSpreadsheet生成XLSX文件,使用PHPMailer发送带附件的邮件,先通过composer安装依赖:composer require phpoffice/phpspreadsheet phpmailer/phpmailer
新建send_email.php文件,代码如下:
<?php use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // 引入composer自动加载文件,路径根据你的项目结构调整 require 'vendor/autoload.php'; header('Content-Type: application/json'); // 接收前端传递的商品数据 $goodsList = isset($_POST['goods']) ? $_POST['goods'] : []; if(empty($goodsList)){ echo json_encode(['status'=>'fail', 'msg'=>'商品数据为空']); exit; } // 生成XLSX文件 $spreadsheet = new Spreadsheet(); $activeSheet = $spreadsheet->getActiveSheet(); // 设置表头 $activeSheet->setCellValue('A1', '商品名称'); $activeSheet->setCellValue('B1', '商品数量'); $activeSheet->setCellValue('C1', '商品总价'); // 循环写入所有商品数据 $currentRow = 2; foreach($goodsList as $item){ $activeSheet->setCellValue('A'.$currentRow, $item['tovar']); $activeSheet->setCellValue('B'.$currentRow, $item['value']); $activeSheet->setCellValue('C'.$currentRow, $item['itog']); $currentRow++; } // 保存临时XLSX文件 $xlsxFileName = '商品订单_'.time().'.xlsx'; $writer = new Xlsx($spreadsheet); $writer->save($xlsxFileName); // 发送带附件的邮件 $mail = new PHPMailer(true); try { // SMTP服务器配置,根据你使用的邮箱服务商调整 $mail->isSMTP(); $mail->Host = 'smtp.qq.com'; // 示例为QQ邮箱SMTP地址 $mail->SMTPAuth = true; $mail->Username = '你的发件人邮箱地址'; $mail->Password = '你的邮箱SMTP授权码'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; // 设置发件人、收件人 $mail->setFrom('发件人邮箱地址', '发件人显示名称'); $mail->addAddress('目标收件人邮箱地址'); // 添加XLSX附件 $mail->addAttachment($xlsxFileName); // 邮件内容配置 $mail->isHTML(true); $mail->Subject = '商品订单表格'; $mail->Body = '您好,附件为本次生成的商品订单表格,请查收。'; $mail->send(); // 发送成功后删除临时文件,避免占用服务器空间 unlink($xlsxFileName); echo json_encode(['status'=>'ok', 'msg'=>'发送成功']); } catch (Exception $e) { // 发送失败也删除临时文件 unlink($xlsxFileName); echo json_encode(['status'=>'fail', 'msg'=>"邮件发送失败:{$mail->ErrorInfo}"]); } ?>
三、注意事项
- 邮箱SMTP配置需和你使用的邮箱服务商对应,比如163邮箱SMTP地址为
smtp.163.com,授权码需在邮箱后台开启SMTP服务后获取 - 临时文件保存目录需要保证PHP有读写权限
- 可根据需求自行调整XLSX的样式、邮件标题、正文内容等
内容的提问来源于stack exchange,提问作者fe at.
相关产品推荐
相关产品推荐

