Files
xinhu/include/chajian/PHPExcelChajian.php
2023-04-05 13:00:20 +08:00

386 lines
13 KiB
PHP

<?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);
}
}