ThinkPHP项目数据导入导出格式

wen PHP项目 3

本文目录导读:

ThinkPHP项目数据导入导出格式

  1. CSV 格式(最推荐)
  2. Excel 格式(XLSX / XLS)
  3. JSON 格式
  4. SQL 格式(数据备份/迁移)
  5. 总结建议

ThinkPHP 项目中数据导入导出常见的格式主要有 CSVExcel (XLSX)JSON 以及 SQL 等。CSVExcel (XLSX) 是大部分业务系统(特别是后台管理)中最常用、最核心的格式。

以下分别介绍这几种格式的适用场景、优缺点以及基于 ThinkPHP 的实现方案。


CSV 格式(最推荐)

适用场景:数据量大(几十万条以上)、对格式要求不高(不需要复杂的样式、合并单元格)、需要快速导出。

优点

  • 文件体积小,导出速度快,内存占用低。
  • 可以用 Excel 直接打开,兼容性好。
  • 结构简单,适合流式写入,非常适合 ThinkPHP 配合 fputcsv 函数使用。

缺点

  • 不支持复杂样式(加粗、背景色、合并单元格)。
  • 纯文本,如果数据中含有特殊字符(如逗号、引号)处理不当会乱列。
  • 中文编码需注意(需转 UTF-8 with BOM 才不会被 Excel 打开乱码)。

ThinkPHP 实现方案

  • 导出:使用 Response 的 header 设置强制下载,配合 fopen('php://output', 'w') 循环写入。
  • 导入:使用 fopen 读取 + fgetcsv 解析,注意处理 UTF-8 编码问题(Excel 保存的通常为 GBK,需要转换)。
// 控制器导出示例
public function exportCsv()
{
    $list = Db::name('user')->limit(10000)->select()->toArray();
    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename="users_' . date('YmdHis') . '.csv"');
    $output = fopen('php://output', 'w');
    fwrite($output, "\xEF\xBB\xBF"); // 添加 BOM,防止 Excel 打开乱码
    // 表头
    fputcsv($output, ['ID', '用户名', '邮箱', '注册时间']);
    // 数据
    foreach ($list as $row) {
        fputcsv($output, [
            $row['id'],
            $row['username'],
            $row['email'],
            $row['create_time']
        ]);
    }
    fclose($output);
    exit; // 必须 exit,避免后续输出
}

Excel 格式(XLSX / XLS)

适用场景:数据量适中(万级以下)、需要特别样式(如标题行加粗、列宽设置)、面向业务人员使用的报表。

优点

  • 样式丰富,用户体验好。
  • 可以包含多个工作表(Sheet)。
  • 支持公式和数据类型(如日期类型)。

缺点

  • 需要引入第三方库(如 PhpSpreadsheet)。
  • 大数据量导出时占用内存极高,容易导致内存溢出(需要分页处理)。

ThinkPHP 实现方案

  • 推荐使用 Composer 安装 phpoffice/phpspreadsheet
  • 核心步骤
    1. 引入库并实例化 Spreadsheet 对象。
    2. 设置当前活动的 Sheet,写入单元格数据。
    3. 使用 IOFactory 生成 XLSX 二进制内容并强制下载。
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
// 控制器导出示例
public function exportExcel()
{
    $list = Db::name('user')->limit(5000)->select()->toArray();
    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
    // 表头
    $sheet->setCellValue('A1', 'ID');
    $sheet->setCellValue('B1', '用户名');
    $sheet->setCellValue('C1', '邮箱');
    // 数据
    $rowNum = 2;
    foreach ($list as $row) {
        $sheet->setCellValue('A' . $rowNum, $row['id']);
        $sheet->setCellValue('B' . $rowNum, $row['username']);
        $sheet->setCellValue('C' . $rowNum, $row['email']);
        $rowNum++;
    }
    // 设置文件名和响应头
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment; filename="users_' . date('YmdHis') . '.xlsx"');
    $writer = new Xlsx($spreadsheet);
    $writer->save('php://output');
    exit;
}

JSON 格式

适用场景:API 接口对接、系统间数据交换、数据备份(前端可直接处理)。

优点

  • 结构清晰,跨语言兼容性强。
  • 无需任何额外库,原生支持 json_encode / json_decode
  • 支持复杂嵌套结构。

缺点

  • 不适合直接给业务人员查看,可读性差。
  • 文件体积较 CSV 更大。

ThinkPHP 实现方案

  • 导出return json($data); 或者 json_encode 后强制下载 .json 文件。
  • 导入:读取文件内容后 json_decode 转换为数组插入数据库。

SQL 格式(数据备份/迁移)

适用场景:数据库备份、表结构迁移、大数据量初始化。

优点

  • 数据结构和数据完整保留。
  • 可在其他环境直接执行,保持一致性。

缺点

  • 不安全,需严格权限控制(包含密码等敏感信息)。
  • 与业务逻辑无关,主要用于运维场景。

ThinkPHP 实现方案

  • 不推荐在业务代码中生成,建议使用服务器 mysqldump 命令。
  • 如果必须在代码中生成,需要遍历表结构(SHOW CREATE TABLE)和所有数据(SELECT *),拼接成 INSERT INTO 语句,复杂度较高。

总结建议

格式 模块场景 性能备注
CSV 一般后台列表导出、大数据量日志导出 内存占用最低,性能最好
XLSX 业务报表、需要格式要求的财务/统计表 数据量超过2万条需分页或改CSV
JSON API接口、系统集成数据交换 资源开销小
SQL 运维备份、数据库迁移 不常用于业务控制器

特别提示(针对 ThinkPHP 开发):

  1. 内存控制:无论导出哪种格式,如果数据量大(>1万行),尽量使用 游标查询Db::name()->cursor())来替代 select(),避免一次性将全量数据加载到内存。
  2. 超时控制:导出大批量数据时,可能超过 max_execution_time,需要在代码开头使用 set_time_limit(0)(谨慎使用)或分批处理。
  3. 引入扩展:如果你不需要复杂样式,仅仅是把 select 出来的数组转成 Excel,优先选择 CSV,省去 PhpSpreadsheet 的引入成本。

在选择时,建议根据 数据量大小客户对格式的接受程度 来权衡,PHP 官方自带 fputcsv 功能完全够用,无需额外依赖,是 ThinkPHP 项目中的首选方案。

抱歉,评论功能暂时关闭!