2010-11-21 137 views
7

我正在嘗試閱讀一些帶有phpexcel的excel文件,它迄今爲止工作正常。儘管phpexcel有點太聰明,並且從我的單元格中刪除了前導零。我想我需要告訴它將單元格視爲文本字符串,而不是一般或數字。但我失敗了。我甚至發現有關這個stackoverflow的線程,但建議的解決方案根本無法工作。phpexcel中的單元格格式

下面是我正在處理的內容的一小部分。

foreach(@$objWorksheet->getRowIterator() as $row){ 
    $cellIterator = $row->getCellIterator(); 
    $cellIterator->setIterateOnlyExistingCells(false); 
    foreach($cellIterator as $cell){ 
     #$objWorksheet->getStyle($cell->getCoordinate())->getNumberFormat()->setFormatCode('@'); 
     $cells[] = $cell->getValue(); 
    } 
} 

有什麼想法嗎?我不想只限於閱讀數字內容,因爲我無法控制用戶上傳的內容。把所有東西都當作字符串來處理是完美的

/peder

回答

3

的的getValue()方法不正是它應該做的,沒有巧言令色。它返回存儲在單元格中的實際值。如果該單元格包含整數,則返回一個整數;如果單元格包含一個浮點數,則返回一個浮點數;如果它包含一個字符串,它將返回一個字符串。聰明的是將該值作爲格式化的字符串返回(如果合適的話,前導零),那麼您需要使用一種非常不同的方法,並將單元格格式應用於返回的值。

foreach($cellIterator as $cell){ 
    $cells[] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getValue(), 
       $objPHPExcel->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode() 
    ); 
} 

,或者如果單元格包含公式:

foreach($cellIterator as $cell){ 
    $cells[] = PHPExcel_Style_NumberFormat::toFormattedString($cell->getCalculatedValue(), 
       $objPHPExcel->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode() 
    ); 
} 

請不要使用@嘗試和抑制錯誤。 PHPExcel拋出異常,你真的應該想要捕獲這些異常。

但是,對於您在做什麼,您可能會考慮工作表的toArray()方法,該方法將返回工作表中所有單元格值的數組。

+0

感謝

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_StringValueBinder()); 

PHPExcel_IOFactory::createReader('CSV'),所有的好東西。但 - 應用這個,並試圖解析一個csv文件,但它似乎像我所有的細胞被格式化爲「一般」。文件看起來像這樣:http://dl.dropbox.com/u/252696/csv.csv這是csv格式的限制,如果是這樣 - 如果phpexcel剛剛返回單元格的內容不會更好? – fjallstrom 2010-11-21 18:42:23

+0

如果PHPExcel只是返回「字符串」,它將失去從Excel工作表中處理數據的全部功能。如果您只是想將CSV文件讀取到數組中,那麼最好的選擇是PHP內置的csv處理函數,如fgetcsv() – 2010-11-21 19:55:57

+0

如果希望PHPExcel將CSV文件的輸入視爲字符串而不是數字,則您可以編寫一個簡單的「讀取過濾器」,確保文件中的所有輸入都被視爲字符串。 – 2010-11-21 19:57:15

1

有比那些迭代器更容易的東西。對於這樣做的foreach您還可以使用指定者的方法,例如:

$active_sheet = $objPHPExcel -> getActiveSheet(); 
foreach($active_sheet -> toArray() as $row_n => $row){ 
foreach($row as $cell_n => $cell){ 
    // operations here 
} 
} 

工作得很好,我也似乎快於迭代器,就像馬克·貝克傷心。

在處理CVS時,我看到一個主要問題:用戶必須從Excel導出數據,這個過程可能會讓大多數人感到困惑。這就是爲什麼我搜索解決方案直接從Excel導入。

在使用這些迭代器對我來說有些奇怪,我真的沒有深入瞭解它。在使用迭代器訪問數據時,它返回少量(在我的情況下是2到4)序列化對象並從中獲取數據是噩夢。

1

沒有提供解決方案的工作對我來說(CSV導入與PHPExcel v1.7.5) 我通過設定值粘結劑解決這樣的: