[英]How to find out how many rows and columns to read from an Excel file with PHPExcel?
使用以下代碼,我可以使用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>';
$objPHPExcel->setActiveSheetIndex(0)->getHighestColumn();
和
$objPHPExcel->setActiveSheetIndex(0)->getHighestRow();
要么
$objPHPExcel->setActiveSheetIndex(0)->calculateWorksheetDimension();
它返回一個范圍作為字符串,如A1:AC2048
雖然尾隨空白行和列包含在這些行中。
編輯
或者您可以使用迭代器循環遍歷現有的行和列,以獲取工作表使用范圍內的每個單元格。 有關示例,請參閱生產分發中的/Tests/28iterator.php。 可以將迭代器設置為忽略空格。
從1.7.6及以下的PHPExcel
版本中,可以在不讀取整個文件的情況下獲取工作表信息:
$objReader = PHPExcel_IOFactory::createReader("Excel2007");
$worksheetData = $objReader->listWorksheetInfo($uploadedfile);
$totalRows = $worksheetData[0]['totalRows'];
$totalColumns = $worksheetData[0]['totalColumns'];
與迭代所有行(列)相比,您可以執行更少的單元格讀取。
就我而言,第一列是商品的SKU,它是強制性的。
如果你期望文件有很多行,在我的情況下它可以是10萬行或更多,我正在讀取每10 000行的第一列的值。
如果單元A10000不為空,請閱讀A20000,依此類推。
這樣,對於具有100 000行的文件,我需要對單個單元格進行最多10次讀取,以確定文件結束的10 000行的哪個段。
例如,假設它在30 000到40 000行之間。
現在從上面的值得到平均值--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,依此類推。
按照@ nikolay上面的回答思考,我決定將每行的第一個單元格強制執行。 這樣,我只是先查看每一行的每個單元格,找出實際有多少行數據,具體取決於第一行。
$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;
我不認為你能做到這一點,你必須從1000開始循環並向后循環,直到你擊中第一個非空白單元格,這將是你的最后一行或列。
您可以編寫一個宏來在excel中執行此操作,這可能有所幫助,但我不知道您是否可以使用PHPExcel執行它。
$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>
```
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.