You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHPSpreadsheet实现Excel密码保护及获取二进制数据

问题解决:PHPSpreadsheet密码保护失效与二进制数据获取方案

为什么你的PHPSpreadsheet代码无法实现文件保护

你通过$spreadsheet->getSecurity()设置的密码,仅用于锁定工作簿的结构或窗口,并非对整个文件进行加密。这种设置只能限制用户修改工作表结构(比如添加/删除工作表、调整窗口布局),但用户无需输入密码就能直接打开文件查看内容,PHPSpreadsheet的该功能不支持文件级别的加密。

获取PHPSpreadsheet输出的二进制数据

无需将内容输出到php://output,可以把生成的Excel文件保存到PHP内存流中,再读取流内容得到二进制数据:

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// 创建并初始化Spreadsheet
$spreadsheet = new Spreadsheet();
$activeWorksheet = $spreadsheet->getActiveSheet();
$activeWorksheet->setCellValue('A1', 'Hello World !');

// 将文件保存到内存流
$writer = new Xlsx($spreadsheet);
$memoryStream = fopen('php://memory', 'r+');
$writer->save($memoryStream);
rewind($memoryStream); // 将流指针重置到起始位置

// 读取二进制数据
$binaryData = stream_get_contents($memoryStream);
fclose($memoryStream);

结合SecureSpreadsheet完成加密

拿到$binaryData后,即可用Nick\SecureSpreadsheet\Encrypt进行加密,最后输出给用户:

use Nick\SecureSpreadsheet\Encrypt;

$encrypt = new Encrypt($nofile = true);
$encryptedBinary = $encrypt->input($binaryData)
    ->password('111')
    ->output();

// 输出加密后的文件
$fileName = 'staff_data.xlsx';
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="'. urlencode($fileName).'"');
echo $encryptedBinary;

这样生成的Excel文件需要输入密码才能打开,实现真正的文件加密保护。

内容的提问来源于stack exchange,提问作者B L Praveen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:46:02