Получение # N / A для любых вычислений, которые ссылаются на ячейку по имени

У меня есть файл Excel, состоящий из 8 листов.

В файле Excel есть вычисления, которые выполняются в различных ячейках, которые ссылаются на другие ячейки на другом листе и ссылаются на них только по имени.

Например, на листе 2 у меня есть ячейка D12, а формула в этой ячейке - =CostIssue. CostIssue - это ячейка на листе 1.

Используя PHPExcel, мне удалось прочитать файл Excel, управлять некоторыми ячейками, а затем сгенерировать его HTML-код, но, как я уже упоминал, во всех ячейках, которые ссылаются на именованные ячейки, я получаю # N / А.

Любой способ решить эту проблему, или я должен вручную отредактировать весь файл, чтобы ссылаться на эти именованные ячейки другим способом (например, по листу и номеру ячейки)?

Спасибо

Обновлять:

Еще немного информации. Лист 2, ячейка D12 содержит =CostIssue CostIssue - это имя ячейки C37 на листе 1, которая содержит: =VLOOKUP($C$9,$Params.$B$6:$D$10,2,0)


person BrokenCode    schedule 12.02.2016    source источник
comment
Предполагая, что это именованные диапазоны, PHPExcel должен уметь читать их и использовать в вычислениях формул ... пробовали ли вы отладку с помощью этот метод, чтобы узнать, как PHPExcel пытается получить доступ к этим именованным ссылкам?   -  person Mark Baker    schedule 13.02.2016
comment
Большое спасибо за ваш отзыв. Я не уверен, что я сделал это правильно, но я указал сценарий отладки на ячейку D12 листа 2, которая содержит =CostIssue, и вот результат: Значение формулы равно 40 Ожидаемое значение НЕИЗВЕСТНО. Стек синтаксического анализатора: - Расчетное значение Array () равно 40 Журнал оценки: Array ()   -  person BrokenCode    schedule 13.02.2016
comment
Я добавил дополнительную информацию в исходный вопрос, если это поможет.   -  person BrokenCode    schedule 13.02.2016
comment
Похоже, ячейка, на которую ссылается имя CostIssue, имеет значение (или формулу, которая возвращает) 40, что должно быть тем, что вы получите при вызове getCalculatedValue() для ячейки D12.   -  person Mark Baker    schedule 13.02.2016
comment
Но в PHPExcel он отображается как # N / A.   -  person BrokenCode    schedule 14.02.2016
comment
Ваш комментарий от отладки Calculated Value is 40 сбивает меня с толку ... можете ли вы определить небольшой набор таблиц, демонстрирующих проблему, которую можно загрузить, потому что я не могу понять противоречия здесь .... getCalculatedValue() не возвращает #N/A! в этом случае он возвращает 40   -  person Mark Baker    schedule 14.02.2016
comment
Извините, я не объяснил должным образом. Когда я вывожу соответствующий лист как HTML, в содержимом соответствующей ячейки написано # N / A. Я постараюсь посмотреть, смогу ли я поделиться частью этой таблицы.   -  person BrokenCode    schedule 14.02.2016
comment
Извините, я применил сценарий отладки не к тому листу и ячейке. Теперь, когда я понимаю, как работает активный лист, я применил его к нужному листу и ячейке, и вот что я получил: Formula Value is =CostIssue Expected Value is 0.5 Parser Stack :- Array ( [0] => Array ( [type] => Value [value] => CostIssue [reference] => ) ) Calculated Value is #N/A - это вообще полезно или вам все еще нужен доступ к листу Excel?   -  person BrokenCode    schedule 14.02.2016
comment
Ну, так как PHPExcel обычно должен обрабатывать именованные ссылки без проблем, и в этом случае он не может идентифицировать ячейку, на которую ссылаются, тогда он все равно будет полезен   -  person Mark Baker    schedule 14.02.2016
comment
Могу ли я отправить вам образец в частном порядке? Боюсь, это не для общественного потребления.   -  person BrokenCode    schedule 15.02.2016
comment
Получил, посмотрю сегодня вечером   -  person Mark Baker    schedule 15.02.2016
comment
@MarkBaker, ты все это видел? Я хотел бы иметь возможность использовать PHPExcel для этого проекта. Если вы считаете, что проблема связана с файлом Excel, я был бы рад увидеть, сможем ли мы изменить файл, чтобы он работал с PHPExcel.   -  person BrokenCode    schedule 19.02.2016


Ответы (1)


Я смотрел на это, используя функцию отладки Calc Engine, и до сих пор не понимаю, в чем проблема.

Используя ячейку D12 на листе Executive Summary, содержащую формулу =Input!C37, и ячейку C37 на Input листе, содержащую формулу =VLOOKUP($C$9,Params!$B$6:$D$10,2,FALSE), которая оценивается как 0.5 (отформатированная в процентах в ячейках).

С кодом отладки

function testFormula($sheet, $cell) {
    $formulaValue = $sheet->getCell($cell)->getValue();
    echo 'Formula Value is ' , $formulaValue , PHP_EOL;
    $expectedValue = $sheet->getCell($cell)->getOldCalculatedValue();
    echo 'Expected Value is '  , ((!is_null($expectedValue)) ? $expectedValue : 'UNKNOWN') , PHP_EOL;


    $calculate = false;
    try {
        $tokens = PHPExcel_Calculation::getInstance($sheet->getParent())
            ->parseFormula($formulaValue, $sheet->getCell($cell));
        echo 'Parser Stack :-' , PHP_EOL;
        print_r($tokens);
        echo PHP_EOL;
        $calculate = true;
    } catch (Exception $e) {
        echo 'PARSER ERROR: ' , $e->getMessage() , PHP_EOL;

        echo 'Parser Stack :-' , PHP_EOL;
        print_r($tokens);
        echo PHP_EOL;
    }

    if ($calculate) {
        try {
            $cellValue = $sheet->getCell($cell)->getCalculatedValue();
            echo 'Calculated Value is ' , $cellValue , PHP_EOL;

            echo 'Evaluation Log:' , PHP_EOL;
            print_r(PHPExcel_Calculation::getInstance($sheet->getParent())
                ->getDebugLog()->getLog());
            echo PHP_EOL;
        } catch (Exception $e) {
            echo 'CALCULATION ENGINE ERROR: ' , $e->getMessage() , PHP_EOL;

            echo 'Evaluation Log:' , PHP_EOL;
            print_r(PHPExcel_Calculation::getInstance($sheet->getParent())
                ->getDebugLog()->getLog());
            echo PHP_EOL;
        }
    }
}


$sheet = $objPHPExcel->getSheetByName('Executive Summary');
PHPExcel_Calculation::getInstance($objPHPExcel)
    ->getDebugLog()->setWriteDebugLog(true);

testFormula($sheet,'D12');

Я получаю результаты

Formula Value is =Input!C37
Expected Value is 0.5
Parser Stack :-
Array
(
    [0] => Array
        (
            [type] => Cell Reference
            [value] => Input!C37
            [reference] => Input!C37
        )

)

Calculated Value is 0.5
Evaluation Log:
Array
(
    [0] => Testing cache value for cell Executive Summary!D12
    [1] => Executive Summary!D12 => Evaluating Cell C37 in worksheet Input
    [2] => Executive Summary!D12 => Testing cache value for cell Input!C37
    [3] => Executive Summary!D12 -> Input!C37 => Evaluating Cell C9 in current worksheet
    [4] => Executive Summary!D12 -> Input!C37 => Evaluation Result for cell Input!C9 is a string with a value of "both cost and speed-to-market"
    [5] => Executive Summary!D12 -> Input!C37 => Evaluating Cell B6 in worksheet Params
    [6] => Executive Summary!D12 -> Input!C37 => Evaluation Result for cell Params!B6 in worksheet Params is a string with a value of "only cost (speed-to-market remains unchanged)"
    [7] => Executive Summary!D12 -> Input!C37 => Evaluating Cell D10 in worksheet Params
    [8] => Executive Summary!D12 -> Input!C37 => Testing cache value for cell Params!D10
    [9] => Executive Summary!D12 -> Input!C37 -> Params!D10 => Evaluating Cell A10 in current worksheet
    [10] => Executive Summary!D12 -> Input!C37 -> Params!D10 => Evaluation Result for cell Params!A10 is a floating point number with a value of 5
    [11] => Executive Summary!D12 -> Input!C37 -> Params!D10 => Evaluating 5 - 1
    [12] => Executive Summary!D12 -> Input!C37 -> Params!D10 => Evaluation Result is a floating point number with a value of 4
    [13] => Executive Summary!D12 -> Input!C37 -> Params!D10 => Evaluating Cell A10 in current worksheet
    [14] => Executive Summary!D12 -> Input!C37 -> Params!D10 => Evaluation Result for cell Params!A10 is a floating point number with a value of 5
    [15] => Executive Summary!D12 -> Input!C37 -> Params!D10 => Evaluating 5 - 1
    [16] => Executive Summary!D12 -> Input!C37 -> Params!D10 => Evaluation Result is a floating point number with a value of 4
    [17] => Executive Summary!D12 -> Input!C37 -> Params!D10 => Evaluating 4 / 4
    [18] => Executive Summary!D12 -> Input!C37 -> Params!D10 => Evaluation Result is a floating point number with a value of 1
    [19] => Executive Summary!D12 -> Input!C37 => Evaluation Result for cell Params!D10 in worksheet Params is a floating point number with a value of 1
    [20] => Executive Summary!D12 -> Input!C37 => Evaluating Range "Params!B6" : "Params!D10"
    [21] => Executive Summary!D12 -> Input!C37 => Testing cache value for cell Params!C6
    [22] => Executive Summary!D12 -> Input!C37 -> Params!C6 => Evaluating Cell D6 in current worksheet
    [23] => Executive Summary!D12 -> Input!C37 -> Params!C6 => Evaluation Result for cell Params!D6 is a floating point number with a value of 0
    [24] => Executive Summary!D12 -> Input!C37 -> Params!C6 => Evaluating 1 - 0
    [25] => Executive Summary!D12 -> Input!C37 -> Params!C6 => Evaluation Result is a floating point number with a value of 1
    [26] => Executive Summary!D12 -> Input!C37 => Testing cache value for cell Params!C7
    [27] => Executive Summary!D12 -> Input!C37 -> Params!C7 => Evaluating Cell D7 in current worksheet
    [28] => Executive Summary!D12 -> Input!C37 -> Params!C7 => Testing cache value for cell Params!D7
    [29] => Executive Summary!D12 -> Input!C37 -> Params!C7 -> Params!D7 => Evaluating Cell A7 in current worksheet
    [30] => Executive Summary!D12 -> Input!C37 -> Params!C7 -> Params!D7 => Evaluation Result for cell Params!A7 is a floating point number with a value of 2
    [31] => Executive Summary!D12 -> Input!C37 -> Params!C7 -> Params!D7 => Evaluating 2 - 1
    [32] => Executive Summary!D12 -> Input!C37 -> Params!C7 -> Params!D7 => Evaluation Result is a floating point number with a value of 1
    [33] => Executive Summary!D12 -> Input!C37 -> Params!C7 -> Params!D7 => Evaluating Cell A10 in current worksheet
    [34] => Executive Summary!D12 -> Input!C37 -> Params!C7 -> Params!D7 => Evaluation Result for cell Params!A10 is a floating point number with a value of 5
    [35] => Executive Summary!D12 -> Input!C37 -> Params!C7 -> Params!D7 => Evaluating 5 - 1
    [36] => Executive Summary!D12 -> Input!C37 -> Params!C7 -> Params!D7 => Evaluation Result is a floating point number with a value of 4
    [37] => Executive Summary!D12 -> Input!C37 -> Params!C7 -> Params!D7 => Evaluating 1 / 4
    [38] => Executive Summary!D12 -> Input!C37 -> Params!C7 -> Params!D7 => Evaluation Result is a floating point number with a value of 0.25
    [39] => Executive Summary!D12 -> Input!C37 -> Params!C7 => Evaluation Result for cell Params!D7 is a floating point number with a value of 0.25
    [40] => Executive Summary!D12 -> Input!C37 -> Params!C7 => Evaluating 1 - 0.25
    [41] => Executive Summary!D12 -> Input!C37 -> Params!C7 => Evaluation Result is a floating point number with a value of 0.75
    [42] => Executive Summary!D12 -> Input!C37 => Testing cache value for cell Params!C8
    [43] => Executive Summary!D12 -> Input!C37 -> Params!C8 => Evaluating Cell D8 in current worksheet
    [44] => Executive Summary!D12 -> Input!C37 -> Params!C8 => Testing cache value for cell Params!D8
    [45] => Executive Summary!D12 -> Input!C37 -> Params!C8 -> Params!D8 => Evaluating Cell A8 in current worksheet
    [46] => Executive Summary!D12 -> Input!C37 -> Params!C8 -> Params!D8 => Evaluation Result for cell Params!A8 is a floating point number with a value of 3
    [47] => Executive Summary!D12 -> Input!C37 -> Params!C8 -> Params!D8 => Evaluating 3 - 1
    [48] => Executive Summary!D12 -> Input!C37 -> Params!C8 -> Params!D8 => Evaluation Result is a floating point number with a value of 2
    [49] => Executive Summary!D12 -> Input!C37 -> Params!C8 -> Params!D8 => Evaluating Cell A10 in current worksheet
    [50] => Executive Summary!D12 -> Input!C37 -> Params!C8 -> Params!D8 => Evaluation Result for cell Params!A10 is a floating point number with a value of 5
    [51] => Executive Summary!D12 -> Input!C37 -> Params!C8 -> Params!D8 => Evaluating 5 - 1
    [52] => Executive Summary!D12 -> Input!C37 -> Params!C8 -> Params!D8 => Evaluation Result is a floating point number with a value of 4
    [53] => Executive Summary!D12 -> Input!C37 -> Params!C8 -> Params!D8 => Evaluating 2 / 4
    [54] => Executive Summary!D12 -> Input!C37 -> Params!C8 -> Params!D8 => Evaluation Result is a floating point number with a value of 0.5
    [55] => Executive Summary!D12 -> Input!C37 -> Params!C8 => Evaluation Result for cell Params!D8 is a floating point number with a value of 0.5
    [56] => Executive Summary!D12 -> Input!C37 -> Params!C8 => Evaluating 1 - 0.5
    [57] => Executive Summary!D12 -> Input!C37 -> Params!C8 => Evaluation Result is a floating point number with a value of 0.5
    [58] => Executive Summary!D12 -> Input!C37 => Testing cache value for cell Params!C9
    [59] => Executive Summary!D12 -> Input!C37 -> Params!C9 => Evaluating Cell D9 in current worksheet
    [60] => Executive Summary!D12 -> Input!C37 -> Params!C9 => Testing cache value for cell Params!D9
    [61] => Executive Summary!D12 -> Input!C37 -> Params!C9 -> Params!D9 => Evaluating Cell A9 in current worksheet
    [62] => Executive Summary!D12 -> Input!C37 -> Params!C9 -> Params!D9 => Evaluation Result for cell Params!A9 is a floating point number with a value of 4
    [63] => Executive Summary!D12 -> Input!C37 -> Params!C9 -> Params!D9 => Evaluating 4 - 1
    [64] => Executive Summary!D12 -> Input!C37 -> Params!C9 -> Params!D9 => Evaluation Result is a floating point number with a value of 3
    [65] => Executive Summary!D12 -> Input!C37 -> Params!C9 -> Params!D9 => Evaluating Cell A10 in current worksheet
    [66] => Executive Summary!D12 -> Input!C37 -> Params!C9 -> Params!D9 => Evaluation Result for cell Params!A10 is a floating point number with a value of 5
    [67] => Executive Summary!D12 -> Input!C37 -> Params!C9 -> Params!D9 => Evaluating 5 - 1
    [68] => Executive Summary!D12 -> Input!C37 -> Params!C9 -> Params!D9 => Evaluation Result is a floating point number with a value of 4
    [69] => Executive Summary!D12 -> Input!C37 -> Params!C9 -> Params!D9 => Evaluating 3 / 4
    [70] => Executive Summary!D12 -> Input!C37 -> Params!C9 -> Params!D9 => Evaluation Result is a floating point number with a value of 0.75
    [71] => Executive Summary!D12 -> Input!C37 -> Params!C9 => Evaluation Result for cell Params!D9 is a floating point number with a value of 0.75
    [72] => Executive Summary!D12 -> Input!C37 -> Params!C9 => Evaluating 1 - 0.75
    [73] => Executive Summary!D12 -> Input!C37 -> Params!C9 => Evaluation Result is a floating point number with a value of 0.25
    [74] => Executive Summary!D12 -> Input!C37 => Testing cache value for cell Params!C10
    [75] => Executive Summary!D12 -> Input!C37 -> Params!C10 => Evaluating Cell D10 in current worksheet
    [76] => Executive Summary!D12 -> Input!C37 -> Params!C10 => Testing cache value for cell Params!D10
    [77] => Executive Summary!D12 -> Input!C37 -> Params!C10 => Retrieving value for cell Params!D10 from cache
    [78] => Executive Summary!D12 -> Input!C37 -> Params!C10 => Evaluation Result for cell Params!D10 is a floating point number with a value of 1
    [79] => Executive Summary!D12 -> Input!C37 -> Params!C10 => Evaluating 1 - 1
    [80] => Executive Summary!D12 -> Input!C37 -> Params!C10 => Evaluation Result is a floating point number with a value of 0
    [81] => Executive Summary!D12 -> Input!C37 => Testing cache value for cell Params!D7
    [82] => Executive Summary!D12 -> Input!C37 => Retrieving value for cell Params!D7 from cache
    [83] => Executive Summary!D12 -> Input!C37 => Testing cache value for cell Params!D8
    [84] => Executive Summary!D12 -> Input!C37 => Retrieving value for cell Params!D8 from cache
    [85] => Executive Summary!D12 -> Input!C37 => Testing cache value for cell Params!D9
    [86] => Executive Summary!D12 -> Input!C37 => Retrieving value for cell Params!D9 from cache
    [87] => Executive Summary!D12 -> Input!C37 => Testing cache value for cell Params!D10
    [88] => Executive Summary!D12 -> Input!C37 => Retrieving value for cell Params!D10 from cache
    [89] => Executive Summary!D12 -> Input!C37 => Evaluating Function VLOOKUP() with 4 arguments
    [90] => Executive Summary!D12 -> Input!C37 => Evaluating VLOOKUP( "both cost and speed-to-market", { "only cost (speed-to-market remains unchanged)", 1, 0; "mainly cost", 0.75, 0.25; "both cost and speed-to-market", 0.5, 0.5; "mainly speed-to-market", 0.25, 0.75; "only speed-to-market", 0, 1 }, 2, FALSE )
    [91] => Executive Summary!D12 -> Input!C37 => Evaluation Result for VLOOKUP() function call is a floating point number with a value of 0.5
    [92] => Executive Summary!D12 => Evaluation Result for cell Input!C37 in worksheet Input is a floating point number with a value of 0.5
)

это именно то, что я ожидал увидеть с правильным результатом

Точно так же, если я использую метод toArray(), в ячейке [12] ['C'] отображается 50%.

ИЗМЕНИТЬ

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

person Mark Baker    schedule 20.02.2016
comment
Большое спасибо за то, что нашли время разобраться в этом. Если я использую вашу последнюю ветку разработки, она отлично работает. В то время как в стабильной версии 1.8 он возвращает # N / A. Насколько стабильна разработка в настоящее время, можем ли мы вообще использовать ее в производственной среде? - person BrokenCode; 21.02.2016
comment
Разработка - это довольно стабильный код, близкий к качеству релиза и приближающийся к моменту, когда я буду делать новый релиз с тегами. - person Mark Baker; 21.02.2016
comment
Идеально. Большое спасибо за ваше время и усилия. Действительно ценю это. - person BrokenCode; 21.02.2016