phpexcel如何讀和寫大於26列的excel3

主要運用到PHPExcel_Cell類的兩個方法

1讀取excel大於26列時.

PHPExcel_Cell::columnIndexFromString($highestColumm)://由列名轉化爲列索引數字 'A->0,Z->25'

1>計算出總列數
$highestColumm = $sheet->getHighestColumn(); // 獲得最多的列數,返回列名的大寫字母  如 'AB','F'等
2>計算出列對應的索引
$end_index     = PHPExcel_Cell::columnIndexFromString($highestColumm);//由列名轉爲列數('AB'->28)

$PHPExcel      = $reader->load($file_path_root . '/' . $file_name);//文件路徑加載文件名
        $sheet         = $PHPExcel->getSheet(0);
        $highestRow    = $sheet->getHighestRow(); // 取得總行數
        $highestColumm = $sheet->getHighestColumn(); // 取得總列數
        $end_index     = PHPExcel_Cell::columnIndexFromString($highestColumm);//由列名轉爲列數('AB'->28)

        $titles  = array();
        $content = array();
        /** 循環讀取每個單元格的數據 */
        for ($row = 1; $row <= $highestRow; $row++) {
            for ($column = 0; $column < $end_index; $column++) {
                $col_name = PHPExcel_Cell::stringFromColumnIndex($column);//由列數反轉列名(0->'A')
                $value    = mb_convert_encoding($sheet->getCell($col_name . $row)->getValue(), 'gbk', 'utf8');//轉碼
                if ($row == 1) {
                    //獲取表頭
                    $titles[] = preg_replace('/\s/', '', $value);
                } else {
                    if ($sheet->getCell($col_name . $row)->getDataType() == PHPExcel_Cell_DataType::TYPE_NUMERIC) {
                        //數字類型時,三位精度標準來比較該數是否在0,1之間,轉換爲百分數,保留一位小數
                        if (bccomp(floatval($value), floatval('1'), 3) == -1 && bccomp(floatval($value), floatval('0'), 3) == 1) {
                            $value = sprintf("%01.1f", $value * 100) . '%';
                        }
                    }
                    $content[$row][$column] = preg_replace('/\s/', '', $value);
                }
            }
        }
ps:

上傳excel時,如果沒有讀寫權限,可以寫到tmp目錄下,這個目錄下一般都是有讀寫權限的.

2寫大於26列的excel

$title_col = PHPExcel_Cell::stringFromColumnIndex($k);//標題行列名,由列索引反轉列名(0->'A')
</pre><pre name="code" class="php"><pre name="code" class="php">foreach($titles as $k =>$t)
{
       $title_col = PHPExcel_Cell::stringFromColumnIndex($k);//標題行列名,由列索引反轉列名(0->'A')
       $this->_objPHPExcel->getActiveSheet()->getColumnDimension($title_col)->setWidth(12);
       $this->_objPHPExcel->setActiveSheetIndex()->getStyle($title_col."1")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
       $this->_objPHPExcel->getActiveSheet()->setCellValue($title_col."1",iconv('GBK','UTF-8//IGNORE',$t));//標題行
}

3讀取excel百分號時自動轉化爲了小數

處理單元格數據時,如果有百分號小數會自動轉爲小數,處理時需要判斷單元格數據類型,因爲初步認定只有百分數是小數,其餘各列不存在小數.故處理結果:
判斷數據類型爲數字,其餘幾種類型都在 PHPExcel_Cell_DataType類中:

/* Data types */
    const TYPE_STRING2  = 'str';
    const TYPE_STRING   = 's';
    const TYPE_FORMULA  = 'f';
    const TYPE_NUMERIC  = 'n';
    const TYPE_BOOL     = 'b';
    const TYPE_NULL     = 'null';
    const TYPE_INLINE   = 'inlineStr';
    const TYPE_ERROR    = 'e';
if ($sheet->getCell($col_name . $row)->getDataType() == PHPExcel_Cell_DataType::TYPE_NUMERIC) {
                        //數字類型時,三位精度標準來比較該數是否在0,1之間,轉換爲百分數,保留一位小數
                        if (bccomp(floatval($value), floatval('1'), 3) == -1 && bccomp(floatval($value), floatval('0'), 3) == 1) {
                            $value = sprintf("%01.1f", $value * 100) . '%';
                        }
}

判斷浮點數是否在0-1之間(三位精度),然後組合成百分數即可:
$value = sprintf("%01.1f", $value * 100) . '%';







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章