Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP—解析已检索并存储在变量中的excel/pdf文件的内容,而无需将内容保存到磁盘上的文件中_Php_Excel_Parsing_Pdf - Fatal编程技术网

PHP—解析已检索并存储在变量中的excel/pdf文件的内容,而无需将内容保存到磁盘上的文件中

PHP—解析已检索并存储在变量中的excel/pdf文件的内容,而无需将内容保存到磁盘上的文件中,php,excel,parsing,pdf,Php,Excel,Parsing,Pdf,以下是场景: 我在php中有一个变量,它包含excel文件的原始内容,我想将该变量的内容(它是excel格式,也可以是pdf格式)解析为某个值。我正在寻找一个靠近文件内容结尾的关键字,需要在文件内容中提取一些接近所需值的内容,以便将其放入php中的变量并输出到我的网页。据我所知,该文件采用二进制或十六进制表示,但ascii转换表示为可读文本,带有菱形字符(带问号)和带边框的矩形以及其他无关字符,包括可读文本内容 以下是要求: 我不想通过先在磁盘上存储或保存来解析文件的内容。我想在php变量中直接

以下是场景:

我在php中有一个变量,它包含excel文件的原始内容,我想将该变量的内容(它是excel格式,也可以是pdf格式)解析为某个值。我正在寻找一个靠近文件内容结尾的关键字,需要在文件内容中提取一些接近所需值的内容,以便将其放入php中的变量并输出到我的网页。据我所知,该文件采用二进制或十六进制表示,但ascii转换表示为可读文本,带有菱形字符(带问号)和带边框的矩形以及其他无关字符,包括可读文本内容

以下是要求:

我不想通过先在磁盘上存储或保存来解析文件的内容。我想在php变量中直接解析检索到的文件的内容

我的问题是:

我该怎么办?如果可能的话,我是否应该依靠PHPExcel来阅读此内容?如果没有,哪些php库可以完成此任务

如果可能的话,我是否应该依靠PHPExcel来阅读此内容

这是不可能的(见下文)

如果没有,哪些PHP库可以完成此任务

据我所知没有

我该怎么办

Excel文件(更确切地说,Excel 2003+XLSX文件-Excel97 XLS文件是完全不同的蠕虫文件)是一个ZIP归档文件,包含XML和树结构中的其他文件。因此,第一步是解压缩字符串中的ZIP文件;PHPExcel依赖于ZipArchive类,而这又不支持字符串读取,也绕过了大多数流攻击。中描述了一个类似的问题—实际上完全相同的问题

您可以考虑使用从字符串中解码文件,第一部分-读取-将起作用。文件的写入将不起作用。并且不能修改ZipArchive类,使其写入内存对象,因为它是一个

因此,您可以使用上面的一个答案(toster cx的答案)中的一个稍有不同。您需要自己对ZIP结构进行解码,从而获得所需文件开始的ZIP文件中的偏移量。这将是
/xl/worksheets/sheet1.xml
/xl/sharedStrings.xml
,具体取决于字符串是否由Excel内联。这还假定格式是较新的XLSX。一旦你有了它,你可以从字符串中提取数据并解压缩它,然后搜索它的令牌

当然,更有效地利用时间的方法是确定您不想使用临时文件的确切原因。也许这个问题可以用另一种方法解决

速度问题 实际上,读/写Excel文件并不可怕,因为在这种情况下,您不需要这样做。您几乎可以肯定地认为它是一个zip文件,并使用ZiPARCHIVE和GETSURE()打开它来直接访问您感兴趣的内部子文件。此操作将非常快,这也是因为您可以从getStream()读取周期运行搜索。您确实需要编写一次文件,但仅此而已

事实上,您可以在上传文件时编写该文件(您使用什么进行Web上传?plupload JS库有一个非常好的钩子,可以一次捕获一块非常大的文件)。在磁盘上仍然需要一个临时区域来存储数据,但在这种情况下,时间开销将专门用于解压和读取XML子文件,这与使用字符串对象所需的相同

还可以(可能,取决于几个因素,主要是平台和操作系统)将这部分工作卸载到后台运行的辅助进程,以便用户看到页面立即重新加载,而信息会在一段时间后显示。然而,这一部分相当棘手,很快就会变成维护的噩梦(是的,我对此有第一手的经验。在我的例子中,它是平铺图像转换)

作弊 好吧,事实是我喜欢作弊;它是如此高效。你说你控制了正在创建的XLSX和PDF?好!事实证明,在这两种情况下,您都可以向文件中添加隐藏的元数据。而且这些元数据比你想象的要容易读得多

例如,您可以向XLSX文件添加zip存档注释,因为它是一个zip文件。实际上,您可以将一个长度为零的假文件添加到存档中,称之为
发票总额\u 12345.xml
,这意味着发票总额为12345。优点是文件名存储在XLSX文件中的clear中,因此您只需使用
preg\u match
查找
INVOICE\u TOTAL([0-9]+)\.xml
并检索您的总计

PDF也是如此。您可以将关键字存储在PDF中。只需添加一个名为“InvoiceTotal”的关键字属性(查看PDF以了解结果)。但是在PDF中还有一个PDF ID,该ID将位于PDF的末尾。它将类似于
/ID[]^
,但只需使用一个已知的序列,例如
死肉
ec144ea3ecbb9ab8c22deadbeef12345
将再次表示总数为12345。已知序列之前的ID将是随机的,因此整个ID仍然是随机的和有效的


在这两种情况下,您现在都可以根据请求在字符串中查找已知标记。

无需投票结束,我将更新问题我希望避免临时文件是为了消除读写需要并降低网页加载速度,虽然这可能是我解码那些没有可查询信息的php文件时在循环中仍然会发生的事情,但我希望尽可能使它成为一个快速的过程