使用phpoffice/phpspreadsheet替代PHPExcel,安装需执行composer require命令并确保PHP≥7.4;导出时通过NumberFormat设置货币格式、中文列名及自动列宽,控制器中可流式下载或生成临时文件。

用Yii2.0.55导出财务或业务数据为Excel文件,需避开PHPExcel已废弃的旧写法,改用phpoffice/phpspreadsheet,并确保中文列名、千分位、负数括号、货币符号等格式在导出时正确呈现,否则打开Excel会乱码或数值错位。
安装phpspreadsheet依赖
进入项目根目录,执行:
composer require phpoffice/phpspreadsheet
这一步必须在命令行中运行,不能只改composer.json后手动复制vendor文件——【缺少autoload映射会导致Class 'PhpOffice\PhpSpreadsheet\Spreadsheet' not found】。
若提示“Your requirements could not be resolved”,检查PHP版本是否低于7.4(Yii2.0.55最低要求),或已有冲突包如phpexcel旧版残留,先执行composer remove phpexcel/phpexcel再重试。
创建Excel导出服务类
在common/components/下新建ExcelExporter.php:
第一步:声明命名空间和use语句
namespace common\components;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
第二步:定义导出方法,接收$data数组和$columns配置
public static function export($data, $columns = []) {
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
第三步:写入表头,逐列设置中文名和自动宽度
foreach ($columns as $i => $col) {
$sheet->setCellValueByColumnAndRow($i + 1, 1, $col['label']);
$sheet->getColumnDimensionByColumn($i + 1)->setAutoSize(true);
}
第四步:写入数据行,对数值类型启用千分位和负数括号格式
for ($row = 0; $row foreach ($columns as $i => $col) {
$value = $data[$row][$col['attribute']] ?? '';
if (isset($col['format']) && $col['format'] === 'currency') {
$sheet->getStyleByColumnAndRow($i + 1, $row + 2)
->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_CURRENCY_USD);
}
$sheet->setCellValueByColumnAndRow($i + 1, $row + 2, $value);
}
}
在控制器中调用导出
方法一:直接响应流式下载
public function actionExport() {
$data = YourModel::find()->asArray()->all();
$columns = [
['attribute' => 'name', 'label' => '客户名称'],
['attribute' => 'amount', 'label' => '金额', 'format' => 'currency'],
];
$file = common\components\ExcelExporter::export($data, $columns);
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($file);
$filename = '报表_' . date('YmdHis') . '.xlsx';
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $filename . '"');
header('Cache-Control: max-age=0');
$writer->save('php://output');
exit;
}
方法二:生成临时文件并返回URL(适合大文件)
把$writer->save('php://output')换成:
$path = Yii::getAlias('@runtime/export/') . $filename;
FileHelper::createDirectory(dirname($path));
$writer->save($path);
return $this->redirect(['download', 'file' => basename($path)]);
注意:若使用方法二,需在config/web.php中注册@runtime别名,并确保runtime/export目录存在且web服务器用户有写权限,否则mkdir失败会抛出异常。


















