1
0

PHPExcelChajian.php 13 KB

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