如何用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
相关产品推荐
相关产品推荐

