ThinkPHP8.0Excel数据导出_ThinkPHP8.0导出Excel表格教程【功能】

雨丽君_5553

雨丽君_5553

2026-06-29

534人浏览

原创

thinkphp 8.0 导出 excel 必须用 phpoffice/phpspreadsheet,因 phpexcel 已废弃且不兼容 php 8.0+,强行使用会报 class 'phpexcel' not found 或方法签名不兼容错误;其最后版仅支持 php 7.2,而 phpspreadsheet 是官方继任者,api 兼容但底层重写。

thinkphp8.0excel数据导出_thinkphp8.0导出excel表格教程【功能】

ThinkPHP 8.0 导出 Excel 必须用 phpoffice/phpspreadsheet,PHPExcel 已废弃且不兼容 PHP 8.0+,硬上会直接报 Class 'PHPExcel' not found 或 Declaration of ... must be compatible with ... 错误。

为什么不能继续用 PHPExcel

PHPExcel 在 2016 年已停止维护,其最后稳定版(1.8.2)仅支持到 PHP 7.2;TP8 默认要求 PHP 8.0+,而 phpspreadsheet 是它的官方继任者,API 兼容但底层完全重写。常见错误包括:

  • Fatal error: Declaration of PhpOffice\PhpSpreadsheet\Reader\Xlsx::canRead($pFilename) must be compatible with PhpOffice\PhpSpreadsheet\Reader\IReader::canRead($filename)
  • Call to undefined method PhpOffice\PhpSpreadsheet\Spreadsheet::getActiveSheetIndex()(旧代码混用新类)

所有基于 PHPExcel 的 ThinkPHP 扩展(如 Org/Util/PHPExcel.class.php)在 TP8 中均不可用,强行 require 会触发 autoloader 冲突。

composer 安装与基础导出结构

执行安装命令,注意不要加 --dev(导出是运行时依赖):

composer require phpoffice/phpspreadsheet

导出逻辑应封装为独立服务类(非控制器内硬编码),核心步骤如下:

excel-clean
excel-clean

Excel 数据清洗——去重、填补缺失值、格式转换。

下载
  • 实例化 PhpOffice\PhpSpreadsheet\Spreadsheet
  • 获取当前 sheet:$sheet->getActiveSheet()(不是 getSheet(0))
  • 表头写入:用 setCellValue('A1', '姓名') 或批量循环 + ord() 计算列字母
  • 数据写入:逐行遍历数组,避免用 toArray() 反向生成(性能差、内存溢出风险高)
  • 设置响应头强制下载,**必须禁用输出缓冲**:ob_end_clean(); 否则返回空文件或乱码

导出中文乱码和样式丢失的根源

不是字体问题,而是默认编码和单元格格式未显式声明:

  • 中文显示异常 → 每个单元格需调用 getStyle()->getFont()->setName('SimSun')(Windows)或 'Noto Sans CJK SC'(Linux/macOS),否则 fallback 到无中文字体的 DejaVu
  • 数字被转成科学计数 → 对数值列(如手机号、ID)提前设置单元格格式:getStyle('B2:B1000')->setNumberFormatCode('@')(文本格式)
  • 自动换行失效 → 需同时设置:getAlignment()->setWrapText(true) + getRowDimension($row)->setRowHeight(-1)
  • 导出后 Excel 提示“发现不可读内容” → 未调用 $writer->save('php://output') 而用了 file_put_contents 写临时文件再读取(破坏流完整性)

TP8 原生导出方法推荐写法

避免封装过度,直接在控制器中轻量调用(适合中小数据量):

$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// 写表头
$header = ['ID', '姓名', '邮箱', '创建时间'];
foreach ($header as $col => $title) {
    $cell = chr(65 + $col) . '1';
    $sheet->setCellValue($cell, $title);
    $sheet->getStyle($cell)->getFont()->setBold(true);
}

// 写数据(假设 $data 是二维数组)
$row = 2;
foreach ($data as $record) {
    $col = 0;
    foreach ($record as $value) {
        $cell = chr(65 + $col) . $row;
        $sheet->setCellValueExplicit($cell, $value, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
        $col++;
    }
    $row++;
}

// 设置响应头
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="export_' . date('Ymd_His') . '.xlsx"');
header('Cache-Control: max-age=0');

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->save('php://output');
exit;

关键点:setCellValueExplicit(..., TYPE_STRING) 强制字符串类型,防止长数字(如身份证)被转义;exit 必须紧跟 save('php://output'),中间不能有 echo/print/debug 输出。

最易忽略的是导出前的输出缓冲清理和字符类型强制——这两项不处理,90% 的“导出失败”“文件损坏”“中文变方块”问题就出在这里。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关专题

更多
excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

2023.07.25

5121

7

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3156

5

excel复制表格怎么复制出来和原来一样大
excel复制表格怎么复制出来和原来一样大

本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

2023.08.02

2940

3

excel表格斜线一分为二
excel表格斜线一分为二

在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

2023.08.02

1444

3

excel斜线表头一分为二
excel斜线表头一分为二

excel斜线表头一分为二的方法有使用合并单元格功能方法、使用文本框功能方法、使用自定义格式方法。本专题为大家提供excel斜线表头一分为二相关的各种文章、以及下载和课程。

2023.08.02

697

5

绝对引用的输入方法
绝对引用的输入方法

绝对引用允许在公式中引用一个固定的单元格,而不会随着公式的复制和粘贴而改变引用的单元格。本专题为大家提供绝对引用相关内容的文章,大家可以免费体验。

2023.08.09

5148

7

java导出excel
java导出excel

在Java中,我们可以使用Apache POI库来导出Excel文件。本专题提供java导出excel的相关文章,大家可以免费体验。

2023.08.18

6683

6

excel输入值非法
excel输入值非法

在Excel中,当输入的数值非法时,有以下多种处理方法。本专题为大家提供excel输入值非法的相关文章,大家可以免费体验。

2023.08.18

1681

3

excel生成二维码
excel生成二维码

虽然Excel本身并不直接支持生成二维码,但我们可以借助一些插件或宏来实现在Excel中生成二维码的功能。本专题为大家提供excel生成二维码的相关文章。

2023.08.18

2818

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程