關(guān)于Excel讀取寫入導(dǎo)出

1,常見問題

由于PHPExcel沒有命名空間,因此導(dǎo)入是個(gè)問題讯蒲,解決方案之一如下:

將PHPExcel放在vendor下邊沿盅,在Class類名引入頭部

require_once '../vendor/phpoffice/phpexcel/Classes/PHPExcel.php';

2把篓,讀取Excel的內(nèi)容

public function readPriceXsl($xsl_path)
{
        $inputFileName = substr($xsl_path,1);           // 移除路徑的/
        // $inputFileType = \PHPExcel_IOFactory::identify($inputFileName);          // 此處是phpspreadsheet的使用方法
        // $objReader = \PHPExcel_IOFactory::createReader($inputFileType);          // 此處是phpspreadsheet的使用方法
        $inputFileType = IOFactory::identify($inputFileName);
        $objReader = IOFactory::createReader($inputFileType);
        $objPHPExcel = $objReader->load($inputFileName);

        $h1 = $objPHPExcel->getSheet(0)->getCell('H1')->getFormattedValue();
        $data = [
            'h1' => $h1,  //版本
        ];
        return $data;
}

說明:
getSheet(0) 讀取第一個(gè)sheet表格

getActiveSheet() 讀取第當(dāng)前活躍的sheet表格

getValue() 獲取單元格的Text文本(公式本身)

getFormattedValue() 獲取單元格的的值(公式計(jì)算后的值)

3,將內(nèi)容寫入Excel

public function savePath1TOPath3($path1,$ver_id)
{
        // 讀取
        $data = $this->readNewPriceXsl($path1);

        $path = 'uploads/sample.xls';  // 讀取模板腰涧,替換值
        $inputFileName = $path;
        
        // 此處使用的是phpspreadsheet
        $inputFileType = \PHPExcel_IOFactory::identify($inputFileName);
        $objReader = \PHPExcel_IOFactory::createReader($inputFileType);
        $objPHPExcel = $objReader->load($inputFileName);
        
        $objPHPExcel->getActiveSheet()->setCellValue('A2',$data['a2']);
        
        $objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);
        $path3 = 'uploads/price_excel/' . time() . '.xls';
        $result = $objWriter->save($path3);         // 保存新的文件
        // 將路徑保存到數(shù)據(jù)庫
        $verModel = new VersionModel();
        $result = $verModel->save(['path3' => '/'.$path3],['id' => $ver_id]);
        if ($result === false){
            throw new Exception($verModel->getError());
        }
        return $data;
}

說明:
setCellValue 設(shè)置單元格的值

$objWriter->save() 保存excel韧掩,如果帶上參數(shù),即保存新文件窖铡,否則原文件

3疗锐,Excel的導(dǎo)出

public function export()
{
        //創(chuàng)建對(duì)象
        $excel = new \PHPExcel();

        $data = array();
        foreach ($infos as $key=>$val) {
            if ($infos[$key]['path3']){  // 有的話獲取數(shù)據(jù),循環(huán)遍歷每個(gè)報(bào)價(jià)表的數(shù)據(jù)
             
                $data[] = $this->readPriceExcel($infos[$key]['path3']);
                $a3 = Cache::get('pro_name_'.$infos[$key]['path3']);
            }
        }
        $a3 = Cache::get('pro_name_');

        error_reporting(E_ALL);
        ini_set('display_errors', TRUE);
        ini_set('display_startup_errors', TRUE);
        
        // 進(jìn)行一系列操作
        
        // 激活當(dāng)前表
        $excel->setActiveSheetIndex();
        ob_end_clean();//清除緩沖區(qū),避免亂碼

        // 創(chuàng)建Excel輸入對(duì)象
        $write = new \PHPExcel_Writer_Excel5($excel);
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
        header("Content-Type:application/force-download");
        header("Content-Type:application/vnd.ms-execl");
        header("Content-Type:application/octet-stream");
        header("Content-Type:application/download");;
        header('Content-Disposition:attachment;filename=' . (strtr('總報(bào)價(jià)表', array(' ' => '_')) . '_' . time()) . '.xls');
        header("Content-Transfer-Encoding:binary");
        $write->save('php://output');
}

說明:
$write->save('php://output') 將Excel輸出到瀏覽器

4费彼,Excel導(dǎo)出常見樣式設(shè)置

設(shè)置水平居中

$excel->getActiveSheet()->getStyle('A2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

設(shè)置垂直居中

$excel->getActiveSheet()->getStyle('A1:H3')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);

設(shè)置單元格行高

$excel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(25);

設(shè)置單元格長度

$excel->getActiveSheet()->getColumnDimension('B')->setWidth(18);

設(shè)置字體樣式

$excel->getActiveSheet()->getStyle('B1')->getFont()->setName('宋體')->setSize(15)->setBold(true);

設(shè)置字體顏色
$excel->getActiveSheet()->getStyle('A3')->getFont()->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_RED);

合并單元格
$excel->getActiveSheet()->mergeCells('C1:H1');

設(shè)置單元格邊框

$styleThinBlackBorderOutline = array(
    'borders' => array(
           'allborders' => array( //設(shè)置全部邊框
           'style' => \PHPExcel_Style_Border::BORDER_DASHED, //粗的是thick
           'color' => array ('argb' => 'FF000000'),
            ),
     ),
);
$excel->getActiveSheet()->getStyle("$a:$b")->applyFromArray($styleThinBlackBorderOutline);

設(shè)置換行

        $content = '三滑臊、付款方式:'.chr(10);  // chr(10)為換行
        $content .= '1.定金:合同簽訂三天內(nèi)支付合同總額的'.$arr[1].'%;'.chr(10);
        $content .= '2.設(shè)備發(fā)貨前支付合同總額的'.$arr[2].'%箍铲;'.chr(10);
        $content .= '3.設(shè)備移交使用一個(gè)月內(nèi)支付合同總額的'.$arr[3].'%雇卷;'.chr(10);
        $a = 'A'.($row3+1);
        $b = 'H'.($row3+5);
        $excel->getActiveSheet()->setCellValue('A'.($row3+1), $content);    // 設(shè)置內(nèi)容
        $excel->getActiveSheet()->mergeCells("$a:$b");  // 合并單元格
        $excel->getActiveSheet()->getStyle($a)->getAlignment()->setWrapText(true);  // 換行

5,Excel導(dǎo)出帶圖片

public function look_down()
{
        $data = Db::name('user')->select();

        // 導(dǎo)出Excel
        import("Org.Util.PHPExcel");
        import("Org.Util.PHPExcel.Worksheet.Drawing");      // 帶圖片的核心插件
        import("Org.Util.PHPExcel.Writer.Excel2007");
        $objPHPExcel = new \PHPExcel();

        $objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);
        $objActSheet = $objPHPExcel->getActiveSheet();

        // 標(biāo)題
        $objActSheet->setCellValue('A1', 'ID');
        $objActSheet->setCellValue('B1', '昵稱');
        $objActSheet->setCellValue('C1', '頭像');

        // 內(nèi)容
        foreach($data as $k=>$v){
            $k +=2;
            $objActSheet->setCellValue('A'.$k, $v['id']);
            $objActSheet->setCellValue('B'.$k, $v['nickname']);

            // 圖片生成
            $objDrawing[$k] = new \PHPExcel_Worksheet_Drawing();
            $image = './uploads/face/'.$v['head_img'];      // 請(qǐng)勿漏掉upload之前的./
            $objDrawing[$k]->setPath($image);
            // 設(shè)置寬度高度
            $objDrawing[$k]->setHeight(80);     // 圖片高度
            $objDrawing[$k]->setWidth(80);      // 圖片寬度
            /*設(shè)置圖片要插入的單元格*/
            $objDrawing[$k]->setCoordinates('C'.$k);
            // 圖片偏移距離
            $objDrawing[$k]->setOffsetX(12);
            $objDrawing[$k]->setOffsetY(12);
            $objDrawing[$k]->setWorksheet($objPHPExcel->getActiveSheet());

            // 表格高度
            $objActSheet->getRowDimension($k)->setRowHeight(80);
        }

        $fileName = '用戶表';
        $date = date("Y-m-d",time());
        $fileName .= "_{$date}.xls";
        $fileName = iconv("utf-8", "gb2312", $fileName);
        $objPHPExcel->setActiveSheetIndex(0);
        header('Content-Type: application/vnd.ms-excel');
        header("Content-Disposition: attachment;filename=\"$fileName\"");
        header('Cache-Control: max-age=0');
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output');        // 文件通過瀏覽器下載
}

6颠猴,注意事項(xiàng)

以下為本人踩過的Excel的坑关划,請(qǐng)留意

  • PHPExcel為國外插件,至今沒有中文文檔翘瓮;
  • PHPExcel已廢棄贮折,沒有再更新,功能上難免有一些bug资盅,建議使用phpspreadsheet调榄;
  • 無論是PHPExcel還是phpspreadsheet,都無法讀取引用的公式(INDIRECT)律姨;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末振峻,一起剝皮案震驚了整個(gè)濱河市择份,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烫堤,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸽斟,死亡現(xiàn)場離奇詭異拔创,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剩燥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門娇斑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來策添,“玉大人,你說我怎么就攤上這事毫缆∥ㄖ瘢” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵悔醋,是天一觀的道長摩窃。 經(jīng)常有香客問我,道長芬骄,這世上最難降的妖魔是什么猾愿? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮账阻,結(jié)果婚禮上蒂秘,老公的妹妹穿的比我還像新娘。我一直安慰自己淘太,他們只是感情好姻僧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒲牧,像睡著了一般撇贺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冰抢,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天松嘶,我揣著相機(jī)與錄音,去河邊找鬼挎扰。 笑死翠订,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遵倦。 我是一名探鬼主播尽超,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼梧躺!你這毒婦竟也來了似谁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巩踏,沒想到半個(gè)月后斜筐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛀缝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年顷链,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屈梁。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗤练,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出在讶,到底是詐尸還是另有隱情煞抬,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布构哺,位于F島的核電站革答,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏曙强。R本人自食惡果不足惜残拐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碟嘴。 院中可真熱鬧溪食,春花似錦、人聲如沸娜扇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雀瓢。三九已至枢析,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刃麸,已是汗流浹背醒叁。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫌蚤,地道東北人辐益。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓断傲,卻偏偏與公主長得像脱吱,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子认罩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355