2014-08-27 2 views
4

setReadDataOnly (true)를 사용하여 XLS 파일을 읽었습니다. 읽은 개체는 새 Excel 파일로 다시 저장됩니다. 불행히도 일부 셀 값은 잘못 계산됩니다 (이 값은 부분합 수식이있는 셀보다 계산 버그와 관련이 있습니다). 올바르게 이해하면 XLS 파일의 각 셀에 수식과 함께 미리 계산 된 값이 포함됩니다. 파일을 읽을 때 수식을 계산하지 않으려 고 PHPExcel을 얻을 수 있다면 (대신에 미리 계산 된 값을 사용하는 것만으로)이 문제를 해결할 수 있습니다. setReadDataOnly (true) 또는 setPreCalculateFormulas (false)가이 작업을 수행 할 수 있다고 생각했지만 그렇지 않습니다. 마크의 설명에PHPExcel을 사용하여 Excel 파일을 읽을 때 계산 된 값 무시

추가 정보를 원하시면

덕분에, 나는 내 경우 getCalculatedValue()와 getOldCalculatedValue()의 차이를 조사 하였다.)

$excel_reader = PHPExcel_IOFactory::createReaderForFile($file); 
$excel_reader->setReadDataOnly(true); 
$excel_obj_temp = $excel_reader->load($file); 

// Test one of the values in question 
$excel_obj_temp->setActiveSheetIndexByName("Form 11"); 
error_log("val:".$excel_obj_temp->getActiveSheet()->getCell("E36")->getCalculatedValue()); 
error_log("old_val:".$excel_obj_temp->getActiveSheet()->getCell("E36")->getOldCalculatedValue()); 

$new_file = "new_generated_name"; 

$excel_writer = new PHPExcel_Writer_Excel5($excel_obj_temp); 
$excel_writer->setPreCalculateFormulas(false); 
$excel_writer->save($unprotected_file); 

에서 파일 읽기, 그것은 getOldCalculatedValue에 올바른 값을 보여줍니다 (: 나는에서 파일을 읽은 다음 다시 쓰는하려면 다음 코드를 사용합니다. 그런 다음 파일 setPreCalculateFormulas (false)없이 저장하고 파일을 다시 읽으면 getCalculatedValue()와 getOldCalculatedValue()가 모두 동일한 (잘못된) 결과를 반환합니다. 이 값이 나는 대신 setPreCalculateFormulas로 (false)를 파일 을 저장하면 올바른 방법이 보인다 (

그러나 (false)를 setPreCalculateFormulas를 설정하지 않으면 저장에 다시 계산됩니다 마크의 설명과 함께 인라인) 파일을 다시 읽으면 getCalculatedValue()가 잘못된 결과를 반환하고 getOldCalculatedValue()가 0을 반환합니다.

저장 한 후 캐시 된 값이 지워지는 이유는 무엇입니까? setPreCalculateFormulas (false)와 함께 적용해야하는 다른 설정이 있습니까?

답변

4

PHPExcel 아니요 스프레드 시트 파일을로드 할 때 값을 계산하십시오. 셀의 getCalculatedValue() 또는 getFormattedValue() 메서드를 명시 적으로 호출하거나 (Writer의 setPreCalculateFormulas(false)을 사용하지 않는 한) 저장할 때 기본적으로 셀 값을 계산하는 경우에만 셀 값을 계산합니다 ... 자동 맞춤 열을 사용하면 해당 열의 모든 셀에 대해 저장시 다시 계산해야하지만 다른 설정의.

MS Excel은 일반적으로 스프레드 시트의 모든 수식 셀에 대해 계산 된 값을 저장합니다 (명시 적으로 사용하지 않는 경우 제외).이 값은 셀의 getOldCalculatedValue() 메서드를 사용하여 PHPExcel에서 읽을 수 있습니다.

+0

피드백 표 주셔서 감사합니다. 몇 가지 세부 정보를 추가했습니다. getOldCalculatedValue()가 0을 반환하는 이유는 무엇입니까? – BOENDAGGER

+0

PHPExcel은 파일을 저장할 때 getOldCalculatedValue() 값을 저장하지 않으므로 PHPExcel로 파일을 저장 한 다음 다시로드하면 해당 값이 더 이상 존재하지 않고 단순히 기본값 0을 얻습니다 –

관련 문제