搜索
鲸奇世界,弘创无限
与我们取得联系
请拨打电话或者扫描下方微信二维码联系我们。
24小时电话
188-2547-1709
微信 王经理
建站、SEO业务
微信 王经理
小程序、系统定制业务

鲸奇世界,弘创无限

PbootCMS表单提交后的数据导出功能:Excel/CSV格式导出

鲸弘科技
2026-04-30
0 次

本文由广东鲸弘科技有限公司提供惠州小程序开发 / 网站建设专业分享。

在PbootCMS站点运营中,留言表单、报名表单、联系表单等各类交互表单提交后,需将数据导出为Excel/CSV格式,用于数据统计、客户跟进、报表归档等场景。本文基于PbootCMS官方开发规范,实现表单数据的Excel/CSV导出功能,无需修改系统核心文件,兼容默认留言表单与自定义表单,支持全量导出、按条件筛选导出,代码经过实测可直接复用,适配PbootCMS V3.0及以上所有稳定版本。

核心逻辑:基于PbootCMS的MVC架构,创建后台自定义控制器读取表单数据表数据,通过PHP原生函数生成Excel/CSV格式文件,实现浏览器端下载;同时在后台表单管理页面添加导出入口,支持全量导出、按时间范围/状态筛选导出,兼顾易用性与灵活性,无需安装第三方插件,所有服务器环境均可兼容。

一、开发前期准备

1.1 环境要求

  • PbootCMS版本:V3.0及以上(推荐V3.2.11及最新稳定版,兼容官方表单数据结构);

  • PHP环境:PHP 7.0及以上,开启文件写入权限(用于生成临时导出文件);

  • 开发权限:拥有PbootCMS后台超级管理员权限、服务器文件修改权限(用于创建控制器、修改模板);

  • 开发工具:文本编辑器(如VS Code)、浏览器开发者工具(用于调试导出功能);

  • 基础认知:了解PbootCMS表单数据存储结构、后台控制器与模板的开发规范,无需复杂PHP开发基础,可直接复用本文代码。

1.2 核心逻辑拆解

功能实现分为4个核心步骤,全程遵循PbootCMS官方开发规范,不破坏系统原有运行逻辑:

  1. 确认表单数据结构:先明确表单数据存储的数据库表名、字段名,适配默认留言表单与自定义表单;

  2. 创建后台导出控制器:编写PHP代码,实现表单数据读取、Excel/CSV文件生成、浏览器下载逻辑;

  3. 配置后台导出入口:在后台表单管理页面添加导出按钮,或创建独立的导出管理页面,支持筛选条件配置;

  4. 功能测试与优化:验证导出功能的完整性,解决乱码、数据不全等问题,添加按时间、状态筛选等高级功能。

二、第一步:确认表单数据存储结构

导出功能的核心是正确读取表单数据,需先确认表单数据的存储表名、字段名,分为「默认留言表单」和「自定义表单」两种场景:

2.1 默认留言表单(系统自带)

PbootCMS默认留言表单的数据存储在 ay_guestbook 表中,核心字段如下,可直接通过phpMyAdmin等数据库管理工具查看表结构:

字段名

字段说明

数据类型

id

留言ID(主键)

int(11)

contacts

联系人姓名

varchar(50)

mobile

联系电话

varchar(20)

email

联系邮箱

varchar(100)

content

留言内容

text

create_time

提交时间

int(11)

status

审核状态(0=未审核,1=已审核)

tinyint(1)

2.2 自定义表单(二次开发的表单)

若为自定义开发的报名表单、联系表单,需先确认以下信息:

  1. 表单数据存储的数据库表名(如 ay_enrollay_contact);

  2. 表中的核心字段名(如姓名、电话、邮箱、报名时间、状态等);

  3. 字段的数据类型,确保导出时能正确读取。

本文代码以默认留言表 ay_guestbook 为例,自定义表单只需修改代码中的表名、字段名即可适配,无需修改核心逻辑。

三、第二步:创建后台导出控制器(核心功能)

基于PbootCMS后台开发规范,创建自定义导出控制器,实现表单数据读取、Excel/CSV文件生成、浏览器下载功能,无需修改系统核心控制器,不影响站点原有功能。

3.1 创建控制器文件

进入服务器,找到PbootCMS站点根目录,进入 /apps/admin/controller/ 目录(后台控制器目录),新建文件 FormExportController.php,文件编码设为UTF-8,避免中文乱码。

3.2 编写导出核心代码(完整可复用)

FormExportController.php 中编写代码,包含「CSV格式导出」和「Excel格式导出」两种方案,CSV格式兼容性最好,无需第三方插件,所有服务器均可支持;Excel格式支持更丰富的样式,可按需选择。

<?php
namespace appdmincontroller;
use appdmincontrollerBaseController;
use thinkDb;
// 表单数据导出控制器(适配PbootCMS后台)
class FormExportController extends BaseController
{
    // 初始化:验证管理员权限,防止越权访问
    public function __construct()
    {
        parent::__construct();
        // 验证是否为超级管理员,可根据需求调整权限
        if (!$this->isSuperAdmin()) {
            $this->error('无权限访问该功能');
        }
    }
    // 导出入口页面(可选,用于配置导出条件)
    public function index()
    {
        // 渲染导出页面模板
        return $this->render('form_export/index');
    }
    // 核心功能:CSV格式导出(推荐,兼容性最好)
    public function exportCsv()
    {
        // 1. 获取筛选条件(支持按时间、状态筛选)
        $startTime = request('get.start_time', '', 'trim');
        $endTime = request('get.end_time', '', 'trim');
        $status = request('get.status', '', 'int');
        // 2. 构建查询条件
        $where = [];
        // 按审核状态筛选
        if ($status !== '') {
            $where['status'] = $status;
        }
        // 按提交时间范围筛选
        if ($startTime && $endTime) {
            $startTimestamp = strtotime($startTime);
            $endTimestamp = strtotime($endTime) + 86399; // 结束时间到当天23:59:59
            $where['create_time'] = ['between', [$startTimestamp, $endTimestamp]];
        }
        // 3. 从数据库读取表单数据(默认留言表ay_guestbook,自定义表单修改表名和字段即可)
        $dataList = Db::name('ay_guestbook')
            ->where($where)
            ->order('create_time desc')
            ->select();
        // 4. 定义CSV表头(与数据库字段对应,可自定义导出字段)
        $csvHeader = [
            'ID',
            '联系人姓名',
            '联系电话',
            '联系邮箱',
            '留言内容',
            '提交时间',
            '审核状态'
        ];
        // 5. 处理数据,格式化时间、状态等字段
        $csvData = [];
        foreach ($dataList as $item) {
            $csvData[] = [
                $item['id'],
                $item['contacts'],
                $item['mobile'],
                $item['email'],
                $item['content'],
                date('Y-m-d H:i:s', $item['create_time']), // 时间戳转日期格式
                $item['status'] == 1 ? '已审核' : '未审核' // 状态格式化
            ];
        }
        // 6. 生成CSV文件,实现浏览器下载
        $filename = '留言表单数据_' . date('YmdHis') . '.csv'; // 文件名带时间戳,避免重复
        header('Content-Type: text/csv; charset=utf-8');
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        header('Cache-Control: max-age=0');
        // 打开PHP输出流,写入CSV数据
        $output = fopen('php://output', 'w');
        // 写入BOM头,解决Excel打开CSV中文乱码问题
        fwrite($output, chr(0xEF) . chr(0xBB) . chr(0xBF));
        // 写入表头
        fputcsv($output, $csvHeader);
        // 写入数据行
        foreach ($csvData as $row) {
            fputcsv($output, $row);
        }
        fclose($output);
        exit; // 终止程序,确保文件正常下载
    }
    // 扩展功能:Excel格式导出(支持样式,可选)
    public function exportExcel()
    {
        // 1. 获取筛选条件(与CSV导出一致)
        $startTime = request('get.start_time', '', 'trim');
        $endTime = request('get.end_time', '', 'trim');
        $status = request('get.status', '', 'int');
        // 2. 构建查询条件
        $where = [];
        if ($status !== '') {
            $where['status'] = $status;
        }
        if ($startTime && $endTime) {
            $startTimestamp = strtotime($startTime);
            $endTimestamp = strtotime($endTime) + 86399;
            $where['create_time'] = ['between', [$startTimestamp, $endTimestamp]];
        }
        // 3. 读取数据
        $dataList = Db::name('ay_guestbook')
            ->where($where)
            ->order('create_time desc')
            ->select();
        // 4. 定义Excel表头
        $excelHeader = [
            'ID',
            '联系人姓名',
            '联系电话',
            '联系邮箱',
            '留言内容',
            '提交时间',
            '审核状态'
        ];
        // 5. 处理数据
        $excelData = [];
        foreach ($dataList as $item) {
            $excelData[] = [
                $item['id'],
                $item['contacts'],
                $item['mobile'],
                $item['email'],
                $item['content'],
                date('Y-m-d H:i:s', $item['create_time']),
                $item['status'] == 1 ? '已审核' : '未审核'
            ];
        }
        // 6. 生成Excel文件(原生PHP生成xls格式,无需第三方插件)
        $filename = '留言表单数据_' . date('YmdHis') . '.xls';
        header('Content-Type: application/vnd.ms-excel; charset=utf-8');
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        header('Cache-Control: max-age=0');
        // 写入Excel内容
        echo '';
        // 写入表头
        echo '';
        foreach ($excelHeader as $header) {
            echo '' . $header . '';
        }
        echo '';
        // 写入数据行
        foreach ($excelData as $row) {
            echo '';
            foreach ($row as $cell) {
                echo '' . $cell . '';
            }
            echo '';
        }
        echo '';
        exit;
    }
    // 辅助方法:验证是否为超级管理员
    private function isSuperAdmin()
    {
        $adminId = session('admin_id');
        if (!$adminId) {
            return false;
        }
        // 超级管理员ID默认为1,可根据实际情况调整
        return $adminId == 1;
    }
}
?>

3.3 代码适配调整(关键)

若为自定义表单,需对代码进行以下简单调整,无需修改核心逻辑:

  1. 修改数据库表名:将代码中 Db::name('ay_guestbook') 改为自定义表单的表名(如 Db::name('ay_enroll'));

  2. 修改表头与字段对应关系:调整 $csvHeader$excelHeader 数组,与自定义表的字段一一对应;

  3. 修改数据处理逻辑:调整foreach循环中的字段名,与自定义表的字段名匹配,格式化时间、状态等字段;

  4. 调整权限验证:若需给非超级管理员开放导出权限,修改isSuperAdmin() 方法中的权限判断逻辑。

四、第三步:配置后台导出入口

控制器编写完成后,需在后台配置导出入口,提供两种方案:「在现有留言管理页面添加导出按钮」和「创建独立的导出管理页面」,可按需选择。

方案1:在现有留言管理页面添加导出按钮(推荐,最简)

PbootCMS默认留言管理页面路径为 /apps/admin/view/guestbook/index.html,修改该模板,在页面顶部添加导出按钮,直接调用导出接口,无需创建新页面。

<!-- 在留言管理页面顶部添加导出按钮(放在搜索框旁边) -->
<div class="layui-inline" style="margin-left: 10px;">
    <a href="{url('admin/formExport/exportCsv')}" class="layui-btn layui-btn-normal">
        <i class="layui-icon"></i> 导出CSV数据
    </a>
    <a href="{url('admin/formExport/exportExcel')}" class="layui-btn layui-btn-warm">
        <i class="layui-icon"></i> 导出Excel数据
    </a>
</div>
<!-- 可选:添加按时间、状态筛选的导出表单 -->
<div class="layui-form" style="margin: 10px 0;">
    <div class="layui-inline">
        <label class="layui-form-label">提交时间</label>
        <div class="layui-input-inline" style="width: 200px;">
            <input type="text" name="start_time" id="start_time" placeholder="开始时间" class="layui-input">
        </div>
        <div class="layui-form-mid">-</div>
        <div class="layui-input-inline" style="width: 200px;">
            <input type="text" name="end_time" id="end_time" placeholder="结束时间" class="layui-input">
        </div>
    </div>
    <div class="layui-inline">
        <label class="layui-form-label">审核状态</label>
        <div class="layui-input-inline">
            <select name="status" class="layui-select">
                <option value="">全部</option>
                <option value="0">未审核</option>
                <option value="1">已审核</option>
            </select>
        </div>
    </div>
    <div class="layui-inline">
        <button class="layui-btn layui-btn-primary" id="filter-export-btn">按条件导出</button>
    </div>
</div>
<!-- 筛选导出的JS逻辑(需引入layui日期组件) -->
<script>
layui.use(['laydate', 'jquery'], function() {
    var laydate = layui.laydate;
    var $ = layui.jquery;
    
    // 初始化日期选择器
    laydate.render({
        elem: '#start_time',
        type: 'date'
    });
    laydate.render({
        elem: '#end_time',
        type: 'date'
    });
    
    // 按条件导出按钮点击事件
    $('#filter-export-btn').click(function() {
        var startTime = $('#start_time').val();
        var endTime = $('#end_time').val();
        var status = $('select[name="status"]').val();
        
        // 拼接导出URL,传递筛选参数
        var exportUrl = "{url('admin/formExport/exportCsv')}?start_time=" + startTime + "&end_time=" + endTime + "&status=" + status;
        // 跳转下载
        window.location.href = exportUrl;
    });
});
</script>

方案2:创建独立的导出管理页面(适合多表单场景)

若站点有多个自定义表单,需统一管理导出功能,可创建独立的导出管理页面,步骤如下:

  1. 进入 /apps/admin/view/ 目录,新建 form_export 文件夹,在文件夹内新建 index.html 模板文件;

  2. 在模板文件中编写导出页面的HTML、JS代码,支持选择表单类型、设置筛选条件、触发导出;

  3. 在后台菜单中添加导出管理入口,路径为 admin/formExport/index,方便管理员访问。

五、功能测试与常见问题解决

5.1 功能测试流程(必做)

  1. 清除缓存:登录PbootCMS后台,点击【系统设置】→【清除缓存】,确保控制器、模板代码生效;

  2. 权限测试:使用超级管理员账号登录后台,访问导出页面,确认无权限报错;

  3. 全量导出测试:点击「导出CSV数据」「导出Excel数据」按钮,确认文件正常下载,打开后数据完整、无乱码;

  4. 条件导出测试:设置时间范围、审核状态,点击「按条件导出」,确认导出的数据符合筛选条件;

  5. 数据验证:对比导出的文件与数据库中的数据,确认字段对应正确、数据无遗漏。

5.2 常见问题及解决方案

问题1:导出的CSV/Excel文件中文乱码

原因:未设置正确的字符编码,或Excel打开CSV时未识别UTF-8编码。

解决方案:        CSV导出:确保代码中写入了BOM头(fwrite($output, chr(0xEF) . chr(0xBB) . chr(0xBF));),Excel打开时会自动识别UTF-8编码;Excel导出:确保HTML的meta标签设置了 charset=utf-8;服务器配置:确认PHP文件编码为UTF-8无BOM格式,避免编码冲突。

问题2:点击导出按钮,无文件下载,页面空白

原因:代码中有语法错误,或PHP输出了额外内容,导致文件下载失败。

解决方案:        检查控制器代码语法,确保括号、分号完整,无语法错误;确保导出代码最后有 exit; 语句,终止程序输出,避免额外内容污染文件;查看服务器PHP错误日志,定位报错信息,修复对应问题。

问题3:导出的文件数据不全,或字段对应错误

原因:数据库表名、字段名与代码中不匹配,或查询条件错误。

解决方案:        核对代码中的表名、字段名,与数据库表结构完全一致,区分大小写;检查查询条件,确保where语句正确,无过滤掉有效数据的情况;核对表头与数据行的字段对应关系,确保顺序一致。

问题4:非超级管理员无法访问导出功能

原因:代码中权限验证仅允许超级管理员(ID=1)访问。

解决方案:修改 isSuperAdmin() 方法,调整权限判断逻辑,例如:        // 调整权限验证,允许管理员组ID为2的用户访问private function isSuperAdmin(){    $adminId = session('admin_id');    $groupId = session('admin_group_id');    if (!$adminId) {        return false;    }    // 超级管理员ID=1,或管理员组ID=2    return $adminId == 1 || $groupId == 2;}

六、功能扩展与优化

基于基础导出功能,可根据站点需求进行以下扩展,提升功能实用性:

  • 多表单统一管理:在控制器中添加多个表单的导出方法,支持留言、报名、联系等多个表单的导出,统一管理;

  • 自定义导出字段:在导出页面添加字段选择功能,让管理员可自主选择需要导出的字段,无需修改代码;

  • 导出文件命名优化:支持自定义导出文件名,添加站点名称、表单类型等信息,便于归档;

  • 数据统计功能:在导出页面添加表单数据统计,如总提交量、今日提交量、已审核/未审核数量等;

  • 批量处理功能:结合导出功能,添加批量审核、批量删除表单数据的功能,提升后台管理效率。

七、总结

本文基于PbootCMS官方开发规范,实现了表单数据的Excel/CSV导出功能,无需修改系统核心文件,代码可直接复用,适配默认留言表单与自定义表单,兼顾易用性与灵活性。核心优势在于:利用PHP原生函数实现导出,无需安装第三方插件,所有服务器环境均可兼容;支持全量导出与按条件筛选导出,满足不同的数据统计需求;全程遵循PbootCMS开发规范,不破坏系统原有运行逻辑,新手也可快速上手。

开发过程中,需重点关注3点:一是确保表名、字段名与数据库结构完全匹配,避免数据导出错误;二是设置正确的字符编码,解决中文乱码问题;三是做好权限验证,防止越权访问导出功能。按照本文步骤操作,即可快速实现表单数据导出功能,满足站点运营中的数据统计、客户跟进、报表归档等需求。同时,建议开发前备份站点文件和数据库,避免操作失误导致数据丢失。

AI 智能助理
您好!有什么可以帮助您的吗?
  • 稳定
    多年经验,服务稳定
  • 贴心
    全国7*24小时客服热线
  • 专业
    产品经理在线技术支持
  • 快速
    快速评估,快速执行
  • 承诺
    有目共睹,我们选声誉
复制成功

微信号:kaxiO_o

添加微信好友,免费获取方案及报价

我知道了
联系
扫码添加技术微信
1V1在线技术支持
联系电话
188-2547-1709建站、seo业务
电话若占线或未接到、就加下微信
联系邮箱
frank@vi23.com企业邮箱