7

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

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

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():Zip 对象无效或未初始化在 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的第 313 行警告:在 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中为 foreach() 提供的参数无效在第 350 行警告:ZipArchive::getFromName(): Invalid or uninitialized Zip object in /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 311 Warning: ZipArchive::getFromName(): Invalid or第 313 行 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中未初始化的 Zip 对象 警告:在第 397 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中为 foreach() 提供的参数无效 警告:ZipArchive::getFromName():/PHPOffice/vendor/phpoffice 中的 Zip 对象无效或未初始化/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 311 警告:ZipArchive::getFromName(): Invalid or uninitialized Zip object in /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 313 警告:在第 1855 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中为 foreach() 提供的参数无效警告:ZipArchive::close():/PHPOffice/ 中的 Zip 对象无效或未初始化供应商/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 在线 1883php上线1883php上线1883getFromName():第 311 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化 警告:ZipArchive::getFromName():/PHPOffice/vendor 中的 Zip 对象无效或未初始化/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 在第 313 行警告:在第 1855 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中为 foreach() 提供的参数无效警告: ZipArchive::close():第 1883 行 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化getFromName():第 311 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化 警告:ZipArchive::getFromName():/PHPOffice/vendor 中的 Zip 对象无效或未初始化/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 在第 313 行警告:在第 1855 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中为 foreach() 提供的参数无效警告: ZipArchive::close():第 1883 行 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化第 313 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化 警告:为 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ 中的 foreach() 提供的参数无效第 1855 行的 Reader/Xlsx.php 警告:ZipArchive::close():第 1883 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化第 313 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化 警告:为 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ 中的 foreach() 提供的参数无效第 1855 行的 Reader/Xlsx.php 警告:ZipArchive::close():第 1883 行的 /PHPOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php 中的 Zip 对象无效或未初始化

此代码如何处理密码?

4

2 回答 2

3

欢迎您查看我的PHPDecryptXLSXWithPassword 存储库。

它也适用于 DOCX/PPTX 文件,但此答案特定于您的问题:首先使用密码解密文件,然后将解密后的文件与 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";

注意:这是一个实验代码,所以请谨慎使用。不要在生产中使用!

于 2021-01-24T16:25:32.793 回答
0

目前我不能尝试,但是,我想你必须做这样的事情:

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";

我不确定,明天我会去办公室试试。

于 2018-05-01T16:26:32.457 回答