【问题标题】:Open XLSX file that protected by a password with PHPSpreadsheet使用 PHPSpreadsheet 打开受密码保护的 XLSX 文件
【发布时间】:2018-10-01 04:13:25
【问题描述】:

我正在尝试打开一个受PHPSpreadsheet (documentation) 密码保护的 Excel 文件 (.xlsx)。我知道密码,但我找不到打开它的方法。

\PhpOffice\PhpSpreadsheet\Reader\Xlsxload() 方法无法插入密码,当我尝试加载文件时它返回错误(当然)。

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 对象无效或未初始化

这段代码如何处理密码?

【问题讨论】:

  • 寻找相同的信息,我开始认为这是不可能的,或者这是世界上最保守的秘密。

标签: php phpspreadsheet phpoffice


【解决方案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 阅读器似乎是个笑话。
    最近更新 更多