2017-03-14 124 views
0

我有下面的代碼,但是當我通過導入過程運行我的CSV時,我的前導零不見了。例如,我有一個數字字段,例如「0010」,但在它來自下面的代碼後,數字是「10」。有人有建議嗎?PHPexcel刪除前導零的問題

\t $objPHPExcel = new PHPExcel(); 
 
\t 
 
\t function ci_import($inputFileName){ 
 
\t \t 
 
\t \t \t //echo "calling....";exit; 
 
\t \t \t 
 
\t \t try { 
 
\t \t \t $inputFileType = PHPExcel_IOFactory::identify($inputFileName); 
 
\t \t \t $objReader = PHPExcel_IOFactory::createReader($inputFileType); 
 
\t \t \t $objPHPExcel = $objReader->load($inputFileName); 
 
\t \t } catch (Exception $e) { 
 
\t \t \t die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME) 
 
\t \t \t . '": ' . $e->getMessage()); 
 
\t \t } 
 
\t \t 
 
\t \t $sheets = count($objPHPExcel->getAllSheets()); 
 
\t \t //echo $sheets; 
 
\t \t //echo "<pre>"; 
 
\t \t $arr=array(); 
 
\t \t foreach($objPHPExcel->getAllSheets() as $sheet){ 
 
\t \t \t $title = $sheet->getTitle(); 
 
\t \t \t $arr[$title]=array(); 
 
\t \t \t $rows= array(); 
 
\t \t \t // fetch the data 
 
\t \t \t foreach ($sheet->getRowIterator() as $row) 
 
\t \t \t { 
 
\t \t \t \t $cols= array(); 
 
\t \t \t \t $cellIterator = $row->getCellIterator(); 
 
\t \t \t \t $cellIterator->setIterateOnlyExistingCells(false); // This loops all cells, 
 
\t \t \t \t foreach ($cellIterator as $cell) 
 
\t \t \t \t { 
 
\t \t \t \t \t $cols[]=$cell->getValue(); 
 
\t \t \t \t } 
 
\t \t \t \t $rows[] = $cols; 
 
\t \t \t } 
 
\t \t \t $arr[$title]=$rows; 
 
\t \t \t 
 
\t \t \t 
 
\t \t \t \t \t } 
 
\t \t 
 
\t \t return $arr; 
 
\t \t print_r($arr); 
 
\t \t 
 
\t }

回答

1

數字不具有前導零;但PHPExcel的CSV閱讀器會識別0010的值是數字,並將其轉換爲數字10,這是完全正確的,(僅供參考)正是MS Excel CSV閱讀器的功能。

如果要將此值作爲字符串處理,或者將其格式化爲具有前導零的4位數字,則需要創建一個自定義綁定程序,將其指定爲導入該值的規則。

class PHPExcel_Cell_MyValueBinder 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); 
     } 

     // Implement your own override logic 
     if (is_string($value) && $value[0] == '0') { 
      // Here, we're just enforcing that the value should be treated 
      // as a string, but we could convert it to a numeric and apply 
      // a format mask to the cell instead 
      $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING); 
      return true; 
     } 

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

爲避免自動裝載機出現任何問題,請在/ Classes/PHPExcel/Cell目錄中創建此目錄。否則,請爲該類指定您自己的非PHPExcel名稱,並確保它是獨立加載的。

然後,加載文件之前,表明您的自定義粘結劑應使用:

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_MyValueBinder());