下面我将为你提供一个完整、详细的实现方案,包括前端表单提交、后端PHP处理、Excel生成和邮件发送四个核心步骤。

(图片来源网络,侵删)
整体思路
- 前端:创建一个表单,让用户填写必要信息(如邮箱地址),并提交到后端处理页面。
- 后端处理:
- 接收前端提交的数据。
- 使用PHP库(推荐
PhpSpreadsheet)来生成Excel文件。 - 将生成的Excel文件保存到服务器临时目录。
- 使用PHP的
mail()函数或更强大的PHPMailer库来发送邮件,并将Excel文件作为附件。 - 发送成功后,删除服务器上的临时Excel文件,避免占用空间。
- 织梦集成:将上述PHP代码整合到织梦的内核中,确保能正确调用织梦的函数和配置。
详细实现步骤
第一步:准备工作(引入PhpSpreadsheet库)
织梦默认不包含Excel操作库,所以我们需要手动引入一个。PhpSpreadsheet 是目前非常流行和强大的库。
-
下载库文件:
- 访问 PhpSpreadsheet 的 GitHub Releases 页面。
- 下载最新的
zip压缩包。
-
上传到织梦目录:
- 解压下载的
zip包。 - 将解压后的
vendor文件夹上传到你的织梦网站根目录下,你的网站目录结构会变成.../dede/、.../include/、.../vendor/。
- 解压下载的
-
准备邮件发送库(推荐使用PHPMailer)
(图片来源网络,侵删)- 同样,从 PHPMailer GitHub 下载最新版本。
- 将
PHPMailer.php,SMTP.php,Exception.php,OAuth.php等核心文件上传到你的网站任意目录,../phpmailer/。
第二步:创建前端表单(以用户提交为例)
在你的模板文件(index.htm)中,添加一个表单,这个表单可以用来收集用户希望接收Excel报告的邮箱地址。
<form action="/plus/send_excel.php" method="post">
<div>
<label for="user_email">您的邮箱地址:</label>
<input type="email" id="user_email" name="user_email" required placeholder="请输入您的邮箱">
</div>
<div>
<!-- 这里可以添加其他需要提交的字段 -->
<input type="hidden" name="typeid" value="1"> <!-- 示例:传递一个栏目ID -->
</div>
<button type="submit">提交并获取Excel报告</button>
</form>
注意:
action="/plus/send_excel.php":我们将在plus目录下创建一个专门的处理文件。name="user_email":这个name属性值非常重要,后端PHP将用它来获取数据。
第三步:创建后端处理文件(核心逻辑)
在织梦的 /plus/ 目录下,创建一个新文件,命名为 send_excel.php。
将以下代码完整复制到 send_excel.php 文件中,并根据你的实际情况进行修改。

(图片来源网络,侵删)
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
require_once '../vendor/autoload.php'; // 引入 PhpSpreadsheet
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
// 引入 PHPMailer
// 注意:请将下面的路径修改为你实际存放PHPMailer文件的路径
require_once '../phpmailer/PHPMailer.php';
require_once '../phpmailer/SMTP.php';
require_once '../phpmailer/Exception.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
/**
* 生成并发送Excel邮件
*/
function sendExcelByEmail($toEmail, $excelData, $filename)
{
// 1. 创建 Spreadsheet 对象
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 2. 写入数据 (这里根据你的实际数据结构调整)
// 设置表头
$sheet->setCellValue('A1', 'ID');
$sheet->setCellValue('B1', '标题');
$sheet->setCellValue('C1', '发布时间');
$sheet->setCellValue('D1', '点击量');
// 写入数据 (示例:从织梦的dede_archives表获取数据)
// $excelData 应该是一个二维数组,例如从数据库查询得到的结果
$row = 2;
foreach ($excelData as $data) {
$sheet->setCellValue('A' . $row, $data['id']);
$sheet->setCellValue('B' . $row, $data['title']);
$sheet->setCellValue('C' . $row, date('Y-m-d H:i:s', $data['pubdate']));
$sheet->setCellValue('D' . $row, $data['click']);
$row++;
}
// 3. 保存 Excel 文件到服务器临时目录
$writer = new Xlsx($spreadsheet);
$tempFilePath = dirname(__FILE__) . '/temp_' . $filename . '.xlsx'; // 建议使用临时目录
$writer->save($tempFilePath);
// 4. 使用 PHPMailer 发送邮件
$mail = new PHPMailer(true);
try {
// 服务器设置 - 请替换成你自己的SMTP配置
$mail->isSMTP(); // 使用 SMTP
$mail->Host = 'smtp.example.com'; // SMTP 服务器地址
$mail->SMTPAuth = true; // 启用 SMTP 认证
$mail->Username = 'your_email@example.com'; // SMTP 用户名 (你的邮箱)
$mail->Password = 'your_email_password'; // SMTP 密码 (注意:很多邮箱需要开启SMTP服务并使用授权码)
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // 启用 SSL/TLS 加密
$mail->Port = 465; // SMTP 端口
// 收件人
$mail->setFrom('your_email@example.com', '织梦网站'); // 发件人
$mail->addAddress($toEmail); // 收件人
// 附件
$mail->addAttachment($tempFilePath, $filename . '.xlsx'); // 添加附件
// 内容
$mail->isHTML(true); // 设置邮件格式为 HTML
$mail->Subject = '您请求的Excel报告';
$mail->Body = '您好,<br>您请求的Excel报告已生成,请查收附件。';
$mail->AltBody = '您好,您请求的Excel报告已生成,请查收附件。';
$mail->send();
echo '邮件发送成功!';
} catch (Exception $e) {
echo "邮件发送失败: {$mail->ErrorInfo}";
} finally {
// 5. 删除服务器上的临时文件
if (file_exists($tempFilePath)) {
unlink($tempFilePath);
}
}
}
// --- 主程序逻辑 ---
// 1. 获取前端提交的数据
$userEmail = isset($_POST['user_email']) ? trim($_POST['user_email']) : '';
$typeid = isset($_POST['typeid']) ? intval($_POST['typeid']) : 0;
if (empty($userEmail) || !filter_var($userEmail, FILTER_VALIDATE_EMAIL)) {
die('请输入有效的邮箱地址!');
}
// 2. 准备要写入Excel的数据 (这里以获取指定栏目下的文章为例)
$sql = "SELECT id, title, pubdate, click FROM `#@__archives` WHERE typeid = {$typeid} ORDER BY id DESC";
$dsql->SetQuery($sql);
$dsql->Execute();
$excelData = array();
while ($row = $dsql->GetArray()) {
$excelData[] = $row;
}
// 3. 调用发送函数
$reportFilename = '栏目_' . $typeid . '_文章列表_' . date('YmdHis');
sendExcelByEmail($userEmail, $excelData, $reportFilename);
?>
第四步:代码详解与注意事项
-
配置邮件信息:
- 在
sendExcelByEmail函数中,找到PHPMailer的配置部分,务必修改成你自己的邮箱SMTP信息。 Host: SMTP服务器地址,如smtp.qq.com,smtp.163.com。Username: 你的邮箱地址。Password: 不是你的邮箱登录密码,而是SMTP授权码,你需要在你的邮箱设置中开启SMTP服务并获取授权码。Port: SSL通常是465,TLS通常是587。
- 在
-
数据获取:
- 示例代码中,我们通过
$dsql->Execute()查询了#@__archives表来获取文章数据,你需要根据你的实际业务需求修改SQL查询,获取你想要导出到Excel的数据。
- 示例代码中,我们通过
-
Excel内容生成:
setCellValue('A1', 'ID')用于设置单元格内容,你可以自由调整表头和数据。
-
文件路径:
require_once '../vendor/autoload.php';和require_once '../phpmailer/...';的路径是相对于/plus/send_excel.php的,请确保你的目录结构正确。$tempFilePath = dirname(__FILE__) . '/temp_' . $filename . '.xlsx';,将临时文件生成在/plus/目录下,为了安全,最好在网站根目录外创建一个专门的临时目录。
-
安全性:
- 对用户输入的数据(如邮箱)进行验证,如
filter_var($userEmail, FILTER_VALIDATE_EMAIL)。 - 对SQL查询中的变量进行类型转换和过滤,如
intval($typeid),防止SQL注入。
- 对用户输入的数据(如邮箱)进行验证,如
通过以上四个步骤,你就可以在织梦CMS中实现一个完整的功能:用户在前端提交邮箱,后端自动生成包含特定数据的Excel文件,并将其作为邮件附件发送给用户。
这个方案具有很强的扩展性,你可以轻松地将它应用到:
- 后台管理:在后台某个操作(如“导出数据”)的点击事件中调用此逻辑。
- 会员中心:会员登录后可以导出自己的订单、文章等数据。
- 定时任务:结合织梦的计划任务,每天/每周自动生成并发送报表邮件。
