用phpexcel将table 报表转换成excel形式(依赖我的php-library库) * * 用PHP读取数据库并生成xls报表太复麻烦了(尤其是含有联表查询、单元格合并) * 相当于再做一个跟web页面显示一致同样复杂
* * 用PHP读取数据库并生成xls报表太复麻烦了(尤其是含有联表查询、单元格合并) * 相当于再做一个跟web页面显示一致同样复杂的统计,于是诞生了本页面, * 本页面的核心思想是,先用html表格将数据渲染成报表,在点击导出时直接 * 用js将表格的头部、表格体的所有单元格数据(包括其colspan、rowspan属性)异步POST传递给本页面 * 保存数据后,再跳转至本页面 * -- Javascript code like this: * function export_func(){ //点击导出按钮的事件处理函数(处理的表格ID:data-table) * var col_set= new Array(); * var data_set= new Array(); * $("#data-table thead tr").each(function(){ * var col_row = new Array(); * $("th", this).each(function(){ * col_row.push([$(this).html(), $(this).attr('colspan'), $(this).attr('rowspan')]); * }) * col_set.push(col_row); * }); * $("#data-table tbody tr").each(function(){ * var data_row = new Array(); * $("td",this).each(function(){ * data_row.push([$(this).html(), $(this).attr('colspan'), $(this).attr('rowspan')]); * }); * data_set.push(data_row); * }); * $.post("form-convert-xls.php",{col:$.toJSON(col_set),data:$.toJSON(data_set)},function(data){ * if(data=='ok'){ * window.location="form-convert-xls.php"; * } * }) * } * -- Html code like this: * * * *列标题 *列标题 *列标题 * * * * * 单元格内容 * 单元格内容 * 单元格内容 * * * 单元格内容 * 单元格内容 * 单元格内容 * * * */ include '../../library/initialize.php'; $loader = Master::singleton(); $pdo = $loader['PDOMySQLDriver']; $func = $loader['Utility']; $store = $loader['Session']; $loginfo = $store->get('loginfo', array()); if (empty($loginfo)) { $func->redirect(PROJECT_URL.'backend/login.php'); } if($_SERVER['REQUEST_METHOD']=='POST'){ $store->set('xls',array('cols'=>$_POST['cols'], 'data'=>$_POST['data']), 'download'); exit('ok'); } $xls_data=$store->get('xls', null, 'download'); if($xls_data==null){ $func->jsAlert('数据导出失败!', -1); } // $loader->contain('PHPExcel.php',VENDOR_PATH.'phpoffice'.DS.'phpexcel'.DS.'Classes'); $phpexcel = new PHPExcel(); $phpexcel->setActiveSheetIndex(0); $activeSheet = $phpexcel->getActiveSheet(); $cols=json_decode($xls_data['cols']); $data=json_decode($xls_data['data']); $row_index = 1; //$rowspan_set=array(); foreach ($cols as $row) { $col_index = PHPExcel_Cell::columnIndexFromString('A'); foreach($row as $cell_val){ //此列之前有行合并,需要跳过 while($rowspan_set[$col_index]!=0){ --$rowspan_set[$col_index]; ++$col_index; //跳过该列 } $col_letter = PHPExcel_Cell::stringFromColumnIndex($col_index-1); $activeSheet->setCellValue($col_letter . $row_index, strip_tags($cell_val[0])); //此列需要行合并 if($cell_val[2]!=null){ $rowspan_set[$col_index] = $rowspan_set[$col_index] + $cell_val[2]-1; $activeSheet->mergeCells($col_letter . $row_index . ':' . $col_letter . ($row_index+$cell_val[2]-1)); } //此行需要列合并 if($cell_val[1]!=null){ $col_index += ($cell_val[1]-1); //修改列索引下次循环跳过合并 $col_letter_next = PHPExcel_Cell::stringFromColumnIndex($col_index-1); $activeSheet->mergeCells($col_letter . $row_index . ':' . $col_letter_next . $row_index); } $col_index++; } while($rowspan_set[$col_index]!=0){ --$rowspan_set[$col_index]; ++$col_index; //跳过该列 } ++$row_index; } // //$rowspan_set=array(); foreach ($data as $row) { $col_index = PHPExcel_Cell::columnIndexFromString('A'); foreach($row as $cell_val){ //此列之前有行合并,需要跳过 while($rowspan_set[$col_index]!=0){ --$rowspan_set[$col_index]; ++$col_index; //跳过该列 } $col_letter = PHPExcel_Cell::stringFromColumnIndex($col_index-1); $activeSheet->setCellValue($col_letter . $row_index, strip_tags($cell_val[0])); //此列需要行合并 if($cell_val[2]!=null){ $rowspan_set[$col_index] = $rowspan_set[$col_index] + $cell_val[2]-1; $activeSheet->mergeCells($col_letter . $row_index . ':' . $col_letter . ($row_index+$cell_val[2]-1)); } //此行需要列合并 if($cell_val[1]!=null){ $col_index += ($cell_val[1]-1); //修改列索引下次循环跳过合并 $col_letter_next = PHPExcel_Cell::stringFromColumnIndex($col_index-1); $activeSheet->mergeCells($col_letter . $row_index . ':' . $col_letter_next . $row_index); } $col_index++; } while($rowspan_set[$col_index]!=0){ --$rowspan_set[$col_index]; ++$col_index; //跳过该列 } ++$row_index; } $col_letter = PHPExcel_Cell::stringFromColumnIndex($col_index-2); //此处注意绘制边框的边界范围 $activeSheet->getStyle('A1:'.$col_letter . ($row_index-1))->applyFromArray( array( 'borders' => array( 'allborders' => array( //'style' => PHPExcel_Style_Border::BORDER_THICK,//边框是粗的 'style' => PHPExcel_Style_Border::BORDER_THIN,//细边框 //'color' => array('argb' => 'FFFF0000'), ), ), )); // $objWriter = PHPExcel_IOFactory::createWriter($phpexcel, 'Excel5'); 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/octet-stream"); header("Content-Type: application/download"); header("Content-Disposition: attachment;filename=data_{$dest}_export.xls"); header("Content-Transfer-Encoding: binary"); $objWriter->save("php://output");