2015-04-08 88 views
2

我正在使用PHPExcel的最新大師(最近提交2015年3月28日)解析客戶端的xlsx文件,下面的代碼讀取文件時沒有抱怨,但找不到數據(只是我目前得到的輸出爲NULL):PHPExcel:解析X名稱空間的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> 

我認爲它不工作了,有是一個「訂單」表,因爲它看起來用於默認名稱空間中的「工作表」而不是「x」名稱空間。對不起,如果術語有點亂,但希望你能明白我的意思。

那裏肯定有數據,在該工作表中,因爲我可以在LibreOffice中打開文件並查看它。

有沒有辦法讓PHPExcel使用x命名空間作爲默認值或以某種方式讓它加載以這種方式定義的工作表?

在我的追問中,我發現了一個2010 1的錯誤報告,其中涉及類似的問題,但似乎沒有解決。

+1

沒有任何方法讓PHPExcel使用直到我重寫它的'x'命名空間 –

+0

感謝馬克,我想知道是否應該爲這些類型的電子表格寫一個新的閱讀器,而不是爲了客戶而做必要的可怕黑客攻擊,因爲時間很緊。 – Hanra091

+0

你說得對,其中一些與MS Excel自身使用的名稱空間不同的幾個名稱空間最近出現了......我已經重寫了基於XML的讀者使用XMLReader而不是SimpleXML,作爲該工作的一部分,試圖解決命名空間問題,但進展緩慢 –

回答

3

這個問題在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); 

更新:處理非標準名稱空間的更一般問題已提交,並且更新的解決方法(覆蓋「d」名稱空間以及)可在https://github.com/PHPOffice/PHPExcel/issues/1187#issuecomment-295032648