作者 景龙
1 个管道 的构建 通过 耗费 23 秒

调试excel

... ... @@ -1779,6 +1779,8 @@ class CommonController extends RestBaseController
$user = $this->getUserById(['id'=>$res['uid']]);
if($user){
$arr['user_login'] = $user['user_login'];
}else{
$arr['user_login'] = '';
}
//甲方领导确认人
... ...
... ... @@ -106,4 +106,44 @@ class AdminCheckController extends AdminBaseController
->find();
return $res;
}
//导出数据
public function exportData(){
$param = $this->request->param();
$adminCommon = new AdminCommonController();
$adminExcel = new AdminExcelDataController();
$res_ins = $adminCommon->exportCheckList('check',$param,'t.*');
$arr_url = [];
$arr_time = [];
foreach($res_ins as $key=>$value){
$arr = $adminCommon->checkExportData($value);
$arr['status'] = $this->getStatus()[$value['status']];
//获取文件路径
$url = $adminExcel->checkExcelData($arr);
//按日导出
$arr_url[$key] = $url;
$arr_time[$key] = $arr['time'].'报表.xls';
}
$xlsName = '月检报表';
//解决zip中文文件名
$xlsName = $adminCommon->iconv_to_utf8($xlsName);
$filename = ROOT_PATH . 'public/upload/export/' . $xlsName . '.zip';
$adminCommon->zip($arr_url,$filename,$arr_time);
}
//检查是否有数据
public function checkData(){
$param = $this->request->param();
$adminCommon = new AdminCommonController();
$res_ins = $adminCommon->exportCheckList('check',$param,'t.id');
if($res_ins){
$adminCommon->apiResponse(1);
}else{
$adminCommon->apiResponse(0,'暂无数据');
}
}
}
... ...
... ... @@ -11,15 +11,12 @@
namespace app\portal\controller;
use api\home\controller\CommonController;
use cmf\controller\AdminBaseController;
use app\portal\model\InspectModel;
use think\Db;
use think\db\Query;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
use ZipArchive;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
//甲方巡检列表
class AdminCommonController extends AdminBaseController
{
... ... @@ -242,270 +239,6 @@ class AdminCommonController extends AdminBaseController
}
/*
* 导出表格适用于报表绘制表格
*/
public function send_export($arr){
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$xlsName = $arr['time'];
//设置sheet名称
$name = '报表';
$name = $this->iconv_to_utf8($name);
$sheet->setTitle($xlsName.$name);
//合并单元格
$sheet->mergeCells('B1:J1');
$sheet->mergeCells('B3:B4');
$sheet->mergeCells('B6:D6');
$sheet->mergeCells('B7:D7');
$sheet->mergeCells('C3:D3');
$sheet->mergeCells('C4:D4');
$sheet->mergeCells('F3:F4');
$sheet->mergeCells('G3:I3');
$sheet->mergeCells('G4:I4');
$spreadsheet->getDefaultStyle()->getFont()->setName('微软雅黑');//字体
//设置默认宽
$sheet->getDefaultColumnDimension()->setWidth(8);
//设置高度
$sheet->getRowDimension(1)->setRowHeight(45);
// $sheet->getRowDimension(2)->setRowHeight(55);
//***********************画出单元格边框*****************************
// $styleArray = [
// 'borders' => [
// 'outline' => [
// 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
// 'color' => ['argb' => 'FFFF0000'],
// ],
// ],
// ];
// $sheet->getStyle('A1:M26')->applyFromArray($styleArray);
//***********************画出单元格边框结束*****************************
//***********************背景填充颜色*****************************
$sheet->getStyle( 'A1:M8')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyle( 'A1:M8')->getFill()->getStartColor()->setRGB('222B35');//背景颜色
//***********************画出单元格边框结束*****************************
//标题
$sheet->setCellValue('B1', $arr['title']);
$sheet->getStyle('B1')->getFont()->setSize(18);//字体大小
$sheet->getStyle('B1')->getFont()->getColor()->setRGB('FFFFFF');//设置颜色为白色
$sheet->getStyle('B1')->getFont()->setBold(true);//字体加粗
//甲方logo
$imageA = $arr['a_company']['logo'];
if(@fopen($imageA , 'r' ) ) {
//这是一个坑,刚开始我把实例化图片类放在了循环外面,但是失败了,也就是每个图片都要实例化一次
$imageADrawing = new Drawing();
$imageADrawing->setPath($imageA);
// 设置图片的宽度
$imageADrawing->setResizeProportional(false);
$imageADrawing->setWidthAndHeight(40,40);
//图片显示在B3
$imageADrawing->setCoordinates('B3');
$imageADrawing->setWorksheet($sheet);
}
$sheet->getStyle('B3:G7')->getFont()->setSize(8);//字体大小
$sheet->getStyle('C3:G3')->getFont()->getColor()->setRGB('949494');//设置颜色为灰色
$sheet->getStyle('B6:G6')->getFont()->getColor()->setRGB('949494');//设置颜色为灰色
$sheet->getStyle('C4:G4')->getFont()->getColor()->setRGB('FFFFFF');//设置颜色为白色
$sheet->getStyle('B7:G7')->getFont()->getColor()->setRGB('FFFFFF');//设置颜色为白色
//甲方公司
$sheet->setCellValue('C3', '甲方公司');
//甲方公司名称
$sheet->setCellValue('C4', $arr['a_company']['company_name']);
//乙方logo
$imageB = $arr['b_company']['logo'];
if(@fopen($imageB , 'r' ) ) {
//这是一个坑,刚开始我把实例化图片类放在了循环外面,但是失败了,也就是每个图片都要实例化一次
$objDrawing = new Drawing();
$objDrawing->setPath($imageB);
// 设置图片的宽度
$objDrawing->setResizeProportional(false);
$objDrawing->setWidthAndHeight(40,40);
//图片显示在F3
$objDrawing->setCoordinates('F3');
$objDrawing->setWorksheet($sheet);
}
//乙方公司
$sheet->setCellValue('G3', '乙方公司');
//乙方公司名称
$sheet->setCellValue('G4', $arr['b_company']['company_name']);
//项目组
$sheet->setCellValue('B6', '项目组');
//项目组名称
$sheet->setCellValue('B7', $arr['group_name']);
//巡检日期
$sheet->setCellValue('E6', '巡检日期');
//巡检日期名称
$sheet->setCellValue('E7', $arr['create_time']);
//巡检状态
$sheet->setCellValue('G6', '巡检状态');
//巡检状态名称
$sheet->setCellValue('G7', $arr['inspect_status']);
//循环开始
$cols = 10;
$cells = ['C','E','G','I','K'];
foreach($arr['point'] as $value){
$cols += 0;
//巡检点名称
$sheet->setCellValue('B'.$cols, $value['point_name']);
$sheet->getStyle('B'.$cols)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
//获取图片个数
$length = count($value['images']);
$col = ceil($length/5);
for($i=0;$i<$col;$i++){
$col_i = $cols+$i;
$sheet->getRowDimension($col_i)->setRowHeight(105);
$sheet->mergeCells('C'.$col_i.':D'.$col_i);
$sheet->mergeCells('E'.$col_i.':F'.$col_i);
$sheet->mergeCells('G'.$col_i.':H'.$col_i);
$sheet->mergeCells('I'.$col_i.':J'.$col_i);
$sheet->mergeCells('K'.$col_i.':L'.$col_i);
$key = 0;
foreach($value['images'] as $k=>$image_value){
$pre = $i+4*$i;
$next = $i+1+4*($i+1);
if($k>=$pre && $k<$next){
//巡检图片
$image = $image_value['image_url'];
if(@fopen($image , 'r' ) ) {
//这是一个坑,刚开始我把实例化图片类放在了循环外面,但是失败了,也就是每个图片都要实例化一次
$obj = new Drawing();
$obj->setPath($image);
// 设置图片的宽度
$obj->setResizeProportional(false);
$obj->setWidthAndHeight(105,130);
//图片显示在F3
$obj->setCoordinates($cells[$key].$col_i);
$obj->setWorksheet($sheet);
}
$key++;
}
}
}
$cols += $col+1;
}
$sheet->getStyle( 'A9:M'.$cols)->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyle( 'A9:M'.$cols)->getFill()->getStartColor()->setRGB('F3F3F4');//背景颜色浅灰色
$objWrite = IOFactory::createWriter($spreadsheet, 'Xls');
//直接从浏览器中输出star
// header('pragma:public');
// header("Content-Disposition:attachment;filename=出货装箱单.xls");
// $objWrite->save('php://output');
// exit;
//直接从浏览器中输出end
$file_name = $xlsName.'.xls';
$files_url = ROOT_PATH . '/public/upload/export';
if(!is_dir($files_url)){
mkdir($files_url);
}
$file_url = ROOT_PATH . '/public/upload/export/'.$file_name;
$objWrite->save($file_url);
$sys = $this->getOperateSys();
if($sys == 'Linux'){
chmod($file_url, 0777);//适用于linux
}
//相对路径
$url = 'upload/export/'.$file_name;
return $url;
}
/*
* 导出表格适用于普通有规律的数据
* param xlsName:title名称
* param xlsCell:二维数据xlsCell = array(
array('id','序号'),
array('user_nickname','昵称'),
array('mobile','手机号'),
array('create_time','注册时间'),
array('last_login_time','最后登录时间'),
array('user_status','状态'),
);
* param xlsData:数据库数据
*/
public function exportExcel($xlsName,$xlsCell,$xlsData){
$topNumber = 1;//表头有几行占用
$starData = $topNumber+1;//数据开始行起
$cellKey = [
'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',
'AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM',
'AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ'
];
vendor("PHPExcel");
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle($xlsName);
//处理表头
foreach ($xlsCell as $k=>$v) {
$sheet->setCellValue($cellKey[$k].$topNumber, $v[1]);//设置表头数据
$sheet->getStyle($cellKey[$k].$topNumber)->getFont()->setBold(true);//设置是否加粗
}
//设置单元格居中显示
$styleArray = [
'alignment' => [
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
],
];
//表头居中
foreach ($xlsCell as $k2=>$v2) {
$sheet->getStyle($cellKey[$k2].'1')->applyFromArray($styleArray);
}
//处理数据
foreach ($xlsData as $k=>$v) {
foreach ($xlsCell as $k1=>$v1) {
//设置每列数据
$sheet->setCellValue($cellKey[$k1].($k+$starData), $v[$v1[0]]);
//每列宽度
$sheet->getColumnDimension($cellKey[$k1])->setWidth(30);
//设置居中显示
$sheet->getStyle($cellKey[$k1].($k+$starData))->applyFromArray($styleArray);
}
}
$file_name = $xlsName.'.xls';
// ob_end_clean();//清除缓冲区,避免乱码
// header('Content-Type: application/vnd.ms-excel');//告诉浏览器将要输出excel03文件
// header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告诉浏览器数据excel07文件
// header('Content-Disposition: attachment;filename='.$file_name);
// header('Cache-Control: max-age=0');
// $writer = new Xlsx($spreadsheet);
$writer = IOFactory::createWriter($spreadsheet, 'Xls'); //按照指定格式生成Excel文件
// $writer->save('php://output');直接输入到浏览器下载
//绝对路径,不存在则创建目录
$files_url = ROOT_PATH . '/public/upload/export';
if(!is_dir($files_url)){
mkdir($files_url);
}
$file_url = ROOT_PATH . '/public/upload/export/'.$file_name;
$writer->save($file_url);
//相对路径
$url = 'upload/export/'.$file_name;
return $url;
}
/*
* 添加文件路径到压缩包中
* param files:可以为二维数组
* array=>[
... ... @@ -602,6 +335,7 @@ class AdminCommonController extends AdminBaseController
$zipName=iconv('UTF-8','GB2312',$zipName);
}
//下载zip
header("Cache-Control: public");//任何情况下都可以得到资源参考:https://blog.csdn.net/u012375924/article/details/82806617
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename='.basename($zipName)); //文件名
... ... @@ -838,4 +572,158 @@ class AdminCommonController extends AdminBaseController
return $os_str;
}
//获取导出(月检,培训,演习)列表
public function exportCheckList($table,$param,$field){
$res_ins = Db::name($table)
->alias('t')
->join('project p','t.project_id = p.id','LEFT')
->where(function (Query $query) use ($param,$table){
if (!empty($param['name'])) {
$keyword = $param['name'];
$query->where('p.name', 'like', "%$keyword%");
}
$startTime = empty($param['start_time']) ? 0 : strtotime($param['start_time']);
$endTime = empty($param['end_time']) ? 0 : strtotime($param['end_time']);
if (!empty($startTime)) {
if($table == 'check'){
$query->where('t.ins_m_time', '>=', $startTime);
}else if($table == 'train'){
$query->where('t.train_time', '>=', $startTime);
}else{
$query->where('t.exercise_time', '>=', $startTime);
}
}
if (!empty($endTime)) {
if($table == 'check'){
$query->where('t.ins_m_time', '<=', $endTime);
}else if($table == 'train'){
$query->where('t.train_time', '<=', $endTime);
}else{
$query->where('t.exercise_time', '<=', $endTime);
}
}
})
->field($field)
->select()->toArray();
return $res_ins;
}
//导出月检报表详情
public function checkExportData($res){
$arr = [];
//甲乙方logo,名称,报表名称
$company = $this->getCompanyName($res['project_id']);
if($company){
$arr['a_company'] = $company['a_company'];
$arr['b_company'] = $company['b_company'];
$arr['title'] = $company['title'];
}
//月检人员(乙方项目组)
$arr['group_name'] = $this->getBUserByProject($res['project_id'],'id,b_sid',1);
//月检时间
$arr['ins_m_time'] = date('Y/m/d',$res['ins_m_time']);
$arr['time'] = date('Y-m-d',$res['ins_m_time']);
//月检地点
$arr['address'] = $res['address'];
//月检备注
$arr['remark'] = $res['remark'];
//月检(乙方发起人)
$user = $this->getUserById(['id'=>$res['uid']]);
if($user){
$arr['user_login'] = $user['user_login'];
}else{
$arr['user_login'] = '';
}
//甲方领导确认人
$leader_user = $this->getUserById(['id'=>$res['a_leader']]);
if($leader_user){
$arr['a_leader_user'] = $leader_user['user_login'];
}else{
$arr['a_leader_user'] = '';
}
//乙方确认完成人
$finish_user = $this->getUserById(['id'=>$res['finish_uid']]);
if($finish_user){
$arr['confirm_user'] = $finish_user['user_login'];
}else{
$arr['confirm_user'] = '';
}
//月检工期及验收完成时间
if($res['finish_time']){
$arr['finish_time'] = $res['finish_time'];
//培训
$arr['check_period'] = $this->getPeriod($res['finish_time'],$res['ins_m_time']);
}else{
//验收完成时间
$arr['finish_time'] = '';
//月检工期
$arr['check_period'] = '';
}
//月检图片
if($res['images']){
$images = $this->exportUrl($res['images']);
$arr1 = $this->getDayImages($images);
$arr['images'] = $arr1;
}else{
$arr['images'] = [];
}
//确认图片
if($res['confirm_images']){
$images = $this->exportUrl($res['confirm_images']);
$arr1 = $this->getDayImages($images);
$arr['confirm_images'] = $arr1;
}else{
$arr['confirm_images'] = [];
}
return $arr;
}
//根据uid查询用户
public function getUserById($where){
$res = Db::name('user')
->where($where)
->field('id,user_login,identity')
->find();
return $res;
}
//获取项目完成工期
public function getPeriod($finishTime,$time){
$cnt = $finishTime-strtotime(date('Y-m-d',$time));
$days = floor($cnt/(3600*24))+1;//算出天数
return $days;
}
//按照日期进行排序
public function getDayImages($images){
$arr1 = [];
foreach($images as &$value){
$value['file_time'] = date('Y/m/d',$value['file_time']);
}
//去重后的日期
$res = array_values(array_unique(array_column($images,'file_time')));//array_values键名从0开始
foreach($res as $key1=>$value1){
$k = 0;
foreach($images as $value2){
if($value1 == $value2['file_time']){
$k+=0;
$arr1[$key1]['day'] = $value2['file_time'];
$arr1[$key1]['image'][$k]['image_url'] = $value2['image_url'];
$k++;
}
}
}
return $arr1;
}
}
... ...
<?php
// +----------------------------------------------------------------------
// | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2019 http://www.thinkcmf.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Powerless < wzxaini9@gmail.com>
// +----------------------------------------------------------------------
namespace app\portal\controller;
use cmf\controller\AdminBaseController;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
//渲染数据到excel
class AdminExcelDataController extends AdminBaseController
{
//巡检,日检渲染数据到表格上
public function inspectExcelData($arr){
$spreadsheet = new Spreadsheet();
$adminCommon = new AdminCommonController();
$sheet = $spreadsheet->getActiveSheet();
$xlsName = $arr['time'];
//设置sheet名称
$name = '报表';
$name = $adminCommon->iconv_to_utf8($name);
$sheet->setTitle($xlsName.$name);
//合并单元格
$sheet->mergeCells('B1:J1');
$sheet->mergeCells('B3:B4');
$sheet->mergeCells('B6:D6');
$sheet->mergeCells('B7:D7');
$sheet->mergeCells('C3:D3');
$sheet->mergeCells('C4:D4');
$sheet->mergeCells('F3:F4');
$sheet->mergeCells('G3:I3');
$sheet->mergeCells('G4:I4');
$spreadsheet->getDefaultStyle()->getFont()->setName('微软雅黑');//字体
//设置默认宽
$sheet->getDefaultColumnDimension()->setWidth(8);
//设置高度
$sheet->getRowDimension(1)->setRowHeight(45);
// $sheet->getRowDimension(2)->setRowHeight(55);
//***********************画出单元格边框*****************************
// $styleArray = [
// 'borders' => [
// 'outline' => [
// 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
// 'color' => ['argb' => 'FFFF0000'],
// ],
// ],
// ];
// $sheet->getStyle('A1:M26')->applyFromArray($styleArray);
//***********************画出单元格边框结束*****************************
//***********************背景填充颜色*****************************
$sheet->getStyle( 'A1:M8')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyle( 'A1:M8')->getFill()->getStartColor()->setRGB('222B35');//背景颜色
//***********************画出单元格边框结束*****************************
//标题
$sheet->setCellValue('B1', $arr['title']);
$sheet->getStyle('B1')->getFont()->setSize(18);//字体大小
$sheet->getStyle('B1')->getFont()->getColor()->setRGB('FFFFFF');//设置颜色为白色
$sheet->getStyle('B1')->getFont()->setBold(true);//字体加粗
//甲方logo
$imageA = $arr['a_company']['logo'];
if(@fopen($imageA , 'r' ) ) {
//这是一个坑,刚开始我把实例化图片类放在了循环外面,但是失败了,也就是每个图片都要实例化一次
$imageADrawing = new Drawing();
$imageADrawing->setPath($imageA);
// 设置图片的宽度
$imageADrawing->setResizeProportional(false);
$imageADrawing->setWidthAndHeight(40,40);
//图片显示在B3
$imageADrawing->setCoordinates('B3');
$imageADrawing->setWorksheet($sheet);
}
$sheet->getStyle('B3:G7')->getFont()->setSize(8);//字体大小
$sheet->getStyle('C3:G3')->getFont()->getColor()->setRGB('949494');//设置颜色为灰色
$sheet->getStyle('B6:G6')->getFont()->getColor()->setRGB('949494');//设置颜色为灰色
$sheet->getStyle('C4:G4')->getFont()->getColor()->setRGB('FFFFFF');//设置颜色为白色
$sheet->getStyle('B7:G7')->getFont()->getColor()->setRGB('FFFFFF');//设置颜色为白色
//甲方公司
$sheet->setCellValue('C3', '甲方公司');
//甲方公司名称
$sheet->setCellValue('C4', $arr['a_company']['company_name']);
//乙方logo
$imageB = $arr['b_company']['logo'];
if(@fopen($imageB , 'r' ) ) {
//这是一个坑,刚开始我把实例化图片类放在了循环外面,但是失败了,也就是每个图片都要实例化一次
$objDrawing = new Drawing();
$objDrawing->setPath($imageB);
// 设置图片的宽度
$objDrawing->setResizeProportional(false);
$objDrawing->setWidthAndHeight(40,40);
//图片显示在F3
$objDrawing->setCoordinates('F3');
$objDrawing->setWorksheet($sheet);
}
//乙方公司
$sheet->setCellValue('G3', '乙方公司');
//乙方公司名称
$sheet->setCellValue('G4', $arr['b_company']['company_name']);
//项目组
$sheet->setCellValue('B6', '项目组');
//项目组名称
$sheet->setCellValue('B7', $arr['group_name']);
//巡检日期
$sheet->setCellValue('E6', '巡检日期');
//巡检日期名称
$sheet->setCellValue('E7', $arr['create_time']);
//巡检状态
$sheet->setCellValue('G6', '巡检状态');
//巡检状态名称
$sheet->setCellValue('G7', $arr['inspect_status']);
//循环开始
$cols = 10;
$cells = ['C','E','G','I','K'];
foreach($arr['point'] as $value){
$cols += 0;
//巡检点名称
$sheet->setCellValue('B'.$cols, $value['point_name']);
$sheet->getStyle('B'.$cols)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
//获取图片个数
$length = count($value['images']);
$col = ceil($length/5);
for($i=0;$i<$col;$i++){
$col_i = $cols+$i;
$sheet->getRowDimension($col_i)->setRowHeight(105);
$sheet->mergeCells('C'.$col_i.':D'.$col_i);
$sheet->mergeCells('E'.$col_i.':F'.$col_i);
$sheet->mergeCells('G'.$col_i.':H'.$col_i);
$sheet->mergeCells('I'.$col_i.':J'.$col_i);
$sheet->mergeCells('K'.$col_i.':L'.$col_i);
$key = 0;
foreach($value['images'] as $k=>$image_value){
$pre = $i+4*$i;
$next = $i+1+4*($i+1);
if($k>=$pre && $k<$next){
//巡检图片
$image = $image_value['image_url'];
if(@fopen($image , 'r' ) ) {
//这是一个坑,刚开始我把实例化图片类放在了循环外面,但是失败了,也就是每个图片都要实例化一次
$obj = new Drawing();
$obj->setPath($image);
// 设置图片的宽度
$obj->setResizeProportional(false);
$obj->setWidthAndHeight(105,130);
//图片显示在F3
$obj->setCoordinates($cells[$key].$col_i);
$obj->setWorksheet($sheet);
}
$key++;
}
}
}
$cols += $col+1;
}
$sheet->getStyle( 'A9:M'.$cols)->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyle( 'A9:M'.$cols)->getFill()->getStartColor()->setRGB('F3F3F4');//背景颜色浅灰色
$objWrite = IOFactory::createWriter($spreadsheet, 'Xls');
//直接从浏览器中输出star
// header('pragma:public');
// header("Content-Disposition:attachment;filename=出货装箱单.xls");
// $objWrite->save('php://output');
// exit;
//直接从浏览器中输出end
$file_name = $xlsName.'.xls';
$files_url = ROOT_PATH . '/public/upload/export';
if(!is_dir($files_url)){
mkdir($files_url);
}
$file_url = ROOT_PATH . '/public/upload/export/'.$file_name;
$objWrite->save($file_url);
$sys = $adminCommon->getOperateSys();
if($sys == 'Linux'){
chmod($file_url, 0777);//适用于linux
}
//相对路径
$url = 'upload/export/'.$file_name;
return $url;
}
/*
* 导出表格适用于普通有规律的数据
* param xlsName:title名称
* param xlsCell:二维数据xlsCell = array(
array('id','序号'),
array('user_nickname','昵称'),
array('mobile','手机号'),
array('create_time','注册时间'),
array('last_login_time','最后登录时间'),
array('user_status','状态'),
);
* param xlsData:数据库数据
*/
public function exportExcel($xlsName,$xlsCell,$xlsData){
$topNumber = 1;//表头有几行占用
$starData = $topNumber+1;//数据开始行起
$cellKey = [
'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',
'AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM',
'AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ'
];
vendor("PHPExcel");
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle($xlsName);
//处理表头
foreach ($xlsCell as $k=>$v) {
$sheet->setCellValue($cellKey[$k].$topNumber, $v[1]);//设置表头数据
$sheet->getStyle($cellKey[$k].$topNumber)->getFont()->setBold(true);//设置是否加粗
}
//设置单元格居中显示
$styleArray = [
'alignment' => [
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
],
];
//表头居中
foreach ($xlsCell as $k2=>$v2) {
$sheet->getStyle($cellKey[$k2].'1')->applyFromArray($styleArray);
}
//处理数据
foreach ($xlsData as $k=>$v) {
foreach ($xlsCell as $k1=>$v1) {
//设置每列数据
$sheet->setCellValue($cellKey[$k1].($k+$starData), $v[$v1[0]]);
//每列宽度
$sheet->getColumnDimension($cellKey[$k1])->setWidth(30);
//设置居中显示
$sheet->getStyle($cellKey[$k1].($k+$starData))->applyFromArray($styleArray);
}
}
$file_name = $xlsName.'.xls';
// ob_end_clean();//清除缓冲区,避免乱码
// header('Content-Type: application/vnd.ms-excel');//告诉浏览器将要输出excel03文件
// header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告诉浏览器数据excel07文件
// header('Content-Disposition: attachment;filename='.$file_name);
// header('Cache-Control: max-age=0');
// $writer = new Xlsx($spreadsheet);
$writer = IOFactory::createWriter($spreadsheet, 'Xls'); //按照指定格式生成Excel文件
// $writer->save('php://output');直接输入到浏览器下载
//绝对路径,不存在则创建目录
$files_url = ROOT_PATH . '/public/upload/export';
if(!is_dir($files_url)){
mkdir($files_url);
}
$file_url = ROOT_PATH . '/public/upload/export/'.$file_name;
$writer->save($file_url);
//相对路径
$url = 'upload/export/'.$file_name;
return $url;
}
//月检渲染数据到表格上
public function checkExcelData($arr){
$spreadsheet = new Spreadsheet();
$adminCommon = new AdminCommonController();
$sheet = $spreadsheet->getActiveSheet();
$xlsName = $arr['time'];
//设置sheet名称
$name = '报表';
$name = $adminCommon->iconv_to_utf8($name);
$sheet->setTitle($xlsName.$name);
//合并单元格
$sheet->mergeCells('B1:J1');
$sheet->mergeCells('B3:B4');
$sheet->mergeCells('B6:D6');
$sheet->mergeCells('B7:D7');
$sheet->mergeCells('C3:D3');
$sheet->mergeCells('C4:D4');
$sheet->mergeCells('F3:F4');
$sheet->mergeCells('G3:I3');
$sheet->mergeCells('G4:I4');
$spreadsheet->getDefaultStyle()->getFont()->setName('微软雅黑');//字体
//设置默认宽
$sheet->getDefaultColumnDimension()->setWidth(8);
//设置高度
$sheet->getRowDimension(1)->setRowHeight(45);
// $sheet->getRowDimension(2)->setRowHeight(55);
//***********************背景填充颜色*****************************
$sheet->getStyle( 'A1:M8')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyle( 'A1:M8')->getFill()->getStartColor()->setRGB('222B35');//背景颜色
//***********************画出单元格边框结束*****************************
//标题
$sheet->setCellValue('B1', $arr['title']);
$sheet->getStyle('B1')->getFont()->setSize(18);//字体大小
$sheet->getStyle('B1')->getFont()->getColor()->setRGB('FFFFFF');//设置颜色为白色
$sheet->getStyle('B1')->getFont()->setBold(true);//字体加粗
//甲方logo
$imageA = $arr['a_company']['logo'];
if(@fopen($imageA , 'r' ) ) {
//这是一个坑,刚开始我把实例化图片类放在了循环外面,但是失败了,也就是每个图片都要实例化一次
$imageADrawing = new Drawing();
$imageADrawing->setPath($imageA);
// 设置图片的宽度
$imageADrawing->setResizeProportional(false);
$imageADrawing->setWidthAndHeight(40,40);
//图片显示在B3
$imageADrawing->setCoordinates('B3');
$imageADrawing->setWorksheet($sheet);
}
$sheet->getStyle('B3:G7')->getFont()->setSize(8);//字体大小
$sheet->getStyle('C3:G3')->getFont()->getColor()->setRGB('949494');//设置颜色为灰色
$sheet->getStyle('B6:G6')->getFont()->getColor()->setRGB('949494');//设置颜色为灰色
$sheet->getStyle('C4:G4')->getFont()->getColor()->setRGB('FFFFFF');//设置颜色为白色
$sheet->getStyle('B7:G7')->getFont()->getColor()->setRGB('FFFFFF');//设置颜色为白色
//甲方公司
$sheet->setCellValue('C3', '甲方公司');
//甲方公司名称
$sheet->setCellValue('C4', $arr['a_company']['company_name']);
//乙方logo
$imageB = $arr['b_company']['logo'];
if(@fopen($imageB , 'r' ) ) {
//这是一个坑,刚开始我把实例化图片类放在了循环外面,但是失败了,也就是每个图片都要实例化一次
$objDrawing = new Drawing();
$objDrawing->setPath($imageB);
// 设置图片的宽度
$objDrawing->setResizeProportional(false);
$objDrawing->setWidthAndHeight(40,40);
//图片显示在F3
$objDrawing->setCoordinates('F3');
$objDrawing->setWorksheet($sheet);
}
//乙方公司
$sheet->setCellValue('G3', '乙方公司');
//乙方公司名称
$sheet->setCellValue('G4', $arr['b_company']['company_name']);
//项目组
$sheet->setCellValue('B6', '项目组');
//项目组名称
$sheet->setCellValue('B7', $arr['group_name']);
//巡检日期
$sheet->setCellValue('E6', '巡检日期');
//巡检日期名称
$sheet->setCellValue('E7', $arr['create_time']);
//巡检状态
$sheet->setCellValue('G6', '巡检状态');
//巡检状态名称
$sheet->setCellValue('G7', $arr['inspect_status']);
//循环开始
$cols = 10;
$cells = ['C','E','G','I','K'];
foreach($arr['point'] as $value){
$cols += 0;
//巡检点名称
$sheet->setCellValue('B'.$cols, $value['point_name']);
$sheet->getStyle('B'.$cols)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
//获取图片个数
$length = count($value['images']);
$col = ceil($length/5);
for($i=0;$i<$col;$i++){
$col_i = $cols+$i;
$sheet->getRowDimension($col_i)->setRowHeight(105);
$sheet->mergeCells('C'.$col_i.':D'.$col_i);
$sheet->mergeCells('E'.$col_i.':F'.$col_i);
$sheet->mergeCells('G'.$col_i.':H'.$col_i);
$sheet->mergeCells('I'.$col_i.':J'.$col_i);
$sheet->mergeCells('K'.$col_i.':L'.$col_i);
$key = 0;
foreach($value['images'] as $k=>$image_value){
$pre = $i+4*$i;
$next = $i+1+4*($i+1);
if($k>=$pre && $k<$next){
//巡检图片
$image = $image_value['image_url'];
if(@fopen($image , 'r' ) ) {
//这是一个坑,刚开始我把实例化图片类放在了循环外面,但是失败了,也就是每个图片都要实例化一次
$obj = new Drawing();
$obj->setPath($image);
// 设置图片的宽度
$obj->setResizeProportional(false);
$obj->setWidthAndHeight(105,130);
//图片显示在F3
$obj->setCoordinates($cells[$key].$col_i);
$obj->setWorksheet($sheet);
}
$key++;
}
}
}
$cols += $col+1;
}
$sheet->getStyle( 'A9:M'.$cols)->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyle( 'A9:M'.$cols)->getFill()->getStartColor()->setRGB('F3F3F4');//背景颜色浅灰色
$objWrite = IOFactory::createWriter($spreadsheet, 'Xls');
//直接从浏览器中输出star
// header('pragma:public');
// header("Content-Disposition:attachment;filename=出货装箱单.xls");
// $objWrite->save('php://output');
// exit;
//直接从浏览器中输出end
$file_name = $xlsName.'.xls';
$files_url = ROOT_PATH . '/public/upload/export';
if(!is_dir($files_url)){
mkdir($files_url);
}
$file_url = ROOT_PATH . '/public/upload/export/'.$file_name;
$objWrite->save($file_url);
$sys = $adminCommon->getOperateSys();
if($sys == 'Linux'){
chmod($file_url, 0777);//适用于linux
}
//相对路径
$url = 'upload/export/'.$file_name;
return $url;
}
}
... ...
... ... @@ -185,6 +185,7 @@ class AdminInspectAController extends AdminBaseController
$mark = $this->request->param('mark');
$adminCommon = new AdminCommonController();
$adminExcel = new AdminExcelDataController();
$res_ins = $adminCommon->inspectList(0,$param);
$arr_url = [];
... ... @@ -217,7 +218,7 @@ class AdminInspectAController extends AdminBaseController
$arr['point'] = $point;
//获取文件路径
$url = $adminCommon->send_export($arr);
$url = $adminExcel->inspectExcelData($arr);
$month = date('Y-m',$value['create_time']);
$year = date('Y',$value['create_time']);
if($mark == 'day'){
... ...
... ... @@ -130,6 +130,7 @@ class AdminInspectBController extends AdminBaseController
$mark = $this->request->param('mark');
$adminCommon = new AdminCommonController();
$adminExcel = new AdminExcelDataController();
$res_ins = $adminCommon->inspectList(1,$param);
$arr_url = [];
... ... @@ -162,7 +163,7 @@ class AdminInspectBController extends AdminBaseController
$arr['point'] = $point;
//获取文件路径
$url = $adminCommon->send_export($arr);
$url = $adminExcel->inspectExcelData($arr);
$month = date('Y-m',$value['create_time']);
$year = date('Y',$value['create_time']);
if($mark == 'day'){
... ...
... ... @@ -7,19 +7,18 @@
</ul>
<form class="well form-inline margin-top-20" method="post" action="{:url('AdminCheck/index')}">
项目名称:
<input class="form-control" type="text" name="name" style="width: 200px;" value="{:input('request.name')}"
placeholder="请输入项目名称">
<input class="form-control" type="text" name="name" style="width: 200px;" value="{:input('request.name')}" id="project_name" placeholder="请输入项目名称">
月检时间:
<input type="text" class="form-control js-bootstrap-datetime" name="start_time"
value="{$start_time|default=''}"
style="width: 140px;" autocomplete="off">-
<input type="text" class="form-control js-bootstrap-datetime" name="end_time"
value="{$end_time|default=''}"
style="width: 140px;" autocomplete="off"> &nbsp;
<input type="text" class="form-control js-bootstrap-datetime" style="width:160px;" name="start_time" value="{$start_time|default=''}" autocomplete="off" id="start_time" placeholder="请输入开始时间">-
<input type="text" class="form-control js-bootstrap-datetime" style="width:160px;" name="end_time" value="{$end_time|default=''}" autocomplete="off" id="end_time" placeholder="请输入结束时间"> &nbsp;
<input type="submit" class="btn btn-primary" value="搜索"/>
<a class="btn btn-danger" href="{:url('AdminCheck/index')}">清空</a>
</form>
<button class="btn btn-success" id="export_data">导出月检数据</button>
<form method="post" class="js-ajax-form">
<table class="table table-hover table-bordered">
<thead>
... ... @@ -64,3 +63,49 @@
<script src="__STATIC__/js/admin.js"></script>
</body>
</html>
<script>
$(function(){
//导出数据
$('#export_data').click(function(){
var project_name = $('#project_name').val();
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var code = checkData(start_time,end_time,project_name);
if(code == 1){
window.location.href = 'exportData?start_time='+start_time+'&end_time='+end_time+'&name='+project_name;
}
});
});
//检查是否有可导出的数据
function checkData(start_time,end_time,project_name){
if(start_time == ''){
alert('请输入月检开始时间');
return false;
}
if(end_time == ''){
alert('请输入月检结束时间');
return false;
}
var code = 1;
$.ajax({
type:'GET',
url:'checkData' ,
data:{
'start_time':start_time,
'end_time':end_time,
'name':project_name
},
dataType:'json',
async:false,//同步
success:function(data){
if (data.code == 0) {
alert(data.msg);
code = 0;
}
}
});
return code;
}
</script>
\ No newline at end of file
... ...
... ... @@ -7,8 +7,7 @@
</ul>
<form class="well form-inline margin-top-20" method="post" action="{:url('AdminInspectA/index')}">
项目名称:
<input class="form-control" type="text" name="name" style="width: 200px;" value="{:input('request.name')}"
placeholder="请输入项目名称">
<input class="form-control" type="text" name="name" style="width: 200px;" value="{:input('request.name')}" id="project_name" placeholder="请输入项目名称">
巡检时间:
<input type="text" class="form-control js-bootstrap-datetime" style="width:160px;" name="start_time" value="{$start_time|default=''}" autocomplete="off" id="start_time" placeholder="请输入开始时间">-
... ... @@ -65,37 +64,40 @@
$(function(){
//按日导出
$('#export_day').click(function(){
var project_name = $('#project_name').val();
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var code = checkData(start_time,end_time);
var code = checkData(start_time,end_time,project_name);
if(code == 1){
window.location.href = 'exportInspectADay?start_time='+start_time+'&end_time='+end_time+'&mark=day';
window.location.href = 'exportInspectADay?start_time='+start_time+'&end_time='+end_time+'&name='+project_name+'&mark=day';
}
});
//按月导出
$('#export_month').click(function(){
var project_name = $('#project_name').val();
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var code = checkData(start_time,end_time);
var code = checkData(start_time,end_time,project_name);
if(code == 1){
window.location.href = 'exportInspectADay?start_time='+start_time+'&end_time='+end_time+'&mark=month';
window.location.href = 'exportInspectADay?start_time='+start_time+'&end_time='+end_time+'&name='+project_name+'&mark=month';
}
});
//按年导出
$('#export_year').click(function(){
var project_name = $('#project_name').val();
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var code = checkData(start_time,end_time);
var code = checkData(start_time,end_time,project_name);
if(code == 1){
window.location.href = 'exportInspectADay?start_time='+start_time+'&end_time='+end_time+'&mark=year';
window.location.href = 'exportInspectADay?start_time='+start_time+'&end_time='+end_time+'&name='+project_name+'&mark=year';
}
});
});
//检查是否有可导出的数据
function checkData(start_time,end_time){
function checkData(start_time,end_time,project_name){
if(start_time == ''){
alert('请输入巡检开始时间');
return false;
... ... @@ -110,7 +112,8 @@
url:'checkData' ,
data:{
'start_time':start_time,
'end_time':end_time
'end_time':end_time,
'name':project_name
},
dataType:'json',
async:false,//同步
... ...
... ... @@ -7,8 +7,7 @@
</ul>
<form class="well form-inline margin-top-20" method="post" action="{:url('AdminInspectB/index')}">
项目名称:
<input class="form-control" type="text" name="name" style="width: 200px;" value="{:input('request.name')}"
placeholder="请输入项目名称">
<input class="form-control" type="text" name="name" style="width: 200px;" value="{:input('request.name')}" id="project_name" placeholder="请输入项目名称">
日检时间:
<input type="text" class="form-control js-bootstrap-datetime" name="start_time" value="{$start_time|default=''}" id="start_time" style="width: 160px;" placeholder="请输入日检开始时间" autocomplete="off">-
... ... @@ -65,37 +64,40 @@
$(function(){
//按日导出
$('#export_day').click(function(){
var project_name = $('#project_name').val();
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var code = checkData(start_time,end_time);
var code = checkData(start_time,end_time,project_name);
if(code == 1){
window.location.href = 'exportInspectBDay?start_time='+start_time+'&end_time='+end_time+'&mark=day';
window.location.href = 'exportInspectBDay?start_time='+start_time+'&end_time='+end_time+'&name='+project_name+'&mark=day';
}
});
//按月导出
$('#export_month').click(function(){
var project_name = $('#project_name').val();
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var code = checkData(start_time,end_time);
var code = checkData(start_time,end_time,project_name);
if(code == 1){
window.location.href = 'exportInspectBDay?start_time='+start_time+'&end_time='+end_time+'&mark=month';
window.location.href = 'exportInspectBDay?start_time='+start_time+'&end_time='+end_time+'&name='+project_name+'&mark=month';
}
});
//按年导出
$('#export_year').click(function(){
var project_name = $('#project_name').val();
var start_time = $('#start_time').val();
var end_time = $('#end_time').val();
var code = checkData(start_time,end_time);
var code = checkData(start_time,end_time,project_name);
if(code == 1){
window.location.href = 'exportInspectBDay?start_time='+start_time+'&end_time='+end_time+'&mark=year';
window.location.href = 'exportInspectBDay?start_time='+start_time+'&end_time='+end_time+'&name='+project_name+'&mark=year';
}
});
});
//检查是否有可导出的数据
function checkData(start_time,end_time){
function checkData(start_time,end_time,project_name){
if(start_time == ''){
alert('请输入巡检开始时间');
return false;
... ... @@ -110,7 +112,8 @@
url:'checkData' ,
data:{
'start_time':start_time,
'end_time':end_time
'end_time':end_time,
'name':project_name
},
dataType:'json',
async:false,//同步
... ...