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

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

7 голосов
/ 21 ноября 2010

Я пытаюсь прочитать некоторые файлы 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();
    }
}

есть идеи? я не хочу ограничивать себя только чтением числового контента, так как я не имею никакого контроля над тем, что будут загружать пользователи. все было бы прекрасно, если бы струны были идеальными.

/ Педер

Ответы [ 3 ]

3 голосов
/ 21 ноября 2010

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

1 голос
/ 13 августа 2012

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

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_StringValueBinder());

до PHPExcel_IOFactory::createReader('CSV')

1 голос
/ 22 сентября 2011

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

...