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

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。我只是在读它并解析它的值。 这就是我得到

  • 我必须解析一个XML,其中缺少xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"命名空间,所以xml看起来像这样: 但应该是这样的: type属性确保了正确的子类。 解析器是通过一个手写的xsd自动生成的$ 一个简单的解决方案是在输入XML上运行一个字符串替换(type=\\"到xsi: type=\"),但这很难看。有没有更好的解决办法?