本文目录导读:

ThinkPHP 项目中数据导入导出常见的格式主要有 CSV、Excel (XLSX)、JSON 以及 SQL 等。CSV 和 Excel (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。 - 核心步骤:
- 引入库并实例化
Spreadsheet对象。 - 设置当前活动的 Sheet,写入单元格数据。
- 使用
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万行),尽量使用 游标查询(
Db::name()->cursor())来替代select(),避免一次性将全量数据加载到内存。 - 超时控制:导出大批量数据时,可能超过
max_execution_time,需要在代码开头使用set_time_limit(0)(谨慎使用)或分批处理。 - 引入扩展:如果你不需要复杂样式,仅仅是把
select出来的数组转成 Excel,优先选择 CSV,省去PhpSpreadsheet的引入成本。
在选择时,建议根据 数据量大小 和 客户对格式的接受程度 来权衡,PHP 官方自带 fputcsv 功能完全够用,无需额外依赖,是 ThinkPHP 项目中的首选方案。