45

使用以下代码,我可以使用 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 . '&nbsp;';
        echo '</td>';
    }
    echo '</tr>';
}
echo '</table>';

解决方案:

谢谢,马克,这是具有这些功能的完整解决方案:

$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>';

替代文字

4

6 回答 6

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

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

或者

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

它将范围作为字符串返回,例如 A1:AC2048

尽管其中包含尾随的空白行和列。

编辑

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

于 2010-12-30T12:31:49.060 回答
9

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

$objReader     = PHPExcel_IOFactory::createReader("Excel2007"); 
$worksheetData = $objReader->listWorksheetInfo($uploadedfile);
$totalRows     = $worksheetData[0]['totalRows'];
$totalColumns  = $worksheetData[0]['totalColumns'];
于 2015-07-16T09:56:07.220 回答
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,等等。

于 2014-04-16T08:39:59.030 回答
0

我不认为你能做到这一点,你必须从 1000 开始循环并倒退,直到你点击第一个非空白单元格,这将是你的最后一行或最后一列。

您可以在 excel 中编写一个宏来执行此操作,这可能会有所帮助,但我不知道您是否可以使用 PHPExcel 执行它。

于 2010-12-30T12:31:02.403 回答
0

遵循@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;
于 2016-02-13T01:16:56.730 回答
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>
```
于 2019-03-27T12:32:31.430 回答