2010-11-21 87 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) 我通过设定值粘结剂解决这样的: