使用以下代码,我可以使用PHPExcel读取Excel文件中的单元格。
我目前手动定义要读取的行数和列数。
有没有办法让PHPExcel可以告诉我为了从工作表中获取所有数据,我必须阅读多少行和列,例如即使某些行和列留空了吗?
$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 . ' ';
echo '</td>';
}
echo '</tr>';
}
echo '</table>';
谢谢,Mark,这是这些功能的完整解决方案:
$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 . ' ';
echo '</td>';
}
}
echo '</tr>';
}
echo '</table>';
答案 0 :(得分:69)
$objPHPExcel->setActiveSheetIndex(0)->getHighestColumn();
和
$objPHPExcel->setActiveSheetIndex(0)->getHighestRow();
或
$objPHPExcel->setActiveSheetIndex(0)->calculateWorksheetDimension();
返回一个范围作为字符串,如A1:AC2048
虽然尾随空行和列包含在这些行中。
修改强>
或者您可以使用迭代器遍历现有的行和列,以获取工作表使用范围内的每个单元格。有关示例,请参阅生产分发中的/Tests/28iterator.php。可以将迭代器设置为忽略空格。
答案 1 :(得分:9)
从1.7.6及以下的PHPExcel
版本中,可以在不读取整个文件的情况下获取工作表信息:
$objReader = PHPExcel_IOFactory::createReader("Excel2007");
$worksheetData = $objReader->listWorksheetInfo($uploadedfile);
$totalRows = $worksheetData[0]['totalRows'];
$totalColumns = $worksheetData[0]['totalColumns'];
答案 2 :(得分:1)
您可以比使用所有行(列)更少的单元格读取。
在我的情况下,第一列是商品的SKU,它是强制性的。
如果您希望文件有很多行,在我的情况下它可以是100 000行或更多,我正在读取每10 000行第一列的值。
如果单元格A10000不为空,请阅读A20000,依此类推。
这样,对于一个包含100 000行的文件,我需要对单个单元格进行最多10次读取,以确定文件结束的10 000行的哪一段。
例如,假设它在30 000到40 000行之间。
现在从上面的值获得平均值--35 000.一次读取单元格A35000将进一步将范围缩小到5000行。接下来的平均值(以及单个单元格读取)将进一步将范围缩小到2500,依此类推。
如果您知道哪个10 000个段是文件的末尾,则大约需要大约13-14个单元格读取。如果您希望文件具有100 000行,则添加最多10个单元格读取以确定10 000行的确切段。这意味着对于具有100 000行的文件,最多大约25个单元读取。
编辑:如果您期望空行 - 只读取更多单元格,例如,如果您预计不会有超过1个后续空行,则每次读取2个后续单元格,例如A10000和A10001,其中一个应该是非空的,或者你超出了文件的末尾。如果您预计不会有超过2个空行,请每次读取3个单元格,例如A10000,A10001和A10002,依此类推。
答案 3 :(得分:0)
我认为你不能这样做,你必须从1000开始循环,然后向后循环,直到你击中第一个非空白单元格,这将是你的最后一行或列。
您可以在excel中编写一个宏来执行此操作,这可能有所帮助,但我不知道您是否可以使用PHPExcel执行它。
答案 4 :(得分:0)
在@nikolay's根据上面的回答思考后,我决定强制每行的第一个单元格。这样,我只是先查看每一行的每个单元格,找出实际拥有数据的行数,具体取决于第一行。
$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;
答案 5 :(得分:0)
$spreadsheet = new Spreadsheet();
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('xls');
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load('file location here');
$worksheet = $spreadsheet->getActiveSheet();
foreach ($worksheet->getRowIterator() AS $row) {
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(FALSE); // This loops through all cells,
$cells = [];
foreach ($cellIterator as $cell) {
$cells[] = $cell->getValue();
}
$rows[] = $cells;
}
//blade html
<table class="table table-hover">
<thead>
<tr>
@foreach($rows[0] as $heading)
<th>{{$heading}}</th>
@endforeach
</tr>
</thead>
<tbody>
@foreach($rows as $key=>$val)
@if(!($key == 0))
<tr>
@foreach($val as $value)
<td>{{$value}}</td>
@endforeach
</tr>
@endif
@endforeach
</tbody>
</table>
```