PHPExcel सूत्र का मूल्यांकन नहीं करता है

I'm trying to evaluate the following formular in my XSLX workbook with PHPExcel 1.7.9: =IF($H$7=1,$F$13,$H$227*$J$227)

कार्यपुस्तिका में कुछ कक्षों को अपडेट करने से पहले और फिर मैं मूल्य की गणना करने के लिए इस पंक्ति का उपयोग करता हूं:

$sheet->getCell('L228')->getCalculatedValue();

हालांकि, PHPExcel उस सेल को अद्यतन नहीं करता है जिसमें सूत्र सही ढंग से शामिल है। यह कुछ नोटिस संदेशों को निम्न जैसा फेंकता है लेकिन सेल के गणना मूल्य को अपडेट नहीं करता है:

नोटिस: अपरिभाषित ऑफसेट: 2 में डी: \ my-path \ hkc \ Classes \ PHPExcel \ Calculation.php लाइन 2852

कोई अपवाद नहीं है और ऐसा लगता है कि getCalculatedValue() एमएस एक्सेल द्वारा गणना की गई पुरानी कैश मान देता है। जैसा कि नीचे बताया गया है, मैंने गणना इंजन की डीबग लॉगिंग सक्रिय कर दी है लेकिन यह खाली प्रतीत होता है:

PHPExcel_CalcEngine_Logger Object
(
    [_writeDebugLog:PHPExcel_CalcEngine_Logger:private] => 
    [_echoDebugLog:PHPExcel_CalcEngine_Logger:private] => 
    [_debugLog:PHPExcel_CalcEngine_Logger:private] => Array
        (
        )

    [_cellStack:PHPExcel_CalcEngine_Logger:private] => PHPExcel_CalcEngine_CyclicReferenceStack Object
        (
            [_stack:PHPExcel_CalcEngine_CyclicReferenceStack:private] => Array
                (
                )

        )

)

मैंने समस्या को हल करने के लिए निम्न चरणों का प्रयास किया है:

  1. Deactivate calculation cache: PHPExcel_Calculation::getInstance()->setCalculationCacheEnabled(FALSE);
  2. Activate debug mode of calculation engine: This is described in How to handle exception with PhpExcel? and especially http://phpexcel.codeplex.com/discussions/233047
    However, I had to modify the code of the referenced pages slightly - maybe something has changed in PHPExcel 1.7.9?
    Activate debug: PHPExcel_Calculation::getInstance()->writeDebugLog = true;
    Get debug log: print_r(PHPExcel_Calculation::getInstance()->getDebugLog());

मुझे यह नहीं मिला कि इंजन का वास्तविक लॉग खाली क्यों है? या तो इंजन किसी भी प्रविष्टि को लिखने से पहले काम करना बंद कर देता है या मेरी डीबगिंग कॉन्फ़िगरेशन में कुछ गलत है?

हालांकि, मैंने जावा और अपाचे पीओआई के साथ एक ही सूत्र का मूल्यांकन करने की कोशिश की है - यह काम किया! दुर्भाग्य से मुझे वर्तमान परियोजना के लिए PHP का उपयोग करना होगा।

कृपया मेरी मदद करें! हो सकता है कि कोई जानता है कि फॉर्मूला मूल्यांकन में क्या गलत है या कम से कम मुझे कुछ संकेत दे सकते हैं कि डिबगिंग को सही तरीके से कैसे सक्रिय किया जाए?

धन्यवाद!

5

2 उत्तर

अभी तक कोई जवाब नहीं है, लेकिन एक टिप्पणी लिखने में बहुत लंबा है:

PHPExcel 1.7.9 ने एक सिंगलटन से एक मल्टीटन से गणना इंजन को संशोधित किया (एक साथ कई कार्यपुस्तिकाओं के साथ काम करते समय संघर्ष से बचने के लिए आवश्यक)। इस प्रकार, प्रत्येक कार्यपुस्तिका कैल्क इंजन का अपना उदाहरण चलाती है, और कॉल करते समय

PHPExcel_Calculation::getInstance()

अब आपको यह निर्दिष्ट करना होगा कि आपको किस उदाहरण का उपयोग करना है। प्रत्येक PHPExcel इंस्टेंस में एक आईडी मान होता है, जो PHPExcel ऑब्जेक्ट में बनाए रखा जाता है जिसका उपयोग इस उद्देश्य के लिए किया जाता है, और आपको PHPExcel ऑब्जेक्ट को getInstance() विधि में पास करने की आवश्यकता होती है। इसलिए, यदि आपकी PHPExcel कार्यपुस्तिका $ objPHPExcel है, तो आपको इसका उपयोग करने की आवश्यकता होगी

PHPExcel_Calculation::getInstance($objPHPExcel)

कैश को फ़्लश करते समय, या लॉगर को सक्षम करने या लॉग पढ़ने के दौरान सही कैल्क इंजन उदाहरण का संदर्भ देना।

कर रहे हैं। आपकी त्रुटि के विनिर्देश: क्या आपके IF फॉर्मूला सेल संदर्भ द्वारा संदर्भित कक्षों में से कोई भी CUBE फ़ंक्शंस या SUMIFS फ़ंक्शन वाले अन्य सूत्रों का संदर्भ देता है? वे एकमात्र ऐसे कार्य हैं जिन्हें मैं जानता हूं जो इस विशेष त्रुटि को ट्रिगर कर सकते हैं

संपादित करें

एक SUMIFS() फ़ंक्शन को पुन: सक्रिय करने का उदाहरण

=SUMIFS(A2:A3, B2:B3, E1, C2:C3, F1)

जो ए 2 बताता है: ए 3 अगर बी 2: बी 3 ई 1 मानदंडों को पूरा करता है, और सी 2: सी 3 एफ 1 मानदंडों को पूरा करता है।

इसे फिर से क्रियान्वित किया जा सकता है

=SUMPRODUCT(A2:A3 * (B2:B3=E1) * (C2:C3=F1))
1
जोड़ा
गणना इंजन के साथ डिबगिंग पर मेरा सारांश gist.github.com/MarkBaker/5908357
जोड़ा लेखक Mark Baker, स्रोत
मी culpa, हाँ, आप PHPExcel ऑब्जेक्ट पास करने की जरूरत है, न केवल आईडी; getInstance फ़ंक्शन स्वयं को निष्कर्ष निकालता है .... तदनुसार संपादन
जोड़ा लेखक Mark Baker, स्रोत
एक्सेल <कोड> SUMIF() फ़ंक्शन कोई समस्या नहीं होनी चाहिए: यह SUMIFS() है जो कोड में उस बिंदु पर समस्याएं पैदा कर सकता है
जोड़ा लेखक Mark Baker, स्रोत
एक <कोड> SUMIFS() सूत्र को सामान्यतः SUMPRODUCT() का उपयोग करके दोबारा प्रतिक्रिया दी जा सकती है।
जोड़ा लेखक Mark Baker, स्रोत
जब मैं निम्नलिखित PHPExcel_Calculation :: getInstance ($ objPHPExcel-> getID ()) का उपयोग करता हूं -> wr & zwnj; iteDebugLog = true; - मुझे यह त्रुटि मिलती है: पकड़ने योग्य घातक त्रुटि: तर्क 1 पास PHPExcel_Calculation :: getInstance() को PHPExcel का एक उदाहरण होना चाहिए, स्ट्रिंग दी गई आपको धारणा के बारे में: हां शीट में वास्तव में बहुत सारे SUMIF कार्य होते हैं ...
जोड़ा लेखक J-Sharp, स्रोत
ठीक है, इंजन को डीबग मोड में स्विच करना अब काम करता प्रतीत होता है ... लेकिन मुझे PHPExcel_Calculation :: getInstance ($ objPHPExcel) -> debugLog : घातक के साथ डीबग लॉग पुनर्प्राप्त करने में एक नई त्रुटि मिलती है त्रुटि: निजी संपत्ति का उपयोग नहीं कर सकता PHPExcel_Calculation :: $ debugLog यह PHPExcel_Calculation :: getInstance ($ objPHPExcel) नहीं होना चाहिए -> getDebugLog और zwnj;() ? यह काम करता है - हालांकि लॉग अभी भी खाली है!
जोड़ा लेखक J-Sharp, स्रोत
मुझे लगता है कि मुझे डीबग लॉग को सक्रिय करने का सही तरीका मिला है: PHPExcel_Calculation :: getInstance ($ objPHPExcel) -> getDebugLog & zwnj;() -> setWriteDebugLog और zwnj; (true); मैं जांच करूंगा आउटपुट अगर मुझे समस्या को ट्रैक करने के लिए कुछ समय बचा है ... धन्यवाद!
जोड़ा लेखक J-Sharp, स्रोत
अब मैं देखता हूं - वास्तव में SUMIFS फ़ंक्शन शामिल है: [15] => रीढ़ की हड्डी! L228 -> रीढ़ की हड्डी! H7 => फ़ंक्शन SUMIFS() का मूल्यांकन 3 तर्कों के साथ - इसके बारे में कोई सुझाव क्या है अभी व?
जोड़ा लेखक J-Sharp, स्रोत

मैंने कुछ नमूने को SUMPRODUCT पर दोबारा प्रतिक्रिया दी है और ऐसा लगता है कि यह काम करता है। मैं वर्तमान में स्वचालित माध्यमों द्वारा रिफैक्टरिंग करने के लिए एक दृष्टिकोण की तलाश में हूं क्योंकि शीट में 50 से अधिक SUMIFS सूत्र हैं।

0
जोड़ा