3

PHPExcelを使い始めたばかりです。私の非常に大きなスプレッドシートは、メモリ全体にロードできません(メモリ障害)。ワークシートの必要な部分だけをロードするために、ドキュメントで提供されているMyReadFilterコードを使用しようとしていますが、コードは少し上にあり、誰かがそれを理解するのを手伝ってくれることを願っています。

PHPExcelのドキュメントから、関数は次のようになります。

class ReadFilter implements PHPExcel_Reader_IReadFilter 
    { 
    private $_startRow = 0; 
    private $_endRow   = 0; 
    private $_columns  = array(); 

    /**  Get the list of rows and columns to read  */ 
    public function __construct($startRow, $endRow, $columns) { 
        $this->_startRow = $startRow; 
        $this->_endRow   = $endRow; 
        $this->_columns  = $columns; 
        } 

    public function readCell($column, $row, $worksheetName = '') { 
    // Only read the rows and columns that were configured 
    if ($row >= $this->_startRow && $row <= $this->_endRow) { 
        if (in_array($column,$this->_columns)) { 
        return true; 
        } 
    } 
    return false; 
    } 
}   

次の行を使用してPHPExcelを呼び出しています

//  Get the selected Excel file, passed from form
$testFile = $_FILES['upload_test']['tmp_name'];     
//  Identify the file type of the selected file
$inputFileType = PHPExcel_IOFactory::identify($testFile);
//  Create a reader object of the correct file type 
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
//  Instantiate the filter class and apply it to the reader object
$filterSubset = new ReadFilter(1,1000,range('A','Z'));
$objReader->setReadFilter($filterSubset);       
//  Load the selected file into the reader
$objWorkbook = $objReader->load($testFile); 

次の構文を使用して、結果のワークシートオブジェクトからデータを取得しています。

$someValue= $objWorkbook->getSheet($idx)->getCell('B11')->getCalculatedValue();

他にも質問があると思いますが、最初の質問は関数の呼び出しに関するものです。上記の行を次のように変更した場合:

$filterSubset = new ReadFilter(1,1000,range('A','Z'));

に:

$filterSubset = new ReadFilter(1,1000,range('A','AA'));  //Last column changed

読み取り全体が失敗します。実際には、列Bから計算された値のみが必要ですが、その列には列ASまでの参照があるため、それらも読み取る必要があります。この関数を使用して過去の列Zを読み取る方法、または列を変更する方法を教えてもらえますか?理想的には、BからASに広がる約12列の内容を読むだけですが、それもわかりません。

助けてくれてありがとう。

4

2 に答える 2

2

range('A'、'AA)は有効な範囲ではありません... PHPの範囲関数はAAがZに続くとは想定していません。代わりに、PHPExcelのcolumnIndexFromString()およびstringFromColumnIndex()静的メソッドを使用して列番号を使用してみてください。 27をAAに、またはその逆に変換するPHPExcel_Cellクラス(ただし、基本値0または1に注意してください)。

于 2013-01-01T20:23:57.400 に答える
2

range('A','AA');無効です独自のカスタム範囲を作成してみてください

echo "<pre>";
print_r(xrange('AA', 'ZZ'));

使用した機能

function xrange($start, $end, $limit = 1000) {
    $l = array();
    while ($start !== $end && count($l) < $limit) {
        $l[] = $start;
        $start ++;
    }
    $l[] = $end;
    return $l;
}

ライブデモを見る

于 2013-01-01T21:04:35.720 に答える