| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- <?php
- /**
- * PHPExcel类
- */
- class PHPExcelChajian extends Chajian{
-
- public $excel = null;
- public $sheetObj;
- public $headlen = 0;
- public $headbgcolor = 'CDF79E';
- public $bordercolor = '000000';
- public $headfontcolor = '';
- public $headfontbold = false;
- public $borderbool = true;
-
- public $title = '';
- public $titlebool = true;
- public $titlebgbool = false;
-
- public $sheettitle = '';
- public $headArr = array();
- public $rows = array();
-
-
- public $titleboolArray = array();
- public $titleArray = array();
- public $headArrArray = array();
- public $rowsArray = array();
-
- public $pageCode = 'utf-8';
- public $code = 'utf-8';
- public $createbool = false;
-
- public $A,$headWidth;
-
- public function initChajian()
- {
- if(version_compare(PHP_VERSION, '7.5.0','>'))return;
- $this->A = explode(',','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,BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW,BX,BY,BZ,CA,CB,CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CM,CN,CO,CP,CQ,CR,CS,CT,CU,CV,CW,CX,CY,CZ');
- $this->headWidth= array();
- $pastr = ROOT_PATH.'/include/PHPExcel.php';
- if(file_exists($pastr)){
- include_once($pastr);
- $this->excel = new PHPExcel();
- }
- }
-
- public function isBool()
- {
- if($this->excel==null){
- return false;
- }else{
- return true;
- }
- }
-
- /**
- 设置表头
- */
- private function setHead($sheet=0)
- {
- $arrh = $this->headArr;
- $title = $this->sheettitle;
- if($title=='')$title = $this->title;
- $this->headWidth = array();
- if($sheet>0)$this->excel->createSheet();
- $this->excel->setActiveSheetIndex($sheet);//设置当前的sheet工作簿
- $this->sheetObj = $this->excel->getActiveSheet();
- $this->sheetObj->setTitle($title);//设置sheet的工作簿标题
- $k = 0;
- if($sheet == 0){
- $this->excel->getProperties()->setCreator('rock'); //创建者
- $this->excel->getProperties()->setLastModifiedBy('rock'); //最后修改
- $this->excel->getProperties()->setTitle('rock'); //设置标题
- $this->excel->getProperties()->setSubject('rock'); //设置备注
- $this->excel->getProperties()->setDescription('rock'); //设置描述
- $this->excel->getProperties()->setKeywords('rock'); //设置关键字 | 标记
- $this->excel->getProperties()->setCategory('rock'); //设置类别
- }
-
- $this->headlen = -1;
- foreach($arrh as $_arrh)$this->headlen++;
- $this->rowslen = 0;
- if(is_array($this->rows))$this->rowslen=count($this->rows);//长度
- if($this->headlen==-1)return false;
- //整体添加边框颜色,居中
- $zta = ($this->titlebool)?2:1;
- $getStyle = $this->sheetObj->getStyle('A1:'.$this->A[$this->headlen].''.($this->rowslen+$zta).'');
- $getStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
- $getStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::VERTICAL_CENTER);//水平居中
-
- if($this->borderbool){
- $getStyle->getBorders()->getAllborders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);//边框
- if($this->bordercolor!='000000')$getStyle->getBorders()->getAllborders()->getColor()->setARGB('FF'.$this->bordercolor.'');//边框颜色
- }
- //设置头部标题
- if($this->titlebool){
- $this->sheetObj->mergeCells('A1:'.$this->A[$this->headlen].'1'); //合并单元格
- $this->sheetObj->setCellValue('A1', $title);
- $this->sheetObj->getRowDimension(1)->setRowHeight(30); //设置行高
- $getStyle = $this->sheetObj->getStyle('A1');
- $getStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
- $getStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直剧中
- $getStyle->getFont()->setBold(true);
- $getStyle->getFont()->setSize(16);
- //标题背景颜色
- if($this->titlebgbool){
- $getStyle->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
- $getStyle->getFill()->getStartColor()->setARGB('FF'.$this->headbgcolor.'');
- }
- }
-
- //设置表头列标题
- if($this->headfontbold)$this->sheetObj->getStyle('A'.$zta.':'.$this->A[$this->headlen].''.$zta.'')->getFont()->setBold(true);//标题是否加粗
- foreach($arrh as $key=>$_arrh){
- $name = $_arrh;
- $xlsfontcolor = $this->headfontcolor;
- $xlsbgcolor = $this->headbgcolor;
- $xlsbordercolor = $this->bordercolor;
- $xlsfontsize = '';//字体大小
- $xlswidth = 0; //宽度
- $xlsalign = 'center'; //对齐方式
- $xlsbold = false; //是否加粗
- if(is_array($_arrh)){
- if(isset($_arrh['xlsfontcolor']))$xlsfontcolor=$_arrh['xlsfontcolor'];
- if(isset($_arrh['xlsbgcolor']))$xlsbgcolor=$_arrh['xlsbgcolor'];
- if(isset($_arrh['xlsbordercolor']))$xlsbordercolor=$_arrh['xlsbordercolor'];
- if(isset($_arrh['xlswidth']))$xlswidth=$_arrh['xlswidth'];
- if(isset($_arrh['xlsalign']))$xlswidth=$_arrh['xlsalign'];
- if(isset($_arrh['xlsbold']))$xlsbold=$_arrh['xlsbold'];
- if(isset($_arrh['xlsfontsize']))$xlsfontsize=$_arrh['xlsfontsize'];
- $name= $_arrh['name'];
- }
- $this->headWidth[$key] = array(strlen($name), $xlswidth); //设置宽度
- //设置样式
- $vk = ''.$this->A[$k].'2';
-
- if(!$this->titlebool)$vk = ''.$this->A[$k].'1';
- $getStyle = $this->sheetObj->getStyle($vk);
-
- //边框
- if($xlsbordercolor!='000000')$getStyle->getBorders()->getAllborders()->getColor()->setARGB('FF'.$xlsbordercolor.'');
-
-
- //设置背景色
- $getStyle->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
- $getStyle->getFill()->getStartColor()->setARGB('FF'.$xlsbgcolor.'');
-
- //设置字体颜色加粗,大小
- if($xlsfontcolor!='')$getStyle->getFont()->getColor()->setARGB('FF'.$xlsfontcolor.'');
- if($xlsbold)$getStyle->getFont()->setBold(true);
- if($xlsfontsize!='')$getStyle->getFont()->setSize($xlsfontsize);
-
- //设置对齐方式
- if($xlsalign!='center')$getStyle->getAlignment()->setHorizontal($xlsalign);
-
- $this->sheetObj->setCellValue($vk, $name);
- $k++;
- }
- }
-
-
- /**
- 添加数据
- */
- private function setData()
- {
- $rows = $this->rows;
- if(!is_array($rows))return false;
- $arrh = $this->headArr;
- $zta = ($this->titlebool)?3:2;
- //添加数据
- foreach($rows as $r=>$rs){
- if(!is_array($rs))continue;
- $k = 0;
- $xlsmerge = '';
- $xlsbgcolor = '';
- $xua = $r+$zta;
- if(isset($rs['xlsmerge']))$xlsmerge=$rs['xlsmerge'];
- if(isset($rs['xlsbgcolor']))$xlsbgcolor=$rs['xlsbgcolor'];
-
- //整行背景色
- if($xlsbgcolor!=''){
- $this->sheetObj->getStyle('A'.$xua.':'.$this->A[$this->headlen].''.$xua.'')
- ->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
- ->getStartColor()->setARGB('FF'.$xlsbgcolor.'');
- }
-
- //判断是否有合并单元格的(A:D)
- if($xlsmerge!=''){
- $ncta = explode(':',$xlsmerge);
- $this->sheetObj->mergeCells(''.$ncta[0].''.$xua.':'.$ncta[1].''.$xua.'');
- }
-
- foreach($arrh as $key=>$_arrh){
- if(!isset($rs[$key])){
- $k++;
- continue;
- }
- $vk = ''.$this->A[$k].''.$xua.'';
- $xlsfontcolor = $xlsbgcolor = '';
- $xlsbordercolor = $this->bordercolor;
- $xlsunderline = '';
- $xlsfontsize = '';
- $xlsalign = 'center'; //对齐方式
- $xlsbold = false; //是否加粗
- $xlsitalic = false; //是否斜体
- $val = $rs[$key];
- $vallen = strlen(''.$val.'');
- if($this->headWidth[$key][0]<$vallen)$this->headWidth[$key][0]=$vallen;
- if(is_array($_arrh)){
- if(isset($_arrh['xlsfontcolor']))$xlsfontcolor=$_arrh['xlsfontcolor'];
- if(isset($_arrh['xlsbgcolor']))$xlsbgcolor=$_arrh['xlsbgcolor'];
- if(isset($_arrh['xlsbordercolor']))$xlsbordercolor=$_arrh['xlsbordercolor'];
- if(isset($_arrh['xlsalign']))$xlsalign=$_arrh['xlsalign'];
- }
-
- if(isset($rs['xlsfontcolor']))$xlsfontcolor=$rs['xlsfontcolor'];
- if(isset($rs['xlsbordercolor']))$xlsbordercolor=$rs['xlsbordercolor'];
- if(isset($rs['xlsalign']))$xlsalign=$rs['xlsalign'];
- if(isset($rs['xlsbold']))$xlsbold=$rs['xlsbold'];
- if(isset($rs['xlsfontsize']))$xlsfontsize=$rs['xlsfontsize'];
- if(isset($rs['xlsunderline']))$xlsunderline=$rs['xlsunderline'];
-
- if(isset($rs[''.$key.'xlsfontcolor']))$xlsfontcolor=$rs[''.$key.'xlsfontcolor'];
- if(isset($rs[''.$key.'xlsbgcolor']))$xlsbgcolor=$rs[''.$key.'xlsbgcolor'];
- if(isset($rs[''.$key.'xlsbordercolor']))$xlsbordercolor=$rs[''.$key.'xlsbordercolor'];
- if(isset($rs[''.$key.'xlsalign']))$xlsalign=$rs[''.$key.'xlsalign'];
- if(isset($rs[''.$key.'xlsbold']))$xlsbold=$rs[''.$key.'xlsbold'];
- if(isset($rs[''.$key.'xlsfontsize']))$xlsfontsize=$rs[''.$key.'xlsfontsize'];
- if(isset($rs[''.$key.'xlsitalic']))$xlsitalic=$rs[''.$key.'xlsitalic'];
- if(isset($rs[''.$key.'xlsunderline']))$xlsunderline=$rs[''.$key.'xlsunderline'];
-
- $getStyle = $this->sheetObj->getStyle($vk);
- //设置背景色
- if($xlsbgcolor!=''){
- $getStyle->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
- $getStyle->getFill()->getStartColor()->setARGB('FF'.$xlsbgcolor.'');
- }
-
- //字体颜色
- if($xlsfontcolor!='')$getStyle->getFont()->getColor()->setARGB('FF'.$xlsfontcolor.'');
- if($xlsbold)$getStyle->getFont()->setBold(true);
- if($xlsitalic)$getStyle->getFont()->setItalic(true);//斜体
- if($xlsfontsize!='')$getStyle->getFont()->setSize($xlsfontsize);
- if($xlsunderline!='')$getStyle->getFont()->setUnderline($xlsunderline);//下划线情况double,双下划线、doubleAccounting,整个单元格双下划线、single,单下划线、singleAccounting,整个单元格单下划线
-
- //设置边框颜色
- if($xlsbordercolor!='000000')$getStyle->getBorders()->getAllborders()->getColor()->setARGB('FF'.$xlsbordercolor.'');
-
- //对齐方式
- if($xlsalign!='center')$getStyle->getAlignment()->setHorizontal($xlsalign);
-
- $this->sheetObj->setCellValue($vk, $val);
- $k++;
- }
-
- //设置行高
- $xlsrowheight = 0;
- if(isset($rs['xlsrowheight']))$xlsrowheight=$rs['xlsrowheight'];
- if($xlsrowheight != 0)$this->sheetObj->getRowDimension($r+$zta)->setRowHeight($xlsrowheight);
- }
- }
-
- /**
- 设置列宽
- */
- private function setColwidth()
- {
- $k=0;
- foreach($this->headWidth as $key=>$v){
- $w = $v[1];
- if($w<=0){
- $w= $v[0] * 1.2;
- }else{
- $w= $w/70*12;
- }
- if($w>0)$this->sheetObj->getColumnDimension($this->A[$k])->setWidth($w);
- $k++;
- }
- }
- /**
- 创建数据
- */
- public function createData()
- {
- $len1 = count($this->titleArray);
- $len2 = count($this->headArrArray);
- $len3 = count($this->rowsArray);
-
- if($len1==$len2 && $len2==$len3 && $len1>0){
- for($i=0; $i<$len1; $i++){
- $this->sheettitle = $this->titleArray[$i];
- $this->headArr = $this->headArrArray[$i];
- $this->rows = $this->rowsArray[$i];
- $this->titlebool = true;
- if(isset($this->titleboolArray[$i]))$this->titlebool=$this->titleboolArray[$i];
-
- $this->setHead($i);
- $this->setData();
- $this->setColwidth();
- }
- $this->excel->setActiveSheetIndex(0);
- }else{
- $this->setHead(0);
- $this->setData();
- $this->setColwidth();
- }
- $this->createbool = true;
- }
-
- /**
- 输出显示
- @param string $ext 输出类型 xls,xlsx
- @param string $type 是否直接下载
- @return string 文件名
- */
- public function display($ext='xls', $type='down')
- {
- if(!$this->createbool){
- $this->createData();
- }
-
- $title = $this->title;
- //有随机数
- $rand = '';
- if(contain($type,'rand'))$rand = date('YmdHis');
- $filename = ''.$title.''.$rand.'.'.$ext.'';
- //输出
- if($ext!='xlsx'){
- $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel5');
- }else{
- $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel2007'); //保存excel—2007格式或者
- }
- $backfile = 'down';
-
- //保存文件
- if(contain($type,'savelogs')){
- $dir = 'logs';
- $path = ''.ROOT_PATH.'/'.UPDIR.'/'.$dir.'/';
- if(!is_dir($path))mkdir($path);
- $savefile = $path.''.$this->iconvstr($filename).'';
- $objWriter->save($savefile); //是否保存本地
- $backfile = ''.UPDIR.'/'.$dir.'/'.$filename.'';
- }
-
- //下载
- if(contain($type, 'down')){
- header('Content-type: application/vnd.ms-excel');
- header('Content-Disposition: attachment; filename="'.iconv('utf-8', 'gbk', $filename).'"');
- header('Cache-Control: max-age=0');
- $objWriter->save('php://output');
- }
-
- return $backfile;
- }
-
-
- /**
- 编码转化
- */
- private function iconvstr($str)
- {
- if($this->pageCode=='utf-8')$str = iconv('utf-8', 'gbk', $str);
- return $str;
- }
-
-
- /**
- 合并单元格
- */
- public function mergeCells($cel1, $cel2, $val=null, $sheet=-1)
- {
- if($sheet != -1)$this->excel->setActiveSheetIndex($sheet);
- $this->excel->getActiveSheet()->mergeCells(''.$cel1.':'.$cel2.'');
- if($val != null)$this->sheetObj->setCellValue($cel1, $val);
- }
- }
|