2010-11-21 12 views
7

Próbuję odczytać niektóre pliki Excela za pomocą phpexcel, który działa do tej pory. phpexcel jest nieco zbyt sprytny i usuwa początkowe zera z moich komórek. Chyba muszę powiedzieć, aby traktować komórkę jako ciąg tekstowy, a nie jako ogólny lub numer. ale nie udało mi się. Nawet znalazłem wątki na temat stackoverflow, ale sugerowane rozwiązania po prostu nie działały.formaty komórek w phpexcel

Poniżej znajduje się urywek rzeczy, nad którymi pracuję.

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

jakiś pomysł? Nie chcę się ograniczać do czytania tylko treści numerycznych, ponieważ nie mam żadnej kontroli nad tym, co użytkownicy będą przesyłać. Traktowanie wszystkiego jak struny byłoby idealne.

/peder

Odpowiedz

3

Sposób getValue() robi dokładnie to co powinien zrobić, bez stara się być mądry. Zwraca rzeczywistą wartość przechowywaną w komórce. Jeśli ta komórka zawiera liczbę całkowitą, zwraca liczbę całkowitą; jeśli komórka zawiera float, zwraca wartość zmiennoprzecinkową; jeśli zawiera łańcuch, zwraca ciąg znaków. Ponieważ sprytnie zwraca tę wartość jako sformatowany ciąg znaków (w razie potrzeby z wiodącymi zerami), należy użyć raczej innej metody i zastosować formatowanie komórek do zwróconej wartości.

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

lub jeśli komórka zawiera formułę:

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

I proszę nie używać @ spróbować stłumić błędów. PHPExcel zgłasza wyjątki i naprawdę powinieneś je przechwycić.

Jednak dla tego, co robisz, możesz rozważyć metodę toArray() arkusza roboczego, która zwróci tablicę wszystkich wartości komórek w arkuszu.

+0

dzięki, wszystkie dobre rzeczy. ale - zastosował to i próbował przetworzyć plik CSV, ale wygląda na to, że wszystkie moje komórki są sformatowane jako "ogólne". plik wygląda następująco: http://dl.dropbox.com/u/252696/csv.csv jest to ograniczenie formatu csv, a jeśli tak - czy nie byłoby lepiej, gdyby phpexcel właśnie zwrócił zawartość komórek ? – fjallstrom

+0

Jeśli PHPExcel po prostu zwróci "ciągi znaków", straciłby całą zdolność przetwarzania danych z arkuszy programu Excel.Jeśli próbujesz po prostu odczytać plik CSV do tablicy, najlepszą opcją jest wbudowane funkcje obsługi CSV w PHP, takie jak fgetcsv() –

+0

Jeśli chcesz, aby PHPExcel traktował dane wejściowe z pliku CSV jako ciągi zamiast liczby, to możesz napisać prosty "filtr odczytu", który zapewnia, że ​​wszystkie dane wejściowe z pliku są traktowane jako ciągi. –

1

Jest coś łatwiejszego niż te Iteratory. Dla robi foreach Można również użyć metody ToArray, w przykładzie:

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

pracował dobrze dla mnie i również wydaje się być szybszy niż iteratory, podobnie jak Mark Baker smutny.

Podczas przetwarzania CVS widzę jeden główny problem: użytkownik musi wyeksportować dane z Excela i ten proces może być mylący dla większości z nich. Dlatego szukałem rozwiązania do importu prosto z Excela.

Używanie tych iteratorów jest dla mnie czymś dziwnym i naprawdę nie wdałem się w to zbyt wiele. Podczas uzyskiwania dostępu do danych za pomocą iteratora, zwraca kilka (od 2 do 4 w moim przypadku) serializowanych obiektów, a pobieranie danych z nich było koszmarem.

1

żaden z przewidzianych rozwiązań pracował dla mnie (import z CSV PHPExcel v1.7.5) i rozwiązane przez spoiwo wartości zadanej tak:

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_StringValueBinder()); 

przed PHPExcel_IOFactory::createReader('CSV')

Powiązane problemy