форматы ячеек в phpexcel

Я пытаюсь прочитать некоторые файлы excel с phpexcel, который пока работает нормально. однако phpexcel слишком умен и удаляет ведущие нули из моих клеток. я думаю, мне нужно сказать ему, чтобы рассматривать ячейку как текстовую строку, а не как общее или число. но я потерпел неудачу. я даже нашел темы на stackoverflow об этом, но предлагаемые решения просто не работали.

ниже приведен фрагмент материала, над которым я работаю.

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() делает именно то, что он должен делать, без пытается быть умным. Возвращает фактическое значение, хранящееся в ячейке. Если эта ячейка содержит целое число, она возвращает целое число; если ячейка содержит float, она возвращает float; если она содержит строку, она возвращает строку. Будучи умным, возвращает это значение в виде форматированной строки (с ведущими нулями, если это необходимо), то вам нужно использовать довольно другой метод и применить форматирование ячейки к возвращаемое значение.

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() листа, который вернет массив всех значений ячеек на листе.


есть что-то проще, чем итераторы. Для выполнения foreach вы также можете использовать метод toArray, например:

$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) сериализованных объектов, и получение данных из них было кошмаром.


ни одно из предоставленных решений не работало для меня (импорт CSV с PHPExcel v1.7.5) я решил установить значение binder следующим образом:

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_StringValueBinder());

до PHPExcel_IOFactory::createReader('CSV')