Я использую последний мастер PHPExcel (последний коммит 28 марта 2015 г.) для разбора файла 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 по умолчанию или каким-то другим способом загрузить его, определенные таким образом?
В своем поиске я обнаружил сообщение об ошибке 2010 года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);
ОБНОВЛЕНИЕ: более общая проблема для обработки нестандартных пространств имен была подана, и обновленный обходной путь (также охватывающий пространство имен «d») найден в https://github.com/PHPOffice/PHPExcel/issues/1187#issuecomment-295032648
Других решений пока нет …