<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 依賴庫 大名鼎鼎的phpexcel <http://phpexcel.codeplex.com> ## 效果 ![](https://box.kancloud.cn/2015-11-28_56597975de34b.png) ![](https://box.kancloud.cn/2015-11-28_565979760cca9.png) ![](https://box.kancloud.cn/2015-11-28_565979761f10f.png) ![](https://box.kancloud.cn/2015-11-28_5659797636177.png) ![](https://box.kancloud.cn/2015-11-28_565979764a158.png) 是用方法就是后臺初始化report數據庫后,然后自己建好數據表。 然后新建模板->上傳一個excel模板,指定好查詢的數據,和填充的開始項。然后數據隨便后臺操作數據庫。前臺就是把excel報表顯示輸出來即可。 感謝寫好這個系統的吳學海同學。其實數據填充那步相當于excel軟件導入的數據源。 這套模板管理系統支持多子excel和對應多數據源。組合起來不是特別復雜的excel報表都能滿足。 像第一個簽到模板,我的excel模板![](https://box.kancloud.cn/2015-11-28_56597976593e4.png),excel中的豎線自己設格式。 然后我的數據源,![](https://box.kancloud.cn/2015-11-28_565979766671d.png) 就是序列化字段里的那個 select name,time from sign limit 10。然后開始位置是每行的第一個單元格德位置如 A2 表示第二行第一列。 要更完善的話,就是數據源支持選api就更好了。配置最好用json 可讀性更高 ## 實現 隨書項目yang_book/examples/excel里。 我們只看excel的相關代碼: 前臺具體顯示某一個模板的excel ~~~ /** * 查詢數據庫填充excel并展示為html。 * @throws \PHPExcel_Exception * @throws \PHPExcel_Reader_Exception * @throws \PHPExcel_Writer_Exception */ public function showReport(){ //是否導出 $export = I('export',0,'int'); $id = I('report_id',0,'int'); if(!$id){ $this->error('參數有誤'); } $reportInfo = M('report')->where(array('id'=>$id))->find(); //導入第三方類 import("Vendor.PHPExcel"); import("Vendor.PHPExcel.Reader.Excel2007"); import("Vendor.PHPExcel.Reader.Excel5"); import("Vendor.PHPExcel.Reader.HTML"); import("Vendor.PHPExcel.Writer.Excel2007"); import("Vendor.PHPExcel.Writer.CSV"); import("Vendor.PHPExcel.IOFactory"); $totalPHPExcel = []; $tempInfo = unserialize($reportInfo['tempinfo']); foreach($tempInfo as $k=>$va){ $PHPReader = new \PHPExcel_Reader_Excel2007(); if(!$PHPReader->canRead('./Uploads/template'.$va['path'])){ $PHPReader = new \PHPExcel_Reader_Excel5(); if(!$PHPReader->canRead('./Uploads/template'.$va['path'])){ $this->error('該excel模板無法讀取。請聯系管理員'); return ; } } //讀取模板 $PHPExcel = $PHPReader->load('./Uploads/template'.$va['path']); $currentSheet = $PHPExcel->getSheet(0); foreach($va['config'] as $cnf){ //根據配置信息,查詢數據 $sql = $cnf['sql']; $start_x = preg_split("/([a-zA-Z]+)/", $cnf['start_x'], 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); if(empty($sql)){ break; $this->error('sql錯誤'); } $data = M()->query($sql); //row坐標計數器 $i = 0; foreach($data as $v){ if(is_array($v) && !empty($v)){ $AZ = strtoupper($start_x[0]); //循環填充數據 foreach($v as $value){ $currentSheet->setCellValue($AZ.($start_x[1]+$i),$value); $objStyleA1 = $currentSheet->getStyle($AZ.($start_x[1]+$i)); $objAlignA1 = $objStyleA1->getAlignment(); $objAlignA1->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $AZ = $this->nextAZ($AZ); if(!$AZ){ $this->error('A-Z超值,請聯系管理員'); } } } $i++; } } if(!$export){ //顯示模板 $objWriteHTML =new \PHPExcel_Writer_HTML($PHPExcel); $objWriteHTML->save("php://output"); }else{ $objWrite = new \PHPExcel_Writer_Excel2007($PHPExcel); $objWrite->save ($k.'.xls'); $totalPHPExcel[] = $k.'.xls'; } } //excel文件導出,所有模板打包一起下載 if($export){ @unlink(iconv("UTF-8","gbk//TRANSLIT",$reportInfo['name'].'.zip')); $zip = new \ZipArchive(); if($zip->open(iconv("UTF-8","gbk//TRANSLIT",$reportInfo['name'].'.zip'),\ZipArchive::OVERWRITE) === true){ foreach($totalPHPExcel as $v){ $zip->addFile($v); } } $zip->close(); //下面是輸出下載; header ( "Cache-Control: max-age=0" ); header ( "Content-Description: File Transfer" ); header ( 'Content-disposition: attachment; filename=' . basename (iconv("UTF-8","gbk//TRANSLIT",$reportInfo['name'].'.zip')) ); // 文件名 header ( "Content-Type: application/zip" ); // zip格式的 header ( "Content-Transfer-Encoding: binary" ); header ( 'Content-Length: ' . filesize (iconv("UTF-8","gbk//TRANSLIT",$reportInfo['name'].'.zip') ) ); // 告訴瀏覽器,文件大小 @readfile ( iconv("UTF-8","gbk//TRANSLIT",$reportInfo['name'].'.zip'));//輸出文件; } } ~~~ 類私有方法nextAZ: ~~~ /** * 返回下一個字母 * @param $currAZ * @return bool */ private function nextAZ($currAZ){ $defaultAZ = array( 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' ); $countLength = count($currAZ); if($countLength > 1){ //TODO:大于1位未實現 substr($currAZ,-1,1); return false; }else{ if($currAZ != 'Z'){ $index = array_search($currAZ,$defaultAZ); return $defaultAZ[$index+1]; }else{ //TODO:超過Z未實現 return false; } } } ~~~ 大家具體看看 主要是用了excel的打開模板`$PHPReader->load`、遍歷填值`$currentSheet->setCellValue($AZ.($start_x[1]+$i),$value);` 還有下載文件和壓縮下載 ## 參考 <http://www.seo0395.com/archives-211>介紹的比較全,英文不好的可以看看,好的直接看官方文檔 <https://github.com/PHPOffice/PHPExcel/wiki/User%20Documentation>
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看