如何找出使用PHPExcel从Excel文件读取多less行和列?

使用下面的代码,我可以使用PHPExcel从Excel文件中读取单元格。

我目前手动定义要读取的行数和列数。

有没有一种方式,PHPExcel可以告诉我有多less行和列我必须读取工作表中的所有数据,例如,即使一些行和列都​​留空了?

$file_name = htmlentities($_POST['file_name']); $sheet_name = htmlentities($_POST['sheet_name']); $number_of_columns = htmlentities($_POST['number_of_columns']); $number_of_rows = htmlentities($_POST['number_of_rows']); $objReader = PHPExcel_IOFactory::createReaderForFile("data/" . $file_name); $objReader->setLoadSheetsOnly(array($sheet_name)); $objReader->setReadDataOnly(true); $objPHPExcel = $objReader->load("data/" . $file_name); echo '<table border="1">'; for ($row = 1; $row < $number_of_rows; $row++) { echo '<tr>'; for ($column = 0; $column < $number_of_columns; $column++) { $value = $objPHPExcel->setActiveSheetIndex(0)->getCellByColumnAndRow($column, $row)->getValue(); echo '<td>'; echo $value . '&nbsp;'; echo '</td>'; } echo '</tr>'; } echo '</table>'; 

解:

谢谢,马克,这里有这些function的完整解决scheme:

 $file_name = htmlentities($_POST['file_name']); $sheet_name = htmlentities($_POST['sheet_name']); $number_of_columns = htmlentities($_POST['number_of_columns']); $number_of_rows = htmlentities($_POST['number_of_rows']); $objReader = PHPExcel_IOFactory::createReaderForFile("data/" . $file_name); $objReader->setLoadSheetsOnly(array($sheet_name)); $objReader->setReadDataOnly(true); $objPHPExcel = $objReader->load("data/" . $file_name); $highestColumm = $objPHPExcel->setActiveSheetIndex(0)->getHighestColumn(); $highestRow = $objPHPExcel->setActiveSheetIndex(0)->getHighestRow(); echo 'getHighestColumn() = [' . $highestColumm . ']<br/>'; echo 'getHighestRow() = [' . $highestRow . ']<br/>'; echo '<table border="1">'; foreach ($objPHPExcel->setActiveSheetIndex(0)->getRowIterator() as $row) { $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(false); echo '<tr>'; foreach ($cellIterator as $cell) { if (!is_null($cell)) { $value = $cell->getCalculatedValue(); echo '<td>'; echo $value . '&nbsp;'; echo '</td>'; } } echo '</tr>'; } echo '</table>'; 

替代文字

 $objPHPExcel->setActiveSheetIndex(0)->getHighestColumn(); 

 $objPHPExcel->setActiveSheetIndex(0)->getHighestRow(); 

要么

 $objPHPExcel->setActiveSheetIndex(0)->calculateWorksheetDimension(); 

它返回一个范围如A1:AC2048的string

尽pipe后面的空白行和列都包含在这些中。

编辑

或者你可以使用迭代器遍历现有的行和列来获取工作表使用范围内的每个单元格。 以生产发布中的/Tests/28iterator.php为例。 迭代器可以设置为忽略空白。

从1.7.6及以下的PHPExcel版本中,可以在不读取整个文件的情况下获取工作表信息:

 $objReader = PHPExcel_IOFactory::createReader("Excel2007"); $worksheetData = $objReader->listWorksheetInfo($uploadedfile); $totalRows = $worksheetData[0]['totalRows']; $totalColumns = $worksheetData[0]['totalColumns']; 

你可以做更less的单元格读取比所有的行(列)。

在我的情况下,第一列是项目的SKU,它是强制性的。

如果你期望有许多行的文件,在我的情况下,它可以是10万行或更多,我正在读取每10000行第一列的值。

如果单元格A10000不为空,请阅读A20000等。

这样,对于一个有100000行的文件,我需要一个单元的最多10次读取来决定文件结束的10 000行中的哪一段。

例如,假设它在3万到4万行之间。

现在得到35000以上的平均值。读一个单元格A35000将进一步缩小到5000行。 下一个平均(和单细胞读)将进一步缩小到2500等。

如果您知道哪个10 000段是文件的结尾,那么大概需要13-14个单元格读取。 如果您希望具有100 000行的文件最多添加10个单元格,以确定10 000行的确切段。 这意味着对于具有100 000行的文件,最大约25个单元读取。

编辑:如果你期望空行 – 例如,多读一点单元格,例如,如果你期望不超过1个后续空行,每次读2个后续单元格,例如A10000和A10001,其中一个应该是非空的,或者你超出了文件的结尾。 如果期望不超过2个随后的空行,请每次读取3个单元格,例如A10000,A10001和A10002等等。

我不认为你可以做到这一点,你将不得不从1000开始循环,直到你打到第一个非空白单元格,这将是你的最后一行或一列。

你可以写一个macros来做到这一点在Excel中可能会帮助,但我不知道你是否可以用PHPExcel执行它。

遵循@ nikolay从上面的答案的思考,我决定把每一行的第一个单元格强制性的。 这样,我只是先查看每行的每个单元格,找出有多less行实际上有数据,这取决于第一行。

 $uploadedfile = \PHPExcel_IOFactory::load(Yii::getAlias('uploads').'/'.$file_location); $uploadeddata = $uploadedfile->getActiveSheet()->toArray(null, true, true, true); //we need to first know how many rows actually have data //my first two rows have column labels, so i start with the third row. $row_count = 3; // read through the data and see how many rows actually have data //the idea is that for every row, the first cell should be mandatory... //if we find one that is not, we stop there... do { $row_count++; } while($uploadeddata[$row_count]['A'] == "null"); //get the actual number of rows with data, removing the column labels $actual_rows = $row_count-3;