利用PHPExcel导出excel文件的方法详解
最近工作中需要用到phpexcel导出excel表格。自动存储在固定位置。
之前导出excel使用header原生导出。
但是这种方法,我没有找到可以自动存储的功能。
如果你知道,请在下方留言,一起学习下。
先说一下header导出。
我这里使用的是thinkphp3.2框架.
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /** * 导出excel表格 */ public function actionPutExcel() { $admin = M( 'admin' ); $dbbacklist = $admin ->select(); $title = [ "序号" , "用户名" , "密码" , "登陆时间" ]; exportexcel( $dbbacklist , $title ); } /** 导出数据为excel表格 * @param $data 一个二维数组,结构如同从数据库查出来的数组 * @param $title excel的第一行标题,一个数组,如果为空则没有标题 * @param $filename 下载的文件名 */ function exportexcel( $data = array (), $title = array (), $filename = 'report' ){ ob_end_clean(); ob_start(); header( "Content-type:application/octet-stream" ); header( "Accept-Ranges:bytes" ); header( "Content-type:application/vnd.ms-excel" ); header( "Content-Disposition:attachment;filename=" . $filename . ".xls" ); header( "Pragma: no-cache" ); header( "Expires: 0" ); //导出xls 开始 if (! empty ( $title )){ foreach ( $title as $k => $v ) { $title [ $k ]=iconv( "UTF-8" , "GB2312" , $v ); } $title = implode( " " , $title ); echo " $title "; } if (! empty ( $data )){ foreach ( $data as $key => $val ){ foreach ( $val as $ck => $cv ) { $data [ $key ][ $ck ]=iconv( "UTF-8" , "GB2312" , $cv ); } $data [ $key ]=implode( " " , $data [ $key ]); } echo implode(" ", $data ); } } |
这个没啥说的,一共三个参数。传对了就可以了。
Phpexcel导出excel
官网
放到你能引到的地方。
我这里使用的是laravel5.8框架
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | /** * @name: 导出excel * @author: camellia * @date: 2021-03-08 * @param: $data array 导出数据 * @param: $filename string 文件名称 * @param: $tabhead array 单个表格头部 * @param: $rowwidth array 单个表格每行宽度 * @param: $setHeader bool 是否设置表头 * @param: $saveFile bool 是否保存文件 * @param: $sheetNameList array */ public function create_xls( $data , $filename , $tabhead = [], $rowwidth = [], $setHeader =true, $sheetNameList =[], $saveFile =false) { ini_set ( 'max_execution_time' , '0' ); $filename = str_replace ( '.xls' , '' , $filename ) . '.xls' ; $phpexcel = new \PHPExcel(); $phpexcel ->getProperties() ->setCreator( "Maarten Balliauw" ) ->setLastModifiedBy( "Maarten Balliauw" ) ->setTitle( "Office 2007 XLSX Test Document" ) ->setSubject( "Office 2007 XLSX Test Document" ) ->setDescription( "Test document for Office 2007 XLSX, generated using PHP classes." ) ->setKeywords( "office 2007 openxml php" ) ->setCategory( "Test result file" ); $arrayLevel = $this ->getArrayLevel( $data ); if ( $arrayLevel > 2) { foreach ( $data as $key => $item ) { //创建一个新的工作空间(sheet) $phpexcel ->createSheet(); $phpexcel ->setactivesheetindex( $key ); // 设置sheet title $phpexcel ->getActiveSheet()->setTitle( $sheetNameList [ $key ]); // 获取当前选中sheet对象 $objActSheet = $phpexcel ->getActiveSheet(); if ( $setHeader ) { $i = 1; if ( $tabhead ) { // 设置头部 foreach ( $tabhead as $key => $val ) { $phpexcel ->getActiveSheet()->setCellValue( $key , $val ); } // 文件内容插入表中 $i = 2; } /*设置宽度*/ foreach ( $rowwidth as $key => $val ) { $phpexcel ->getActiveSheet()->getColumnDimension( $key )->setWidth( $val ); } } else { $i = 1; } foreach ( $item as $value ) { /* excel文件内容 */ $j = 'A' ; foreach ( $value as $value2 ) { $objActSheet ->setCellValue( $j . $i , $value2 ); $j ++; } $i ++; } } } else { $phpexcel ->getActiveSheet()->setTitle( 'Sheet1' ); $phpexcel ->setActiveSheetIndex(0); $objActSheet = $phpexcel ->getActiveSheet(); if ( $setHeader ) { // 设置头部 foreach ( $tabhead as $key => $val ) { $phpexcel ->getActiveSheet()->setCellValue( $key , $val ); } /*设置宽度*/ foreach ( $rowwidth as $key => $val ) { $phpexcel ->getActiveSheet()->getColumnDimension( $key )->setWidth( $val ); } // 文件内容插入表中 $i = 2; } else { $i = 1; } foreach ( $data as $value ) { /* excel文件内容 */ $j = 'A' ; foreach ( $value as $value2 ) { $objActSheet ->setCellValue( $j . $i , $value2 ); $j ++; } $i ++; } } // $phpexcel->getActiveSheet()->fromArray($data); header( 'Content-Type: application/vnd.ms-excel' ); header( "Content-Disposition: attachment;filename=$filename" ); header( 'Cache-Control: max-age=0' ); header( 'Cache-Control: max-age=1' ); header( 'Expires: Mon, 26 Jul 1997 05:00:00 GMT' ); // Date in the past header( 'Last-Modified: ' . gmdate ( 'D, d M Y H:i:s' ) . ' GMT' ); // always modified header( 'Cache-Control: cache, must-revalidate' ); // HTTP/1.1 header( 'Pragma: public' ); // HTTP/1.0 $objwriter = \PHPExcel_IOFactory::createWriter( $phpexcel , 'Excel5' ); if ( $saveFile ) { $objwriter ->save( '/usr/share/nginx/html/xxxx/xxxxx/xxxxxx/' . $filename ); //这是自动存储到指定位置 $url = getenv ( 'APP_URL' ). "/xxxxx/xxxx/xxxxxx/" . $filename ; return $url ; } else { $objwriter ->save( 'php://output' ); //这是输出浏览器 exit ; } } /** * 返回数组的维度 * @author: camellia * @date: 2021-03-08 * @param [array] $arr [要判断的数组] * @return [number] [纬度数字] */ public function getArrayLevel( $arr ) { $al = array (0); function aL( $arr , & $al , $level = 0) { if ( is_array ( $arr )) { $level ++; $al [] = $level ; foreach ( $arr as $v ) { aL( $v , $al , $level ); } } } aL( $arr , $al ); return max( $al ); } |
上边的例子是我自己在用的。重要的地方基本上都有注释。对应的参数方法的注释中都有说明,对应的传参就可以了。
Phpexcel导出excel表格功能相对多样化。但速度也相对慢一点。
在功能没有太多需求的情况下。还是用header好一点,主要是快,数据量大的情况下,提现尤为明显。
有个问题需要注意一下。每个单元格中如果数字太长就显示为科学计数了。
解决方法很简单:
在数字字符串前加一个空格使之成为字符串
就是这样:
?1 2 | $num = 123456789987456; $str = '' . $num ; |
直接给$num加引号使之成为字符串这个方法是否可行。我没试过,有兴趣可以试试。
就是这样:
?1 | $num = string( $num ); |
导出基本上就是这些了。
到此这篇关于利用PHPExcel导出excel文件的方法详解的文章就介绍到这了,更多相关PHPExcel导出excel文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://juejin.cn/post/7125960246073229348
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。