ThinkPHP5 PHPExcel 导入和导出
1.必须要先下载一个插件,下载地址:https://github.com/PHPOffice/PHPExcel
也可以直接使用composer安装安装
composer require phpoffice/phpexcel
页面引入
use PHPExcel_IOFactory; use PHPExcel;
2.解压后,里面有个classes文件夹,我们需要把classes文件夹名修改为为PHPExcel
3.然后把他复制到根目录中的extend目录下.
4.然后,在控制器中这样引入
然后,在控制器中这样引入
引入方法1
import('phpexcel.PHPExcel', EXTEND_PATH);
引入方法2
require(Env::get('root_path') . 'extend/'."PHPExcel/PHPExcel.php");
也可以放在根目录中的/vendor/目录中
引入方法为
vendor("PHPExcel.PHPExcel");
导入
//示例 //TODO 先上传 保存文件 /*设置上传路径*/ $savePath = $this->up_path; $tmp_file = $_FILES ['file'] ['tmp_name']; $file_types = explode ( ".", $_FILES ['file'] ['name'] ); $file_type = $file_types [count ( $file_types ) - 1]; /*以时间来命名上传的文件*/ $str = '商保商品黑名单'.$pack_id.date ( 'Ymdhis' ); $file_name = $str . "." . $file_type; $file = $savePath . $file_name; /*是否上传成功*/ if (!copy ($tmp_file, $file)) { return ['code' => $params['error'], 'message' => '上传失败', 'data' => '']; } $extension = $file_type; if ($extension =='xlsx') { $objReader = new \PHPExcel_Reader_Excel2007(); $objExcel = $objReader ->load($file); } else if ($extension =='xls') { $objReader = new \PHPExcel_Reader_Excel5(); $objExcel = $objReader ->load($file); } else if ($extension=='csv') { $objReader = new \PHPExcel_Reader_CSV(); //默认输入字符集 $objReader->setInputEncoding('GBK'); //默认的分隔符 $objReader->setDelimiter(','); //载入文件 $objExcel = $objReader->load($file); } $sheet = $objExcel->getSheet(); // 获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推 $allColumn =$sheet->getHighestColumn(); // 获取总列数 $allRow = $sheet->getHighestRow();// 获取总行数 $ColumnNum = \PHPExcel_Cell::columnIndexFromString($allColumn); // 列号 转 列数 for ($rowIndex = 2; $rowIndex <= $allRow; $rowIndex++) { //循环读取每个单元格的内容。注意行从1开始,列从A开始 for ($colIndex = 0; $colIndex < $ColumnNum; $colIndex++) { $goods_info[$rowIndex - 2][] = (string)$sheet->getCellByColumnAndRow($colIndex, $rowIndex)->getValue(); } } //处理完数据删除文件 unlink($file);
导出
//示例 //TODO 超时设置 ignore_user_abort(true); set_time_limit(0); ini_set("memory_limit", "-1"); $obpe = new \PHPExcel(); //TODO 设置外边框 $styleThinBlackBorderOutline = array( 'borders' => array( 'outline' => array( 'style' => 'thin', //设置border样式 'color' => array('rgb' => 'D9E0EC'), //设置border颜色 ), ), 'alignment' => array( 'horizontal' => 'left', ), ); //TODO 设置表格宽度 $obpe->getactivesheet()->getColumnDimension('A')->setWidth(20); $obpe->getactivesheet()->getColumnDimension('B')->setWidth(25); $obpe->getactivesheet()->getColumnDimension('C')->setWidth(30); $obpe->getactivesheet()->getColumnDimension('D')->setWidth(10); $obpe->getactivesheet()->getColumnDimension('E')->setWidth(10); $obpe->getactivesheet()->getColumnDimension('F')->setWidth(15); $obpe->getactivesheet()->getColumnDimension('G')->setWidth(10); $obpe->getactivesheet()->getColumnDimension('H')->setWidth(20); $obpe->getactivesheet()->getColumnDimension('I')->setWidth(40); //TODO 设置表头 $obpe->getactivesheet()->setcellvalue('A1', '支付时间')->getStyle('A1')->applyFromArray($styleThinBlackBorderOutline);; $obpe->getactivesheet()->setcellvalue('B1', '订单号')->getStyle('B1')->applyFromArray($styleThinBlackBorderOutline);; $obpe->getactivesheet()->setcellvalue('C1', '第三方单号')->getStyle('C1')->applyFromArray($styleThinBlackBorderOutline);; $obpe->getactivesheet()->setcellvalue('D1', '支付类型')->getStyle('D1')->applyFromArray($styleThinBlackBorderOutline);; $obpe->getactivesheet()->setcellvalue('E1', '支付金额')->getStyle('E1')->applyFromArray($styleThinBlackBorderOutline);; $obpe->getactivesheet()->setcellvalue('F1', '支付状态')->getStyle('F1')->applyFromArray($styleThinBlackBorderOutline);; $obpe->getactivesheet()->setcellvalue('G1', '退款金额')->getStyle('G1')->applyFromArray($styleThinBlackBorderOutline);; $obpe->getactivesheet()->setcellvalue('H1', '退款时间')->getStyle('H1')->applyFromArray($styleThinBlackBorderOutline);; $obpe->getactivesheet()->setcellvalue('I1', '退款原因')->getStyle('I1')->applyFromArray($styleThinBlackBorderOutline);; //TODO 设置行高 $obpe->getActiveSheet()->getRowDimension('1')->setRowHeight(17); $num = 0; $i = 1; $all_totalfee = 0; $all_refund = 0; $all_count = count($list); $all_refund_count = 0; //$list 需要导出的数据 foreach ($list as $key => $val) { $num++; if ($num == 1000) {//清空内存防止溢出 ob_flush(); flush(); $num = 0; } $i = $i + 1; $status = ''; if ($val['status'] == 1) { $status = '支付成功'; } else if ($val['status'] == 2) { $status = '退款中'; } else if ($val['status'] == 3) { $status = '退款成功'; } $obpe->getActiveSheet()->getRowDimension($i)->setRowHeight(17); $obpe->getactivesheet()->setcellvalue('A' . $i, '`' . $val['paytime'])->getStyle('A' . $i)->applyFromArray($styleThinBlackBorderOutline); $obpe->getactivesheet()->setcellvalue('B' . $i, '`' . $val['ordernum'])->getStyle('B' . $i)->applyFromArray($styleThinBlackBorderOutline); $obpe->getactivesheet()->setcellvalue('C' . $i, '`' . $val['transaction_id'])->getStyle('C' . $i)->applyFromArray($styleThinBlackBorderOutline); $obpe->getactivesheet()->setcellvalue('D' . $i, $val['channel'] == 1 ? "支付宝" : "微信")->getStyle('D' . $i)->applyFromArray($styleThinBlackBorderOutline); $obpe->getactivesheet()->setcellvalue('E' . $i, '`' . $val['totalfee'])->getStyle('E' . $i)->applyFromArray($styleThinBlackBorderOutline); $obpe->getactivesheet()->setcellvalue('F' . $i, $status)->getStyle('F' . $i)->applyFromArray($styleThinBlackBorderOutline); $obpe->getactivesheet()->setcellvalue('G' . $i, $val['status'] == 3 ? '`' . $val['totalfee'] : '')->getStyle('G' . $i)->applyFromArray($styleThinBlackBorderOutline); $obpe->getactivesheet()->setcellvalue('H' . $i, $val['refund_time'] ? '`' . date('Y-m-d H:i:s', $val['refund_time']) : '')->getStyle('H' . $i)->applyFromArray($styleThinBlackBorderOutline); $obpe->getactivesheet()->setcellvalue('I' . $i, $val['refund_reason'])->getStyle('I' . $i)->applyFromArray($styleThinBlackBorderOutline); $all_totalfee = $val['totalfee']+$all_totalfee; if($val['status'] == 3){ $all_refund = $val['totalfee']+$all_refund; $all_refund_count = $all_refund_count + 1; } } $i = $i+1; $obpe->getactivesheet()->setcellvalue('A' . $i, '')->getStyle('A' . $i)->applyFromArray($styleThinBlackBorderOutline); $i = $i+1; $obpe->getactivesheet()->setcellvalue('D' . $i, '总计')->getStyle('A' . $i)->applyFromArray($styleThinBlackBorderOutline); $obpe->getactivesheet()->setcellvalue('E' . $i, (string)$all_totalfee)->getStyle('C' . $i)->applyFromArray($styleThinBlackBorderOutline); $obpe->getactivesheet()->setcellvalue('G' . $i, (string)$all_refund)->getStyle('E' . $i)->applyFromArray($styleThinBlackBorderOutline); $obpe->setactivesheetindex(0); //工作副本1 $obpe->getActiveSheet(0)->setTitle('商保普惠明细'); $fileName = $other['drugstoresInfo']['name'] . '商保普惠明细'; if ($other['postdata']['start_time'] == $other['postdata']['end_time']) { $fileName .= "_{$other['postdata']['start_time']}.xls"; } else { $fileName .= "_{$other['postdata']['start_time']}到{$other['postdata']['start_time']}.xls"; } $obpe->setActiveSheetIndex(0); header('Content-Type: application/vnd.ms-excel'); header("Content-Disposition: attachment;filename=\"$fileName\""); header('Cache-Control: max-age=0'); //写入类容 $obwrite = \PHPExcel_IOFactory::createWriter($obpe, 'Excel5'); //保存文件 ob_start(); $obwrite->save('php://output'); //文件通过浏览器下载 $xlsData = ob_get_contents(); ob_end_clean(); $data = [ 'file' => "data:application/vnd.ms-excel;base64," . base64_encode($xlsData), 'file_name' => $fileName ]; return ['code' => $this->successCode, 'message' => '操作成功', 'data' => $data];
require(Env::get('root_path') . 'extend/'."PHPExcel/PHPExcel.php");
Thinkphp5使用PHPExcel包操作excel示例