2012-02-04 20 views
4

Excelから情報を抽出しようとしたときにこの問題が発生しました。ここに私の状況は、私は私が様々なユーザーから受け取った34のExcelファイルがあります。PHPExcel - 別のセルを参照するセルからの値が正しく取得されなかった

私はExcelファイルから抽出するためにPHPバージョン5を使用しています。私のスクリプトはすべてのファイルに対してループし、シート名に従ってループし、最後にセルのアドレスに従って再びループします。

ユーザが、例えば、セルに入力したときに問題が発生しました。 = + A1これは、セルA1と同じ値を持つため、セル値を別のセルに参照しているユーザーを意味します。

特定のセルのレコードから見つかったものは、同じセルから取得した別のレコードと同じですが、別のExcelファイルで取得したものです。私が意味することは、私のPHPスクリプトが1つのファイルから別のファイルにループするので、PHPExcelが例えばC3のような値を持っていることを初めて読み取ったときです。次のファイルであるPHPExcelは同じセルC3に行くかもしれませんC3セルには、値がUSD5,000.00のセルA1(「= + A1」の式)を参照する数式が含まれています。

PHPスクリプトは、mysqlでUSD5,000.00を記録するとしますが、そうしなかったとします。私はPHPExcelスクリプトが最初のラウンドで変数をクリアしていないと思われる。私はunset($ objPHPExcel)を試して変数を破棄していますが、それでも起こっています。

if(file_exists($inputFileName)) 
            { 
             $inputFileType = PHPExcel_IOFactory::identify($inputFileName); 
             $objReader = PHPExcel_IOFactory::createReader($inputFileType); 
             $objReader->setReadDataOnly(true); 
             $objPHPExcel = $objReader->load($inputFileName); 

             //to obtain date from FILE and store in DB for future comparison 
             $validating_date_reporting = $objPHPExcel->getSheet(0)->getCell('C10')->getValue(); 
             $validating_date_reporting = PHPExcel_Style_NumberFormat::toFormattedString($validating_date_reporting,"YYYY-MMM-DD"); 
             $validating_date_reporting = date('Y-m-d',strtotime($validating_date_reporting)); 

             //first entry 
             $entry = mysql_query('INSERT INTO `'.$table.'`(`broker_code`, `date`, `date_from_submission`) VALUES("'.$broker_code.'","'.$reporting_date.'","'.$reporting_date.'")') or die(mysql_error()); 

             foreach($cells_array as $caRef=>$sName) 
             { 
              foreach($sName as $sNameRef=>$cells) 
               { 

                $wksht_page = array_search($caRef, $sheetNameArray); 
                $cell_column = $wksht_page.'_'.$cells; 
                echo $inputFileName.' '.$caRef.' '.$cell_column.'<br>'; 
                $value = $objPHPExcel->setActiveSheetIndexByName($caRef)->getCell($cells)->getCalculatedValue(); 

                echo $value.'<br>'; 

                 if($value) 
                 { 
                  $isdPortal->LoginDB($db_periodic_submission); 
                  $record = mysql_query('UPDATE `'.$table.'` SET `'.$cell_column.'` = "'.$value.'" WHERE broker_code = "'.$broker_code.'" AND date_from_submission = "'.$validating_date_reporting.'"') or die(mysql_error()); 

                 } 

               } 

             } 


            } 

私は本当にあなたがここに私を助けることができることを願っています。..

は、事前にあなたに感謝し、次のよう

私のコーディングは簡単です。

答えて

6

PHPExcelは、同様に計算キャッシュを保持し、ワークブックの設定を解除するとき、これはクリアされません。

PHPExcel_Calculation::flushInstance(); 

または

PHPExcel_Calculation::getInstance()->clearCalculationCache(); 

ます。また、無効にすることができます。それは使用して手動でクリアする必要があります(他の数式を含むセルを参照する数多くの数式を使用している場合は、処理が遅くなることがあります)。

PHPExcel_Calculation::getInstance()->setCalculationCacheEnabled(FALSE); 

ファイルを処理する前に

これは、現在PHPExcelが計算エンジンにシングルトンを使用しているためです。今年の後半にマルチトンパターンを使用するように切り替えるのはロードマップであり、この問題を緩和するために各ワークブックごとに個別のキャッシュを効果的に維持します。単に$ objPHPExcelが動作しない設定解除

EDIT

注意。 $ objPHPExcelを設定解除する前に、ワークシートを取り外す必要があります。

$objPHPExcel->disconnectWorksheets(); 
unset($objPHPExcel); 

開発者向けドキュメントのセクション4.3で説明しています。これは、PHPExcel_Calculation :: flushInstance()を追加する必要があるポイントです。

+0

こんにちは。それは本当に働いています。 –

+0

PHPExcel_Calculation :: getInstance($ sheet-> getParent()) - > clearCalculationCache(); – CrandellWS

関連する問題