当前位置: 首页 > 知识库问答 >
问题:

PHPExcel:解析具有X命名空间的XLSX文件

段干博明
2023-03-14

我正在使用最新的PHPExcel master(最近一次提交时间是2015年3月28日)来解析客户端的xlsx文件,下面的代码没有抱怨地读取该文件,但是没有找到任何数据(我当前得到的唯一输出是空):

<?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>

我认为存在“Orders”表是不可行的,因为它在默认名称空间中查找“sheets”,而不是在“X”名称空间中查找“sheets”。抱歉,如果术语有点胡言乱语,但希望你能明白我的意思。

那里肯定有数据,在那个工作表中,因为我可以在LibreOffice中打开文件看到它。

共有1个答案

龙枫
2023-03-14

此问题可在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);
    }

}
$excelReader = new PHPExcel_Reader_Excel2007_XNamespace();
$objPHPExcel = $excelReader->load($inputFileName);

更新:处理非标准名称空间的一个更普遍的问题已经归档,更新的解决方法(也包括“d”名称空间)可以在https://github.com/phpoffice/phpexcel/issues/1187#issuecomment-295032648找到

 类似资料:
  • 我尝试像这样解析xml: 我尝试解析这个xml: 但是我的jobNode总是空的。如果我把我的xml改成这样,它就可以工作了:

  • 我需要一个简单的xslt,它接受输入并提供如下所述的输出。我已经编写了xslt,但名称空间被忽略了。你能帮我一下吗。 输入消息: 预期输出消息: 实际输出消息: XSLT:

  • 问题 你想解析某个XML文档,文档中使用了XML命名空间。 解决方案 考虑下面这个使用了命名空间的文档: <?xml version="1.0" encoding="utf-8"?> <top> <author>David Beazley</author> <content> <html xmlns="http://www.w3.org/1999/xhtml">

  • 本文向大家介绍Python利用命名空间解析XML文档,包括了Python利用命名空间解析XML文档的使用技巧和注意事项,需要的朋友参考一下 问题 你想解析某个XML文档,文档中使用了XML命名空间。 解决方案 考虑下面这个使用了命名空间的文档: 如果你解析这个文档并执行普通的查询,你会发现这个并不是那么容易,因为所有步骤都变得相当的繁琐。 你可以通过将命名空间处理逻辑包装为一个工具类来简化这个过程

  • 我需要解析和打印ns4:功能部分。空手道以json格式打印它。我试着参考这个答案。但是,我得到'ERROR:'前缀'xsi'的命名空间没有被声明.'错误,如果使用建议的xPath.即, 这是我的XML:它包含许多具有不同“ns”值的部分,但我在这里给出了一个额外的内容。 这是我使用的xPath; 注意:我将上述xml保存在一个单独的文件test1中。xml。我只是在读它并解析它的值。 这就是我得到

  • 问题内容: 尽管我已经学习Python大约一年了,但我正在学习Python并仍然是一个初学者。我正在尝试编写一个在主模块中调用的功能模块。被调用模块中的每个函数都需要math模块才能运行。我想知道是否有一种方法可以在不将数学模块导入被调用模块内部的情况下进行操作。这是我所拥有的: : : 运行时,我得到: 我很难理解的是为什么在运行时出现名称错误。我知道该变量在导入时对主模块变为全局,因为可以访问