PHPExcel:使用 X 命名空间解析 XLSX 文件
Posted
技术标签:
【中文标题】PHPExcel:使用 X 命名空间解析 XLSX 文件【英文标题】:PHPExcel : Parsing XLSX files with X namespace 【发布时间】:2015-04-08 12:09:02 【问题描述】:我正在使用最新的 phpExcel 大师(最近一次提交于 2015 年 3 月 28 日)为客户端解析 xlsx 文件,以下代码读取文件时没有抱怨但没有找到数据(我目前得到的唯一输出是 NULL) :
<?php
include 'PHPExcel/IOFactory.php';
$inputFileName = 'foo.xlsx';
try
$objReader = PHPExcel_IOFactory::createReaderForFile($inputFileName);
$objPHPExcel = $objReader->load($inputFileName);
catch (Exception $e)
print_r('Error loading file "' . pathinfo($inputFileName,
PATHINFO_BASENAME) . '": ' . $e->getMessage());
$sheet = $objPHPExcel->getSheetByName("Orders");
var_dump($sheet);
?>
xlsx 文件中的工作簿定义如下所示:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<x:workbook xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4506" />
<x:workbookPr defaultThemeVersion="124226" />
<x:bookViews>
<x:workbookView xWindow="480" yWindow="345" windowWidth="24495" windowHeight="11955" />
</x:bookViews>
<x:sheets>
<x:sheet name="Orders" sheetId="4" r:id="relId4" />
</x:sheets>
<x:calcPr calcId="125725" />
</x:workbook>
我认为没有“订单”工作表,因为它在默认命名空间而不是“x”命名空间中寻找“工作表”。对不起,如果那里的术语有点乱,但希望你能明白我的意思。
在那个工作表中肯定有数据,因为我可以在 LibreOffice 中打开文件并查看它。
有没有办法让 PHPExcel 使用 x 命名空间作为默认命名空间,或者以其他方式让它加载以这种方式定义的工作表?
在寻找答案的过程中,我发现了一份来自 20101 的错误报告,涉及似乎尚未解决的类似问题。
【问题讨论】:
没有任何方法可以让 PHPExcel 使用x
命名空间,除非我重写它
谢谢马克,我想知道我是否应该去为这些电子表格编写一个新的阅读器,而不是在时间紧迫的情况下为客户做可怕的黑客攻击。
你是对的,最近出现了一些具有不同(与 MS Excel 本身使用的)命名空间的命名空间......我已经在重写基于 XML 的阅读器以使用 XMLReader而不是 SimpleXML,它付出了惊人的努力,并试图解决命名空间问题作为该工作的一部分,但进展缓慢
这个问题在github.com/PHPOffice/PHPExcel/issues/571-@Mark 下跟踪,去年有什么进展可以分享吗? :)
【参考方案1】:
此问题在https://github.com/PHPOffice/PHPExcel/issues/571 跟踪
以下是一种解决方法,它很丑陋,但在解决此问题之前可能会有所帮助...
创建一个新类PHPExcel_Reader_Excel2007_XNamespace.php
:
<?php
class PHPExcel_Reader_Excel2007_XNamespace extends PHPExcel_Reader_Excel2007
public function securityScan($xml)
$xml = parent::securityScan($xml);
return str_replace(['<x:', '</x:'], ['<', '</'], $xml);
然后使用此阅读器加载您的 excel 文件:
$excelReader = new PHPExcel_Reader_Excel2007_XNamespace();
$objPHPExcel = $excelReader->load($inputFileName);
更新:处理非标准命名空间的更一般性问题已提交,并在https://github.com/PHPOffice/PHPExcel/issues/1187#issuecomment-295032648找到更新的解决方法(也涵盖“d”命名空间)
【讨论】:
以上是关于PHPExcel:使用 X 命名空间解析 XLSX 文件的主要内容,如果未能解决你的问题,请参考以下文章