PhpSpreadsheet导入导出excel


简便方法:https://learnku.com/articles/59344

安装:

composer require phpoffice/phpspreadsheet
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as ReaderXlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;


/**
 * 导出excel表
 * $data:要导出excel表的数据,接受一个二维数组
 * $fileName:excel表的表名
 * $title:excel表的表头,接受一个一维数组
 * $sheetName:excel表的sheet名
 */
function exportExcel($fileName='', $title=[], $data=[],$sheetName=null,$type = null)
{
//    $data = array(0 => array(0 => 1, 1 => 'alex1', 2 => 1,),
//        1 => array(0 => 2, 1 => 'alex2', 2 => 2,),
//        2 => array(0 => 3, 1 => 'alex3', 2 => 1,),
//        3 => array(0 => 4, 1 => 'alex4', 2 => 2,),
//        4 => array(0 => 5, 1 => 'alex5', 2 => 1,),
//        5 => array(0 => 6, 1 => 'alex6', 2 => 2,));
//
//    $title = ['id', 'name', 'sex'];
    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
    //设置工作表标题名称
    if(isset($sheetName) && !empty($sheetName)){
        $sheet->setTitle($sheetName);
    }else{
        $sheet->setTitle(date('Y-m-d',time()));
    }
    // $sheet->getDefaultColumnDimension()->setWidth(40);
    $iRow=0;
    //设置单元格内容
    foreach ($title as $key => $value) {
        // 单元格内容写入
        $sheet->setCellValueByColumnAndRow($key + 1, 1, $value);     
        $iRow =$iRow +1;
        $colum=index2ColName($iRow);
        $sheet->getColumnDimension($colum)->setAutoSize(true);
        //设置单元格宽度  与setAutoSize 是冲突的
        //$sheet->getDefaultColumnDimension()->setWidth(20);
        //$sheet->getColumnDimension('B')->setWidth(50);
        $sheet->getStyle($colum.'1')->getFont()->setBold(true);
    }
    
    $row = 2; // 从第二行开始
    foreach ($data as $item) {
        $column = 1;
        foreach ($item as $value) {
            // 单元格内容写入
            $sheet->setCellValueByColumnAndRow($column, $row, $value);
            $column++;
        }
        $row++;
    }
    if(isset($type)){
        # 保存为xlsx
        $fileName = $fileName.'.Xlsx';
        $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
        $filePath = ROOT_PATH.'uploads/excel/'.$fileName;
        $writer->save($filePath);
        return $filePath;
        die;
    }else{
        # 浏览器下载
        $fileName = $fileName.'.Xlsx';
        $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
        ob_end_clean();
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="'.$fileName.'"');
        header('Cache-Control: max-age=0');
        $writer->save('php://output');
        //删除清空
        $spreadsheet->disconnectWorksheets();
        unset($spreadsheet);
        exit;
    }

}

//根据列数转Excel的列名;
function index2ColName($columnNumber)
{
    $dividend = $columnNumber;
    $columnName = '';
    while ($dividend > 0) {
        $modulo = ($dividend - 1) % 26;
        $columnName = chr(65 + $modulo) . $columnName;
        $dividend = (int)(($dividend - $modulo) / 26);
    }
    return $columnName;
}

//导入excel表
function importExcel($file='',$sheetName = 0){
    // 有Xls和Xlsx格式两种
    $objReader = IOFactory::createReader('Xls');
    if (!$objReader->canRead($file)) {
        $objReader = IOFactory::createReader('Xlsx');
    }
    $objPHPExcel = $objReader->load($file);  //$filename可以是上传的表格,或者是指定的表格
    $sheet = $objPHPExcel->getSheet($sheetName);   //excel中的第一张sheet
    $highestRow = $sheet->getHighestRow();       // 取得总行数
    $highestColumn = $sheet->getHighestColumn();   // 取得总列数
    //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
    for ($currentRow = 1; $currentRow <= $highestRow; $currentRow++) {
        //从哪列开始,A表示第一列
        for ($currentColumn = 'A'; $currentColumn <= $highestColumn; $currentColumn++) {
            //数据坐标
            $address = $currentColumn . $currentRow;
            //读取到的数据,保存到数组$data中
            $cell = $sheet->getCell($address)->getValue();

            if ($cell instanceof PHPExcel_RichText) {
                $cell = $cell->__toString();
            }
            $data[$currentRow - 1][$currentColumn] = $cell;
            //  print_r($cell);
        }
    }

    return $data;

}
/**
 * Created by PhpStorm.
 * function: imports
 * Description:导入excell
 */
function imports()
{
    header("Content-Type:text/html;charset = utf-8");

    $upload = new \Think\Upload();// 实例化上传类
    $upload->maxSize = 3145728;// 设置附件上传大小
    $upload->exts = array('xls', 'xlsx');// 设置附件上传类
    $upload->rootPath  = '../uploads/excel'; // 设置附件上传目录
    // 上传文件
    $info = $upload->uploadOne($_FILES['excelData']);
    $filename = $upload->rootPath . $info['savepath'] . $info['savename'];
    $exts = $info['ext'];
    if (!$info) {// 上传错误提示错误信息
        $this->error($upload->getError());
    } else {// 上传成功
        $this->data_import($filename, $exts,3);
    }

}

//上传excel
function import($request)
{
    //解决后缀获取不对的问题
    $file = $request->file('excel');
    $ext = $file->getClientOriginalExtension();
    $fileName = uniqid('', true) . '.' . $ext;
    $path = $file->storeAs('excel', $fileName, 'local');
    return storage_path('app') . "/" . $path;
}

另一种导出方式

/**
 * 数组转xls格式的excel文件
 * @param $data
 * @param $title
 * 示例数据
 * @throws PHPExcel_Exception
 * @throws PHPExcel_Reader_Exception
 * @throws PHPExcel_Writer_Exception
 */
function export_excel($data=array(),$title=array(),$filename='报表')
{
    //处理中文文件名
    ob_end_clean();
    Header('content-Type:application/vnd.ms-excel;charset=utf-8');
    header("Content-Disposition:attachment;filename=export_data.xls");
    //处理中文文件名
    $ua = $_SERVER["HTTP_USER_AGENT"];
    $encoded_filename = urlencode($filename);
    $encoded_filename = str_replace("+", "%20", $encoded_filename);
    if (preg_match("/MSIE/", $ua) || preg_match("/LCTE/", $ua) || $ua == 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko') {
        header('Content-Disposition: attachment; filename="' . $encoded_filename . '.xls"');
    }else {
        header('Content-Disposition: attachment; filename="' . $filename . '.xls"');
    }
    header ( "Content-type:application/vnd.ms-excel" );
    $html = "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>";
    $html.="<html xmlns='http://www.w3.org/1999/xhtml'>";
    $html.="<meta http-equiv='Content-type' content='text/html;charset=UTF-8' /><head><title>".$filename."</title>";
    $html.="<style>td{text-align:center;font-size:12px;font-family:Arial, Helvetica, sans-serif;border:#1C7A80 1px solid;color:#152122;";
    $html.="width:auto;}table,tr{border-style:none;}.title{background:#C60;color:#FFFFFF;font-weight:bold;}</style>";
    $html.="</head><body><table width='100%' border='1'><tr>";
    foreach($title as $k=>$v){
        $html .= " <td class='title' style='text-align:center;'>".$v."</td>";
    }
    $html .= "</tr>";
    foreach ($data as $key =>$value) {
        $html .= "<tr>";
        foreach($value as $aa){
            $html .= "<td>".$aa."</td>";
        }
        $html .= "</tr>";
    }
    $html .= "</table></body></html>";
    echo $html;
    exit;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值