PHPExcel: анализ файлов XLSX с пространством имен X

Я использую последний мастер 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 относительно подобной проблемы, которая, кажется, не была решена.

2

Решение

Эта проблема отслеживается в 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

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]