我正在尝试阅读存储在AWS S3存储桶中的一些Excel文件,但由于某些奇怪的原因,我遇到了.XLSX文件的问题,看起来像.XLS文件本身就是这样。
我在堆栈溢出中尝试了大部分答案,但我认为它与s3的流功能有关。
$xls_obj = array(
'Bucket' => $attributes->report_bucket->StringValue,
'Key' => $attributes->report_key->StringValue
);
$s3 = S3Client::factory(awsCred());
$s3->registerStreamWrapper();
$file = 's3://'.$xls_obj['Bucket'].'/'.$xls_obj['Key'];
这将返回我可以访问的文件路径。文件。 我然后将其加载到我的PHPExcel文件中。当我尝试识别它时,它将其显示为HTML,其中.XLS文件显示为excel5。
我确实尝试过使用
PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP);
和
$reader = PHPExcel_IOFactory::createReaderForFile($file);
$reader->setReadDataOnly(true);
return $reader->load($file);
这显然给了我
DOMDocument::loadHTML(): Invalid char in CDATA 0x3 in Entity, line: 1
因为标识的格式是HTML 我无法使用来自S3的PUBLIC URL。所以我需要帮助!
答案 0 :(得分:0)
因此,经过大量在线阅读后,我注意到,PHPExcel并不喜欢URL地址,这可能是Identify()给我HTML作为回应的原因。
所以,现在我设法通过将文件复制到tmp文件来解决这个问题,然后读取它然后将其删除。可能不是最好的解决方案,但现在它可以工作。
万一你想知道,我是怎么做的。
$s3 = S3Client::factory(awsCred());
$xls_obj = array(
'Bucket' => $Bucket,
'Key' => $KEY,
'SaveAs' => $path_folder."/".$fileName
);
$file = 's3://'.$xls_obj['Bucket'].'/'.$xls_obj['Key'];
$s3->getObject($xls_obj);
awsCred()是s3凭证的数组
然后我用这个函数返回PHPExcel文件:
function fileToExcelObj($file){
/**
* [fileToExcelObj description]
* @param {s3 Object} $file
* @return {PHPExcel Obj}
**/
$reader = PHPExcel_IOFactory::createReaderForFile($file);
return $reader->load($file);
}