使用 PHPSpreadsheet 打开受密码保护的 XLSX 文件
Posted
技术标签:
【中文标题】使用 PHPSpreadsheet 打开受密码保护的 XLSX 文件【英文标题】:Open XLSX file that protected by a password with PHPSpreadsheet 【发布时间】:2018-10-01 04:13:25 【问题描述】:我正在尝试打开一个受phpSpreadsheet (documentation) 密码保护的 Excel 文件 (.xlsx)。我知道密码,但我找不到打开它的方法。
\PhpOffice\PhpSpreadsheet\Reader\Xlsx
的 load()
方法无法插入密码,当我尝试加载文件时它返回错误(当然)。
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load('hello world.xlsx');
$sheet = $spreadsheet->getActiveSheet();
echo $sheet->getCell('A1')->getValue() . "\n";
这是错误
警告:ZipArchive::getFromName():第 311 行 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化 警告:ZipArchive::getFromName():第 313 行 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化 警告:在第 350 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中为 foreach() 提供的参数无效 警告:ZipArchive::getFromName():第 311 行 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化 警告:ZipArchive::getFromName():第 313 行 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化 警告:在第 397 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中为 foreach() 提供的参数无效 警告:ZipArchive::getFromName():第 311 行 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化 警告:ZipArchive::getFromName():第 313 行 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化 警告:在第 1855 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中为 foreach() 提供的参数无效 警告:ZipArchive::close():第 1883 行 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化
这段代码如何处理密码?
【问题讨论】:
寻找相同的信息,我开始认为这是不可能的,或者这是世界上最保守的秘密。 【参考方案1】:欢迎您查看我的PHPDecryptXLSXWithPassword repo。
它也适用于 DOCX/PPTX 文件,但这个答案是针对您的问题的:首先 decrypt 使用密码的文件,然后使用解密后的文件和 PHPSpreadsheet。
这是一个例子:
require_once('PHPDecryptXLSXWithPassword.php');
$encryptedFilePath = 'hello world.xlsx';
$password = 'mypassword'; // password to "open" the file
$decryptedFilePath = 'temp_path_to_decrypted_file.xlsx';
decrypt($encryptedFilePath, $password, $decryptedFilePath);
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load($decryptedFilePath);
$sheet = $spreadsheet->getActiveSheet();
echo $sheet->getCell('A1')->getValue() . "\n";
注意:这是一个实验性代码,请谨慎使用。不要在生产中使用!
【讨论】:
【参考方案2】:目前我无法尝试,但我想你必须这样做:
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load('hello world.xlsx');
$sheet = $spreadsheet->getActiveSheet();
$sheet->getProtection()->setSheet(true);
$sheet->getProtection()->setPassword('THEPASSWORD');
echo $sheet->getCell('A1')->getValue() . "\n";
我不确定,明天我会去办公室试试。
【讨论】:
使用$reader->load()
时崩溃,因为密码保护文档(不仅是工作簿)
你是对的!我正在阅读实现,而且“密码管理”区域中的 Xls 阅读器似乎是个笑话。以上是关于使用 PHPSpreadsheet 打开受密码保护的 XLSX 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用实体框架打开受密码保护的 SQL Server CE 数据库