You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将客户端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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 17:24:04