PHPExcelChajian.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. <?php
  2. /**
  3. * PHPExcel类
  4. */
  5. class PHPExcelChajian extends Chajian{
  6. public $excel = null;
  7. public $sheetObj;
  8. public $headlen = 0;
  9. public $headbgcolor = 'CDF79E';
  10. public $bordercolor = '000000';
  11. public $headfontcolor = '';
  12. public $headfontbold = false;
  13. public $borderbool = true;
  14. public $title = '';
  15. public $titlebool = true;
  16. public $titlebgbool = false;
  17. public $sheettitle = '';
  18. public $headArr = array();
  19. public $rows = array();
  20. public $titleboolArray = array();
  21. public $titleArray = array();
  22. public $headArrArray = array();
  23. public $rowsArray = array();
  24. public $pageCode = 'utf-8';
  25. public $code = 'utf-8';
  26. public $createbool = false;
  27. public $A,$headWidth;
  28. public function initChajian()
  29. {
  30. if(version_compare(PHP_VERSION, '7.5.0','>'))return;
  31. $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');
  32. $this->headWidth= array();
  33. $pastr = ROOT_PATH.'/include/PHPExcel.php';
  34. if(file_exists($pastr)){
  35. include_once($pastr);
  36. $this->excel = new PHPExcel();
  37. }
  38. }
  39. public function isBool()
  40. {
  41. if($this->excel==null){
  42. return false;
  43. }else{
  44. return true;
  45. }
  46. }
  47. /**
  48. 设置表头
  49. */
  50. private function setHead($sheet=0)
  51. {
  52. $arrh = $this->headArr;
  53. $title = $this->sheettitle;
  54. if($title=='')$title = $this->title;
  55. $this->headWidth = array();
  56. if($sheet>0)$this->excel->createSheet();
  57. $this->excel->setActiveSheetIndex($sheet);//设置当前的sheet工作簿
  58. $this->sheetObj = $this->excel->getActiveSheet();
  59. $this->sheetObj->setTitle($title);//设置sheet的工作簿标题
  60. $k = 0;
  61. if($sheet == 0){
  62. $this->excel->getProperties()->setCreator('rock'); //创建者
  63. $this->excel->getProperties()->setLastModifiedBy('rock'); //最后修改
  64. $this->excel->getProperties()->setTitle('rock'); //设置标题
  65. $this->excel->getProperties()->setSubject('rock'); //设置备注
  66. $this->excel->getProperties()->setDescription('rock'); //设置描述
  67. $this->excel->getProperties()->setKeywords('rock'); //设置关键字 | 标记
  68. $this->excel->getProperties()->setCategory('rock'); //设置类别
  69. }
  70. $this->headlen = -1;
  71. foreach($arrh as $_arrh)$this->headlen++;
  72. $this->rowslen = 0;
  73. if(is_array($this->rows))$this->rowslen=count($this->rows);//长度
  74. if($this->headlen==-1)return false;
  75. //整体添加边框颜色,居中
  76. $zta = ($this->titlebool)?2:1;
  77. $getStyle = $this->sheetObj->getStyle('A1:'.$this->A[$this->headlen].''.($this->rowslen+$zta).'');
  78. $getStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
  79. $getStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::VERTICAL_CENTER);//水平居中
  80. if($this->borderbool){
  81. $getStyle->getBorders()->getAllborders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);//边框
  82. if($this->bordercolor!='000000')$getStyle->getBorders()->getAllborders()->getColor()->setARGB('FF'.$this->bordercolor.'');//边框颜色
  83. }
  84. //设置头部标题
  85. if($this->titlebool){
  86. $this->sheetObj->mergeCells('A1:'.$this->A[$this->headlen].'1'); //合并单元格
  87. $this->sheetObj->setCellValue('A1', $title);
  88. $this->sheetObj->getRowDimension(1)->setRowHeight(30); //设置行高
  89. $getStyle = $this->sheetObj->getStyle('A1');
  90. $getStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
  91. $getStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直剧中
  92. $getStyle->getFont()->setBold(true);
  93. $getStyle->getFont()->setSize(16);
  94. //标题背景颜色
  95. if($this->titlebgbool){
  96. $getStyle->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
  97. $getStyle->getFill()->getStartColor()->setARGB('FF'.$this->headbgcolor.'');
  98. }
  99. }
  100. //设置表头列标题
  101. if($this->headfontbold)$this->sheetObj->getStyle('A'.$zta.':'.$this->A[$this->headlen].''.$zta.'')->getFont()->setBold(true);//标题是否加粗
  102. foreach($arrh as $key=>$_arrh){
  103. $name = $_arrh;
  104. $xlsfontcolor = $this->headfontcolor;
  105. $xlsbgcolor = $this->headbgcolor;
  106. $xlsbordercolor = $this->bordercolor;
  107. $xlsfontsize = '';//字体大小
  108. $xlswidth = 0; //宽度
  109. $xlsalign = 'center'; //对齐方式
  110. $xlsbold = false; //是否加粗
  111. if(is_array($_arrh)){
  112. if(isset($_arrh['xlsfontcolor']))$xlsfontcolor=$_arrh['xlsfontcolor'];
  113. if(isset($_arrh['xlsbgcolor']))$xlsbgcolor=$_arrh['xlsbgcolor'];
  114. if(isset($_arrh['xlsbordercolor']))$xlsbordercolor=$_arrh['xlsbordercolor'];
  115. if(isset($_arrh['xlswidth']))$xlswidth=$_arrh['xlswidth'];
  116. if(isset($_arrh['xlsalign']))$xlswidth=$_arrh['xlsalign'];
  117. if(isset($_arrh['xlsbold']))$xlsbold=$_arrh['xlsbold'];
  118. if(isset($_arrh['xlsfontsize']))$xlsfontsize=$_arrh['xlsfontsize'];
  119. $name= $_arrh['name'];
  120. }
  121. $this->headWidth[$key] = array(strlen($name), $xlswidth); //设置宽度
  122. //设置样式
  123. $vk = ''.$this->A[$k].'2';
  124. if(!$this->titlebool)$vk = ''.$this->A[$k].'1';
  125. $getStyle = $this->sheetObj->getStyle($vk);
  126. //边框
  127. if($xlsbordercolor!='000000')$getStyle->getBorders()->getAllborders()->getColor()->setARGB('FF'.$xlsbordercolor.'');
  128. //设置背景色
  129. $getStyle->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
  130. $getStyle->getFill()->getStartColor()->setARGB('FF'.$xlsbgcolor.'');
  131. //设置字体颜色加粗,大小
  132. if($xlsfontcolor!='')$getStyle->getFont()->getColor()->setARGB('FF'.$xlsfontcolor.'');
  133. if($xlsbold)$getStyle->getFont()->setBold(true);
  134. if($xlsfontsize!='')$getStyle->getFont()->setSize($xlsfontsize);
  135. //设置对齐方式
  136. if($xlsalign!='center')$getStyle->getAlignment()->setHorizontal($xlsalign);
  137. $this->sheetObj->setCellValue($vk, $name);
  138. $k++;
  139. }
  140. }
  141. /**
  142. 添加数据
  143. */
  144. private function setData()
  145. {
  146. $rows = $this->rows;
  147. if(!is_array($rows))return false;
  148. $arrh = $this->headArr;
  149. $zta = ($this->titlebool)?3:2;
  150. //添加数据
  151. foreach($rows as $r=>$rs){
  152. if(!is_array($rs))continue;
  153. $k = 0;
  154. $xlsmerge = '';
  155. $xlsbgcolor = '';
  156. $xua = $r+$zta;
  157. if(isset($rs['xlsmerge']))$xlsmerge=$rs['xlsmerge'];
  158. if(isset($rs['xlsbgcolor']))$xlsbgcolor=$rs['xlsbgcolor'];
  159. //整行背景色
  160. if($xlsbgcolor!=''){
  161. $this->sheetObj->getStyle('A'.$xua.':'.$this->A[$this->headlen].''.$xua.'')
  162. ->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
  163. ->getStartColor()->setARGB('FF'.$xlsbgcolor.'');
  164. }
  165. //判断是否有合并单元格的(A:D)
  166. if($xlsmerge!=''){
  167. $ncta = explode(':',$xlsmerge);
  168. $this->sheetObj->mergeCells(''.$ncta[0].''.$xua.':'.$ncta[1].''.$xua.'');
  169. }
  170. foreach($arrh as $key=>$_arrh){
  171. if(!isset($rs[$key])){
  172. $k++;
  173. continue;
  174. }
  175. $vk = ''.$this->A[$k].''.$xua.'';
  176. $xlsfontcolor = $xlsbgcolor = '';
  177. $xlsbordercolor = $this->bordercolor;
  178. $xlsunderline = '';
  179. $xlsfontsize = '';
  180. $xlsalign = 'center'; //对齐方式
  181. $xlsbold = false; //是否加粗
  182. $xlsitalic = false; //是否斜体
  183. $val = $rs[$key];
  184. $vallen = strlen(''.$val.'');
  185. if($this->headWidth[$key][0]<$vallen)$this->headWidth[$key][0]=$vallen;
  186. if(is_array($_arrh)){
  187. if(isset($_arrh['xlsfontcolor']))$xlsfontcolor=$_arrh['xlsfontcolor'];
  188. if(isset($_arrh['xlsbgcolor']))$xlsbgcolor=$_arrh['xlsbgcolor'];
  189. if(isset($_arrh['xlsbordercolor']))$xlsbordercolor=$_arrh['xlsbordercolor'];
  190. if(isset($_arrh['xlsalign']))$xlsalign=$_arrh['xlsalign'];
  191. }
  192. if(isset($rs['xlsfontcolor']))$xlsfontcolor=$rs['xlsfontcolor'];
  193. if(isset($rs['xlsbordercolor']))$xlsbordercolor=$rs['xlsbordercolor'];
  194. if(isset($rs['xlsalign']))$xlsalign=$rs['xlsalign'];
  195. if(isset($rs['xlsbold']))$xlsbold=$rs['xlsbold'];
  196. if(isset($rs['xlsfontsize']))$xlsfontsize=$rs['xlsfontsize'];
  197. if(isset($rs['xlsunderline']))$xlsunderline=$rs['xlsunderline'];
  198. if(isset($rs[''.$key.'xlsfontcolor']))$xlsfontcolor=$rs[''.$key.'xlsfontcolor'];
  199. if(isset($rs[''.$key.'xlsbgcolor']))$xlsbgcolor=$rs[''.$key.'xlsbgcolor'];
  200. if(isset($rs[''.$key.'xlsbordercolor']))$xlsbordercolor=$rs[''.$key.'xlsbordercolor'];
  201. if(isset($rs[''.$key.'xlsalign']))$xlsalign=$rs[''.$key.'xlsalign'];
  202. if(isset($rs[''.$key.'xlsbold']))$xlsbold=$rs[''.$key.'xlsbold'];
  203. if(isset($rs[''.$key.'xlsfontsize']))$xlsfontsize=$rs[''.$key.'xlsfontsize'];
  204. if(isset($rs[''.$key.'xlsitalic']))$xlsitalic=$rs[''.$key.'xlsitalic'];
  205. if(isset($rs[''.$key.'xlsunderline']))$xlsunderline=$rs[''.$key.'xlsunderline'];
  206. $getStyle = $this->sheetObj->getStyle($vk);
  207. //设置背景色
  208. if($xlsbgcolor!=''){
  209. $getStyle->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
  210. $getStyle->getFill()->getStartColor()->setARGB('FF'.$xlsbgcolor.'');
  211. }
  212. //字体颜色
  213. if($xlsfontcolor!='')$getStyle->getFont()->getColor()->setARGB('FF'.$xlsfontcolor.'');
  214. if($xlsbold)$getStyle->getFont()->setBold(true);
  215. if($xlsitalic)$getStyle->getFont()->setItalic(true);//斜体
  216. if($xlsfontsize!='')$getStyle->getFont()->setSize($xlsfontsize);
  217. if($xlsunderline!='')$getStyle->getFont()->setUnderline($xlsunderline);//下划线情况double,双下划线、doubleAccounting,整个单元格双下划线、single,单下划线、singleAccounting,整个单元格单下划线
  218. //设置边框颜色
  219. if($xlsbordercolor!='000000')$getStyle->getBorders()->getAllborders()->getColor()->setARGB('FF'.$xlsbordercolor.'');
  220. //对齐方式
  221. if($xlsalign!='center')$getStyle->getAlignment()->setHorizontal($xlsalign);
  222. $this->sheetObj->setCellValue($vk, $val);
  223. $k++;
  224. }
  225. //设置行高
  226. $xlsrowheight = 0;
  227. if(isset($rs['xlsrowheight']))$xlsrowheight=$rs['xlsrowheight'];
  228. if($xlsrowheight != 0)$this->sheetObj->getRowDimension($r+$zta)->setRowHeight($xlsrowheight);
  229. }
  230. }
  231. /**
  232. 设置列宽
  233. */
  234. private function setColwidth()
  235. {
  236. $k=0;
  237. foreach($this->headWidth as $key=>$v){
  238. $w = $v[1];
  239. if($w<=0){
  240. $w= $v[0] * 1.2;
  241. }else{
  242. $w= $w/70*12;
  243. }
  244. if($w>0)$this->sheetObj->getColumnDimension($this->A[$k])->setWidth($w);
  245. $k++;
  246. }
  247. }
  248. /**
  249. 创建数据
  250. */
  251. public function createData()
  252. {
  253. $len1 = count($this->titleArray);
  254. $len2 = count($this->headArrArray);
  255. $len3 = count($this->rowsArray);
  256. if($len1==$len2 && $len2==$len3 && $len1>0){
  257. for($i=0; $i<$len1; $i++){
  258. $this->sheettitle = $this->titleArray[$i];
  259. $this->headArr = $this->headArrArray[$i];
  260. $this->rows = $this->rowsArray[$i];
  261. $this->titlebool = true;
  262. if(isset($this->titleboolArray[$i]))$this->titlebool=$this->titleboolArray[$i];
  263. $this->setHead($i);
  264. $this->setData();
  265. $this->setColwidth();
  266. }
  267. $this->excel->setActiveSheetIndex(0);
  268. }else{
  269. $this->setHead(0);
  270. $this->setData();
  271. $this->setColwidth();
  272. }
  273. $this->createbool = true;
  274. }
  275. /**
  276. 输出显示
  277. @param string $ext 输出类型 xls,xlsx
  278. @param string $type 是否直接下载
  279. @return string 文件名
  280. */
  281. public function display($ext='xls', $type='down')
  282. {
  283. if(!$this->createbool){
  284. $this->createData();
  285. }
  286. $title = $this->title;
  287. //有随机数
  288. $rand = '';
  289. if(contain($type,'rand'))$rand = date('YmdHis');
  290. $filename = ''.$title.''.$rand.'.'.$ext.'';
  291. //输出
  292. if($ext!='xlsx'){
  293. $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel5');
  294. }else{
  295. $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel2007'); //保存excel—2007格式或者
  296. }
  297. $backfile = 'down';
  298. //保存文件
  299. if(contain($type,'savelogs')){
  300. $dir = 'logs';
  301. $path = ''.ROOT_PATH.'/'.UPDIR.'/'.$dir.'/';
  302. if(!is_dir($path))mkdir($path);
  303. $savefile = $path.''.$this->iconvstr($filename).'';
  304. $objWriter->save($savefile); //是否保存本地
  305. $backfile = ''.UPDIR.'/'.$dir.'/'.$filename.'';
  306. }
  307. //下载
  308. if(contain($type, 'down')){
  309. header('Content-type: application/vnd.ms-excel');
  310. header('Content-Disposition: attachment; filename="'.iconv('utf-8', 'gbk', $filename).'"');
  311. header('Cache-Control: max-age=0');
  312. $objWriter->save('php://output');
  313. }
  314. return $backfile;
  315. }
  316. /**
  317. 编码转化
  318. */
  319. private function iconvstr($str)
  320. {
  321. if($this->pageCode=='utf-8')$str = iconv('utf-8', 'gbk', $str);
  322. return $str;
  323. }
  324. /**
  325. 合并单元格
  326. */
  327. public function mergeCells($cel1, $cel2, $val=null, $sheet=-1)
  328. {
  329. if($sheet != -1)$this->excel->setActiveSheetIndex($sheet);
  330. $this->excel->getActiveSheet()->mergeCells(''.$cel1.':'.$cel2.'');
  331. if($val != null)$this->sheetObj->setCellValue($cel1, $val);
  332. }
  333. }
粤ICP备19079148号