Файл синтаксического анализа PHP SimpleXLSX не возвращает все значения, если только файл XLSX не был сначала обработан вручную - PullRequest
0 голосов
/ 16 мая 2018

Я искал SO для ответа на этот вопрос, но до сих пор не смог найти ничего, что решило бы проблему. Если кто-то может помочь, это было бы очень признательно!

Предыстория: я создаю автоматизированный процесс, который загружает файл .xlsx с FTP-сайта, загружает данные в массив, обрабатывает / вычисляет определенные данные в массиве, а затем создает файл CSV из настроенного массива. Этот файл CSV будет затем импортирован в стороннюю систему, которая принимает только форматы CSV или JSON.

В настоящее время я использую SimpleXLSX для чтения файла, потому что это единственный из PHPExcel, SimpleXLSX, Spout и некоторых других, с которыми я мог работать быстро и без проблем (до этого момента).

Моя проблема в том, что, если я попытаюсь прочитать файл по мере его поступления, первая строка, извлеченная в массив, будет полностью пустой. Я также заметил, что первое поле массива - это []:

Array
    (
        [0] => Array
            (
                [] => 
                [0] => 
                [1] => 
                [2] => 
                [3] => 
                [4] => 
                [5] => 
                [6] => 
                [7] => 
                [8] => 
                [9] => 
                [10] => 

Вторая строка извлекает только данные, которые не являются текстовыми и равны нулю. Кроме того, это поле [] сместилось между первым и вторым полями:

 [1] => Array
        (
            [0] => 
            [] => CAD
            [1] => 
            [2] => 
            [3] => 
            [4] => 
            [5] => 
            [6] => 
            [7] => 
            [8] => 
            [9] => 
            [10] => 

Примечание: значение в этом поле [] выглядит почти так, как будто оно вращается по столбцам - в одном массиве это будет значение поля Record Id, в следующем - CountryCode и т. Д.

СЕЙЧАС - если я открою файл в Excel, удалю пустую строку внизу электронной таблицы и сохраню, размер файла xlsx утроится (от 2,327 КБ до 6443 КБ), НО данные корректно загружаются в массив !

Array
(
    [0] => Array
        (
            [0] => Record Id
            [1] => Owner Name
            [2] => Account Name
            [3] => Numeric Code
            [4] => Text Code
            [5] => Record Location
            [6] => Date Begins
            [7] => Date Ends
            [8] => Record Type
            [9] => Parent Id
            [10] => Country Code
            [11] => Supplier Id
            [12] => Supplier Name
            [13] => Supplier Category
            [14] => Supplier Sub Type
            [15] => Currency

Во второй строке также правильно извлекаются значения (обратите внимание, что пробелы и нули являются фактическими данными):

[1] => Array
    (
        [0] => 12345
        [1] => John Smith
        [2] => ABC Member
        [3] => 123456
        [4] => 12345678
        [5] => Local
        [6] => 1990-03-01 00:00:00
        [7] => 1970-01-01 00:00:00
        [8] => 123 Program
        [9] => 98765
        [10] => US
        [11] => 123
        [12] => ABC Tools
        [13] => Manufacturer
        [14] => XYZ
        [15] => USD

Я уверен, что это связано с классом SimpleXLSX, но я не знаю, как я могу это исправить - я попытался добавить дополнительные схемы в класс, как упоминалось в предыдущем посте, но это не изменить что-либо:

const SCHEMA_REL_RELATIONSHIP  =  'http://schemas.openxmlformats.org/package/2006/relationships';
const SCHEMA_REL_OFFICEDOCUMENT_RELATIONSHIP = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';
const SCHEMA_REL_WORKSHEETRELATION =  'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet';

Вот мой код, который читает файл после его переноса на локальный диск с FTP-сайта: (Примечание: удаление пустой строки, сохранение и выгрузка файла на FTP-сайт, загрузка его и управление им работает, как и ожидалось, поэтому я знаю, что проблема не в FTP.)

Что я могу найти, чтобы определить, почему я не могу прочитать этот файл по мере его поступления? Поскольку это должен быть автоматизированный процесс, я не хочу сохранять файл вручную. Этот процесс должен выполняться ежедневно.

<code>function read_file($filename, $server_file)
{

    //If the file can be read, load the array
    if ( stristr($server_file, '.xlsx'))
    {
       if($file = SimpleXLSX::parse($filename))
       {
            ?><pre><?php print_r($file->rows() ); ?>

Заранее благодарим за любую помощь, которую кто-то может оказать!

...