phpエクスポートexcelエクスポート複数sheet

12567 ワード

由来:会社は試験会社で、試験システムを作っています.試験には試験場(例:第二試験場)があります.(例:西北工业大学の试験地点)では、表にサインして表を贴ることです.私がしなければならないのは运営をもっと楽にすることです.例えば、运営は各试験地点の下の试験场のサイン表と贴り表を导くことです.プログラムを書いて、導出した署名表、貼表は試験点に従って1つのexcelを導出することができて、このexcel内は複数のsheetで、1つの試験場は1つのsheetで、しかも各sheetはすべてフォーマットがあって(背景の色、大きさ、合併、中央など)、直接複数のsheetを印刷することができて、人力のコストを極めて下げて、以下は私がした複数のsheetを導出するステップです
複数のsheetをエクスポートして、ネット上でいくつかのコードを見て、具体的なことを話す人は少ないでしょう.あるいは、私たちのビジネスロジックと関係があるでしょう.だから、自分でまとめて、コードを貼りました.
 
    /**
     * @param $cands                            
     * @param $site_name                    
     * @param $other_data                   
     * @param string $sheet_page              sheet  
     * @param string $room_num               
     * @param string $excel                     
     * @return PHPExcel|string|void
     *   :                excel,      excel,     sheet,  sheet      ,        
     *   :                    ,      ,      phpexcel  ,         
     *       sheet phpexcel  new  ,      ,                    ,    
     * phpexcel  ,          ,           ,                sheet,  
     */
    public function table_export($cands, $site_name, $other_data, $sheet_page='', $room_num='', $excel='')
    {
        if( !empty($cands && $site_name && $other_data) ) {
            //    
            if ($sheet_page == 0) {
                $excel = new PHPExcel();
                $first_sheet_title = $other_data['room_name'].'   ';
                $this->sheet_more_sign($cands, $other_data, $excel);
                $excel->setActiveSheetIndex(0);
                $excel->getActiveSheet()->setTitle($first_sheet_title);
            }

            if ($sheet_page > 0) {
                $first_sheet_title = $other_data['room_name'].'   ';
                $excel->createSheet();
                $excel->setActiveSheetIndex($sheet_page);
                $this->sheet_more_sign($cands, $other_data, $excel);
                $excel->getActiveSheet()->setTitle($first_sheet_title);
            }

            if ($sheet_page == 0 && $sheet_page+1 != $room_num) {
                return $excel;
            }

            if ($sheet_page+1 == $room_num) {
                $write = PHPExcel_IOFactory::createWriter($excel,'Excel2007');
                $file_path = config_item('export_cand');
                $tmpfile = $file_path.'/room_sign_export'.time().'.xlsx';
                $write->save($tmpfile);
                header('Content-Type: application/vnd.ms-excel; charset=utf-8');
                header('Cache-Control: max-age=0');
                header('Content-Disposition:attachment;filename="'.$site_name.'     .xlsx"');
                echo file_get_contents($tmpfile);
                @unlink($tmpfile);
                if ($sheet_page == 0) {
                    return $excel;
                }
            }
        }else{
            return;
        }
    }

これはmodelレイヤがデータを埋め込み、excelコードをエクスポートします.phpexcelが複数のsheetをエクスポートする最も主要な点は、次のとおりです.
$excel = new PHPExcel();

この$excelは最大1回しかnewできませんが、後で1つのループで、中に$excelが必要な場合は、このオブジェクトを返して、帰ってきたらテープに持ってきて、このようにエクスポートするのはやはりループが最初に最初のphpexcelオブジェクトで、2つのsheetしか導き出せません.そしてsheetの名前がworkです.ssなど、具体的に何を忘れたのか、自分で踏んだ穴を記録して、コントローラコードを貼ります.
    public function export_site_sign( $proj_id = '', $exam_id = '', $site_id = '' )
    {
        if ( empty( $proj_id ) || empty( $exam_id ) ) {
            $this->show_msg_js( '    ,   ','/main' );
            return;
        }
        $site_name = $this->site_model->get_value_by_id( $site_id, 'site_name' );
        $proj_name = $this->proj_model->get_value_by_id( $proj_id, 'proj_name');
        $exam_name = $this->exam_model->get_value_by_id( $exam_id, 'exam_name');
        $begin_time = $this->exam_model->get_value_by_id( $exam_id, 'exam_begintime');
        $end_time = $this->exam_model->get_value_by_id( $exam_id, 'exam_endtime');
        $last_time = ($end_time - $begin_time)/60;
        $time_show = date( 'Y-m-d H:i', $begin_time ) . '-' . date( 'H:i', $end_time ) . ' ( ' . $last_time . '   )';
        $site_rooms = $this->exam_room_model->get_site_room( $proj_id, $exam_id, $site_id );
        //     、   
        $room_num = count($site_rooms);
        foreach ($site_rooms as $key => $value) {
            $site_name = $this->site_model->get_value_by_id( $value['site_id'], 'site_name' );
            $cands = $this->cand_model->get_cands_by_room( array( 'proj_id' => $proj_id, 'exam_id' => $exam_id, 'room_id' => $value['room_id']));
            $other_data = array('proj_name' => $proj_name,'time_show' => $time_show,'room_name' => $value['room_name'],'room_addr' => $value['room_addr'],'exam_name' =>$exam_name,'proj_id' => $proj_id );
            if ($key == 0) {
                $excelobj = $this->export_model->table_export( $cands,$site_name,$other_data, $key, $room_num);
            } else {
                $this->export_model->table_export( $cands,$site_name,$other_data, $key, $room_num, $excelobj);
            }
        }
    }

簡単に説明します:$keyはループ開始で、excel内のsheetにデータを転送する回数は、0から始まります.$excelobjは最初のsheetを生成してから戻ってくるphpexcelの対象です.戻ってこないと、再びループ入力データを再生成してsheetを再生成すると問題があり、定数を書いても具体的にどの点なのかは判定できません.だからそうするしかない.
$excel->createSheet();
$excel->setActiveSheetIndex($sheet_page);
$this->sheet_more_sign($cands, $other_data, $excel);
$excel->getActiveSheet()->setTitle($first_sheet_title);
          sheet
     n sheet  ,( :          sheet,$sheet_page   2)
           n sheet  
      n sheet    
  :           

以上、当社のビジネスロジックのまとめに基づいて複数のsheetを導出したので、自分で忘れておきますが、他の人に役に立つともっといいので、csvを導出する上で注意しなければならないことをまとめました.
私たちは試験会社で、いくつかの答案用紙は問答問題の形式で存在して、このように彼らの答えを導出する時、いくつかの英語のカンマ、改行、スペースなどの特殊な文字は処理する必要があります.エクスポートされた文字列のカンマが英語の場合、中国語のカンマに変換する必要があります.そうしないと、エクスポートされた文字列はexcelの内部に2行表示されます.できるだけ文字列の前にtつまりよく使うtableキーをつなぎ合わせます.身分証明書番号をエクスポートすると、これを付けないと意味が正しく表示されません.携帯電話番号は大丈夫です.何度も穴を踏んで出てきます.
 
最後に、excelにデータを出力するコードを一部貼り付けます.
    public function sheet_more_sign($cands, $other_data, $excel)
    {
        //Excel   ,
        $letter = array('A','B','C','D','E','F');
        $excel->getActiveSheet()->mergeCells('A1:F1');      //  
        $excel->getActiveSheet()->mergeCells('A2:F2');      //  
        $excel->getActiveSheet()->mergeCells('A3:F3');      //  
        $excel->getActiveSheet()->setCellValue("$letter[0]1", $other_data['proj_name']);
        $excel->getActiveSheet()->getStyle('A4:F4')->applyFromArray(
           array(
                'font' => array (
                    'bold' => false
                ),
            )
        );
        $styleThinBlackBorderOutline = array(
            'borders' => array(
                'allborders' => array( //      
                    'style' => \PHPExcel_Style_Border::BORDER_THIN //   thick
                ),

            ),
        );
        $excel->getDefaultStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $excel->getDefaultStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
        $excel->getActiveSheet()->getStyle('A4:F4')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
        $excel->getActiveSheet()->getStyle('A4:F4')->getFill()->getStartColor()->setARGB('FFFF00');
        $excel->getDefaultStyle()->getFont()->setName( '    ');
        $excel->getActiveSheet()->getStyle('A1')->getFont()->setName('    ')->setSize(18); //  

        $excel->getActiveSheet()->getStyle('A4:F4')->getFont()->setName('    ')->setSize(11)->setBold(true); //  

        $excel->getActiveSheet()->setCellValue("$letter[0]2", '    :'. $other_data['room_name'] . '       :' . $other_data['room_addr'])->getStyle("$letter[0]2")->getAlignment()->setWrapText(true);

        $excel->getActiveSheet()->setCellValue("$letter[0]3", '    :'. $other_data['time_show'] );
        //    
        $tableheader = array('  ','  ','  ','    ','    ','  ');
        //      
        for($i=0;$igetActiveSheet()->setCellValue("$letter[$i]4","$tableheader[$i]");
        }
        //     
        $top = 1/2.54;//phpexcel          ,         
        $left = 1.5/2.54;
        $excel->getActiveSheet()->getPageMargins()->setTop($top);
        $excel->getActiveSheet()->getPageMargins()->setRight($top);
        $excel->getActiveSheet()->getPageMargins()->setLeft($left);
        $excel->getActiveSheet()->getPageMargins()->setBottom($top);
        $excel->getActiveSheet()->getPageSetup()->setHorizontalCentered(true);//  
        $excel->getActiveSheet()->getRowDimension('1')->setRowHeight(30);
        $excel->getActiveSheet()->getRowDimension('2')->setRowHeight(32);
        $excel->getActiveSheet()->getRowDimension('3')->setRowHeight(25);
        $excel->getActiveSheet()->getRowDimension('4')->setRowHeight(25);
        $excel->getActiveSheet()->getColumnDimension('A')->setAutoSize(false);
        $excel->getActiveSheet()->getColumnDimension('A')->setWidth(5);
        $excel->getActiveSheet()->getColumnDimension('B')->setAutoSize(false);
        $excel->getActiveSheet()->getColumnDimension('B')->setWidth(15);
        $excel->getActiveSheet()->getColumnDimension('C')->setAutoSize(false);
        $excel->getActiveSheet()->getColumnDimension('C')->setWidth(6);
        $excel->getActiveSheet()->getColumnDimension('D')->setAutoSize(false);
        $excel->getActiveSheet()->getColumnDimension('D')->setWidth(17);
        $excel->getActiveSheet()->getColumnDimension('E')->setAutoSize(false);
        $excel->getActiveSheet()->getColumnDimension('E')->setWidth(24);
        $excel->getActiveSheet()->getColumnDimension('F')->setAutoSize(false);
        $excel->getActiveSheet()->getColumnDimension('F')->setWidth(16);
        $excel->getActiveSheet()->getHeaderFooter()->setOddFooter('&R  &P     &N  ');  //  
        //      
        for( $i = 5; $i <= count($cands) + 4; $i++){
            $j = 0;
            foreach($cands[$i-5] as $key => $value){
                $excel->getActiveSheet()->getRowDimension("$i")->setRowHeight(24);
                //$excel->getActiveSheet()->getStyle('A1'.':F'."$i")->getBorders()->getAllBorders()->setBorderStyle(\PHPExcel_Style_Border::BORDER_THIN);
                if($j == 2){
                    switch ( $value ) {
                        case '1':
                            $excel->getActiveSheet()->setCellValue("$letter[$j]$i"," ");
                            break;
                        default:
                            $excel->getActiveSheet()->setCellValue("$letter[$j]$i"," ");
                            break;
                    }
                }else{
                    //     
                    $excel->getActiveSheet()->setCellValueExplicit("$letter[$j]$i","$value", PHPExcel_Cell_DataType::TYPE_STRING);
                }
                $j++;
            }
        }
        $extra = count($cands)+4;
        $excel->getActiveSheet()->getStyle("A1:F".$extra)->applyFromArray($styleThinBlackBorderOutline);
    }

ここには幅、背景色、フォントの太さ、セルのマージなどが設定されています.