PHPExcel 写入数据并下载 excel 或 保存至 excel 文件

下载

点击下载 PHPExcel 包


适用于 PHP7.4 以下版本

代码

// 第一步 - 准备下载数据

require_once "/vendor/PHPExcel/PHPExcel.php";

// 导出数据
$data = array(
    0=>array(
        'mobiles'=>'13555555555',
        'gender'=>'男',
        'age'=>'25',
    ),
    1=>array(
        'mobiles'=>'15333333333',
        'gender'=>'女',
        'age'=>'24',
    )
);

// 数据列表头
$cellName = array(
    'mobiles'=>'电话',
    'gender'=>'性别',
    'age'=>'年龄',
);

\PHPExcel::exportData($data, $cellName);


下边是我写的自定义函数,根据自己需要调整~~

/********************** 自定义函数开始 **********************/
/**
 * @author WangWeiChen
 * @mail 97975530@qq.com
 * @date 2022-01-12  16:00
 */
/**
 * [getTableHeader 根据数据列表头,获取对应的 EXCEL 列名, 最多只能获取到 Z 列~~]
 * @param  array $cellName [数据列表头数组 array('name=>'名称','gender'=>'性别','age'=>'年龄')]
 * @return array $header [字母列 array('A','B','C')]
 */
function getTableHeader($cellName){
    $count = count($cellName);
    $header = array();
    for($i='A',$k=0; $i<='Z'; $i++,$k++){
        if($k == $count){
            break;
        }
        $header[] = $i;
    }
    return $header;
}

    /**
     * [exportData 导出Excel表格]
     * @param array  $data [数据]
     * @param array  $cellName [数据列表头]
     * @param string $fileName [文件名]
     * @param string $sheet_name [sheet表 名称]
     * @param string $title [首行标题]
     * @param string $type [状态: upload-下载 save:保存至本地]
     * @throws PHPExcel_Exception
     * @throws PHPExcel_Reader_Exception
     * @throws PHPExcel_Writer_Exception
     */
    Static function exportData($data, $cellName = array(), $fileName = '', $sheet_name = 'Worksheet', $title = '', $type = 'upload'){
        $time = time();
    
        if (empty($data)) exit(json_encode(array('code'=>1001, 'msg'=>'导出数据为空')));
        if (empty($cellName)) exit(json_encode(array('code'=>1001, 'msg'=>'数据列表头为空')));
        if (empty($fileName)) $fileName = date('Y-m-d H-i-s', $time);
        $suffix = '.xls';
        
        $objPHPExcel = new PHPExcel();
        $sheet = $objPHPExcel->getActiveSheet(); // 当前活动 sheet
        $topNumber = 1; // 起始行为第一行
    
        // 根据数据列表头,获取对应的 EXCEL 列名
        $cell = $objPHPExcel->getTableHeader($cellName);
        
        // 获取数据列表头键名, 例 array('name','gender','age)
        $cellNameKey = array_keys($cellName);
        
        // 将表头插入数据数组
        $cellNameArray[0] = $cellName;
        $newData = array_merge($cellNameArray, $data);
        
        // 处理首行标题 开始
            if(!empty($title)){
                $sheet->mergeCells("A{$topNumber}:" . end($cell) . $topNumber); // 合并必须放到第一步
                
                $objPHPExcel->setActiveSheetIndex(0)->setCellValue("A{$topNumber}", $title); // 插入内容
                $sheet->getRowDimension($topNumber)->setRowHeight(26); // 行高
    
                // 内容对齐方式
                $sheet->getStyle("A{$topNumber}")
                    ->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER) // 水平居中
                    ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); // 垂直居中
    
                // 内容格式
                $sheet->getStyle("A{$topNumber}")
                    ->applyFromArray(['font' => ['bold' => true]]) // 加粗
                    ->getFont()->setSize(16); // 字体大小
                
                $topNumber += 1; // 如果有首行标题,则数据从第二行开始
            }
        // 处理首行标题 结束
    
        $startRow = $topNumber; // 数据在表格中的起始行

        // 处理列表头 - 开始
            $sheet->getRowDimension($startRow)->setRowHeight(22); //行高
        
            // 内容对齐方式
            $sheet->getStyle("A{$startRow}:" . end($cell) . $startRow)
                ->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER) // 水平居中
                ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); // 垂直居中
            
            // 内容格式
            $sheet->getStyle("A{$startRow}:" . end($cell) . $startRow)
                ->applyFromArray(['font' => ['bold' => true]]) // 加粗
                ->getFont()->setSize(14); // 字体大小
            
            // 背景颜色
            $sheet->getStyle("A{$startRow}:" . end($cell) . $startRow)
                ->getFill()
                ->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)
                ->getStartColor()
                ->setRGB('C0C0C0');
        
            // 设置边框
            $border_style= array('borders' => array('allborders' => array('style' => PHPExcel_Style_Border::BORDER_THIN)));
            $sheet->getStyle("A{$startRow}:" . end($cell) . $startRow)->applyFromArray($border_style);
        // 处理列表头 - 结束
    
        // 公众设置
        $objPHPExcel->getDefaultStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); // 表格内容默认水平居中
        $objPHPExcel->getDefaultStyle()->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);  // 表格内容默认垂直居中
        $sheet->setTitle($sheet_name); // 设置活动 sheet 名称
        
        // 插入数据
        $cellLen = array();
        foreach($newData as $dataKey=>$dataVal){
            foreach($cellNameKey as $indexKey=>$indexVal){
                $cellLen[$cell[$indexKey]] = $len = $cellLen[$cell[$indexKey]] > strlen($dataVal[$indexVal]) ? $cellLen[$cell[$indexKey]] : strlen($dataVal[$indexVal]); // 根据数据宽度自动设置列宽
                $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension($cell[$indexKey])->setWidth($len+2);
                $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cell[$indexKey].$startRow,$dataVal[$indexVal]);
            }
            $startRow++;
        }
    
       $objWrite = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    
        $ua = $_SERVER["HTTP_USER_AGENT"];
    
        ob_end_clean();
    
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        if ($suffix == '.xlsx') {
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        } else {
            header('Content-Type: application/vnd.ms-excel');
        }
        if (preg_match("/MSIE/", $ua) || preg_match('/edge/', $ua) || preg_match('/edg/', $ua)) {
            $encoded_filename = urlencode($fileName);
            $encoded_filename = str_replace("+", "%20", $encoded_filename);
            header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
        } else if (preg_match("/Firefox/", $ua)) {
            header('Content-Disposition: attachment; filename*="utf8\'\'' . $fileName . '"');
        } else if (preg_match("/Safari/", $ua) || preg_match("/WeChat/", $ua)) {
            $attachment = 'attachment; filename*=utf-8\'\'' . rawurlencode($fileName);
            header('Content-Disposition: ' . $attachment);
        } else {
            header('Content-Disposition: attachment; filename="' . $fileName .  '"');
        }
        header("Content-Transfer-Encoding: binary");
        header("Pragma: no-cache");
        
        if ($type == 'upload'){
            $objWrite->save('php://output');
        } else {
            $objWrite->save($_SERVER['DOCUMENT_ROOT'] . CLUE_UPLOAD_PATH . $fileName);
        }
        exit();
    }
/********************** 自定义函数结束 **********************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端木木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值