web-dev-qa-db-ja.com

PHPExcelでExcelファイルから読み取る行と列の数を調べる方法は?

次のコードを使用すると、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>';

alt text

42
Edward Tanguay
$objPHPExcel->setActiveSheetIndex(0)->getHighestColumn();

そして

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

または

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

a1:AC2048のような文字列として範囲を返します

ただし、これらには末尾の空白の行と列が含まれます。

[〜#〜] edit [〜#〜]

または、イテレータを使用して既存の行と列をループ処理し、ワークシートの使用範囲内の各セルを取得できます。例については、製品版の/Tests/28iterator.phpを参照してください。イテレータは、空白を無視するように設定できます。

69
Mark Baker

1.7.6以前のPHPExcelバージョンから、ファイル全体を読み取らずにワークシート情報を取得できます。

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

すべての行(列)を作成するよりもはるかに少ないセル読み取りを行うことができます。

私の場合、最初の列はアイテムのSKUであり、必須です。

多くの行を含むファイルを期待している場合、私の場合は100 000行以上になる可能性があり、1 000行ごとに最初の列の値を読み取ります。

セルA10000が空でない場合は、A20000などを読み取ります。

このように、100,000行のファイルの場合、10000行のどのセグメントでファイルが終了するかを判断するには、単一セルの最大10回の読み取りが必要です。

たとえば、30 000〜40 000行であるとします。

ここで、上記の値-35 000から平均を取得します。セルA35000を1回読み取ると、スコープがさらに5000行に減少します。次の平均(および単一セルの読み取り)では、スコープがさらに2500に縮小されます。

どの10,000セグメントがファイルの終わりであるかを知っている場合、およそ13〜14個の単一セルの読み取りが必要になります。 100,000行のファイルが予想される場合、最大10個のセル読み取りを追加して、10000行の正確なセグメントを決定します。これは、100,000行のファイルに対して最大約25セルの読み取りを意味します。

編集:空の行が必要な場合-もう少し多くのセルを読み取ります。たとえば、結果として空の行が1つしかないと予想される場合は、毎回2つの結果のセルを読み取ります(A10000およびA10001など)空でないか、ファイルの終わりを超えている必要があります。結果として空行が2行以下になると予想される場合は、A30000、A10001、A10002など、毎回3つのセルを読み取ります。

1
Nikolay Ivanov

@ 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;
0
The Sammie
$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>
```
0
vijay kanaujia

私はあなたがそれを行うことができるとは思わない、あなたは最初の非空白のセルを打つまでそれをあなたの最後の行または列になるまで、例えば1000から始めてループしなければならないだろう。

Excelでこれを行うマクロを作成できますが、PHPExcelで実行できるかどうかはわかりません。

0
fire