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

这段代码如何处理密码?

【问题讨论】:

寻找相同的信息,我开始认为这是不可能的,或者这是世界上最保守的秘密。 【参考方案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 数据库

如何在 Java 中使用 truezip 库打开受密码保护的 zip 文件

如何使用python打开受密码保护的excel文件?

打开受 Busy Win 保护的 mdb 文件密码

以编程方式打开受密码保护的 VBA 项目

无法打开受密码保护的 zip 存档