2011年2月20日 星期日

PHPExcel - 如何設定儲存格代號

要設定儲存格的值,要先指定哪一格。
例如:
$sheet->getCell("A4")->setValueExplicit('123', PHPExcel_Cell_DataType::TYPE_STRING);

但是在產生 Excel 檔的時候,常常是用迴圈去產生。但是 A1 的 A 要怎麼處理呢?好麻煩,難道還要用 ASCII 碼,從 65 開始算起嗎?

其實儲存格的代號也可以用數字:
$sheet->getCellByColumnAndRow(0, 1)->setValueExplicit('123', PHPExcel_Cell_DataType::TYPE_STRING);

先是列,再來是行。列從 0 算起,行從 1 算起。
所以 (0,1) 是 A1

聽說也可以使用範圍:
$sheet->->getStyleByColumnAndRow(0,1,2,4)->applyFromArray($styleArray);
這樣就是在設定從左上 A1 到右下 C4 這一塊 4 x 3 區塊的樣式。

或是用這個函數轉換:
PHPExcel_Cell::stringFromColumnIndex($i)

例如:
$i = 0;
$letter = PHPExcel_Cell::stringFromColumnIndex($i); //$letter 就是 A
$cellname = $letter.'1'; //A1
然後再設定值
$sheet->setCellValue($cellname, '123');

-------------------------------------------------------------------------------

不過上面這些是後來剛剛才發現的。在這之前我已經幾個小時寫了一個轉換的函數了 =_="。
真蠢。

雖然用不到了,還是記錄一下:
<?php
$column_num=89;
$row_num = 5;
$letter = get_excel_cell_letter($column_num);
$cellname = $letter.$row_num;
echo $cellname;

function get_excel_cell_letter($n){
    $no[1] = $n%26; //第1個數字
    $no[2] = floor($n/26)%26; //第2個數字
    $no[3] = floor($n/676)%26; //第3個數字
    //echo ' 計算借位之前:'; print_r($no);
  
    //計算借位
    if(isset($no[1]) && $no[1] < 1){
        $no[1] += 26;
        if(isset($no[2])){
            $no[2] -= 1;
        }
    }
    if(isset($no[2]) && $no[2] < 1){
        $no[2] += 26;
        if(isset($no[3])){
            $no[3] -= 1;
        }
    }
  
    //換算成英文字母
    $letter[1] = chr(64+$no[1]);
    $full_letter = $letter[1];
    if($n > 26){
        $letter[2] = chr(64+$no[2]);
        $full_letter = $letter[2].$letter[1];
    }
    if($n > 702){
        $letter[3] = chr(64+$no[3]);
        $full_letter = $letter[3].$letter[2].$letter[1];
    }  
 
 return $full_letter;
}
?>

結果:

CK5

沒有留言:

張貼留言