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 文件的主要内容,如果未能解决你的问题,请参考以下文章

在使用模块 xlsx 样式时找不到命名空间 XLSX

PHPExcel获取.xlsx文件内容

PHPExcel - 读取下载的 xlsx 文件

使用php读取xlsx文件[关闭]

thinkphp3.2整合phpexcel

PHPExcel yii2 加载使用