2012-11-14 2 views
3

내 코드는 getFormattedValue() 메서드를 사용하여 데이터를 PHP으로 가져옵니다. 여기 "숫자가 텍스트로 저장된".XLS 파일을 구문 분석하는 PHPExcel은 #VALUE를 반환합니다.

은 열 D에서 "텍스트로 저장된 번호"와 .XLS의 문제 부분이다 : 그것은 제안으로 내가 번호, Excel에서 문제를 해결하는 경우

Excel cells contains next values: D7 -> 0,43; E7 -> =D7*1,2; F7 -> =E7*11,2; 
getFormattedValue() returns:   0,43;  #VALUE!;   #VALUE!; 
getCalculatedValue() also returns  0,43;  #VALUE!;   #VALUE!; 
getValue() returns     0,43;  D7*1.2;   E7*11.2; 

. 다음 getFormattedValue() 잘 작동합니다. 하지만 xls이 잘못되었다는 것을 고객에게 말할 수는 없습니다 ...

PHPExcel을 Excel처럼 사용할 수 있습니까? 아니면이 작업을 수행하는 다른 방법 일 수도 있습니다.

도와 주셔서 감사합니다.

--- EDIT 1 ---

Basicly는 마크 베이커의 대답 코멘트입니다.

.xls 파일의 변경 내용이 포함되지 않은 솔루션을 찾고 싶습니다. 어떤 구조가 될지 모르지만, 문제가있는 셀 등은 어디입니까?

PHPExcel에서 해당 셀을 인식 할 수있는 방법이 있습니까? 어쩌면 MS Excel이 그렇게 할 수 있을까요? 아니면 우리가 할 수있는 방법을 찾으십시오.

나는 그 자체로 셀 값을 나누려고하는 것에 대해 생각하고 우리가 1을 얻으면 숫자 셀을 생각한다. AND \ OR는 수학 계산에 포함 된 셀을 찾습니다. 내 뜻을 더 잘 이해하기 위해 셀 E7에 D7 * 1,2가 포함되어 있습니다. 그래서 우리는 확인할 수 있습니다 - D7 숫자입니까? 그런 것.

현재로서는이 문제에 대한 해결책이 없습니다 ... 그래서 도움이 될 것입니다.

답변

2

열 E와 F의 셀에서 값을 가져 오기 전에 D 열의 문자열 값을 유효한 숫자 (쉼표가 아닌 소수점 사용)로 변환해야합니다. 문제가있는 셀이 항상 같은 열 (또는 적어도 예측 가능)을 사용하면 통합 문서를로드 할 때 셀 바인더를 사용하여이 변환을 처리 할 수 ​​있습니다.

편집

당신은 같은 바인더 뭔가 만들 필요 것 :

class PHPExcel_Cell_AdvancedValueBinder 
    extends PHPExcel_Cell_DefaultValueBinder 
    implements PHPExcel_Cell_IValueBinder 
{ 
    public function bindValue(PHPExcel_Cell $cell, $value = null) 
    { 

     // sanitize UTF-8 strings 
     if (is_string($value)) { 
      $value = PHPExcel_Shared_String::SanitizeUTF8($value); 
     } 

     // Find out data type 
     $dataType = parent::dataTypeForValue($value); 

     if ($dataType === PHPExcel_Cell_DataType::TYPE_STRING && 
      !$value instanceof PHPExcel_RichText) { 
      if (preg_match('/^\d+,\d+$/', $value)) { 
       list($w, $d) = explode(',', $value); 
       $value = (float) $w . '.' . $d; 
       $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC); 
       return true; 
      } 
     } 

     // Not bound yet? Use parent... 
     return parent::bindValue($cell, $value); 
    } 
} 
+0

쉼표 소수 구분은 문제가되지 않습니다. 나는 노력했다. 그리고 셀 바인더는 사용하지 않지만 어떤 셀에는 사용할 수 있습니까? (편집 1을 읽으십시오). 또한 Mark, 계산 엔진이 셀을 인식하는 클래스 또는 파일을 가리킬 수 있습니까? 나는이 시간까지 그것을 발견하기에 PHP가별로 좋지 않다. 감사합니다. – ChAnger

+0

정말 고마워요! 해결책이별로 좋지는 않지만 작동합니다! – ChAnger

관련 문제