最新公告
  • 欢迎您光临吆喝资源网,本站提供站长亲测的网站源码下载,打造专业的源码网!立即加入我们
  • 详解PhpOffice如何写一个漂亮的表格

    推荐:《PHP视频教程》

    文章不长,文章不长,文章不长

    本表格是模仿橙心优选团长面单来做的

    先上表格

    PhpOffice 写一个漂亮的表格

    思路

    • 确定总共有多少列,需要确定表头要合并多少单元格,可以多预留 1~2 列,如果用不到,最后把宽度设置为 0
    • 剩下的就是合并单元格,设置单元格样式

    excel 部分类结构

    注意,里面列出来的有些是方法名,有些是类属性,并且只列出来了本文中使用的属性,具体还要去看看相应的类文件

    Speadsheet      // 实例化 excel
        Sheet           // 当前活动 sheet   PhpOffice/PhpSpreadsheet/Worksheet/Worksheet
            getColumnDimension  // 操作列
                width               // 设置列宽
                autoSize            // 自动大小
            getRowDimension     // 操作行
                height              // 设置行高
            getCell             // 获取要操作的单元格(An:Gn),如 (A2:G7)
                style
                    同Speadsheet 下的 Style
                setValue            // 设置值
            mergeCell           // 合并单元格
            pageSetup           // 页面设置,包含纸张大小,比如 A4
                ...
            pageMargins         // 页边距
                ...
            headerFooter        // 页眉页脚
                ...
            ...
        Style           // 处理样式             PhpOffice/PhpSpreadsheet/Style/Style
            Font                // 处理字体
                size                // 字体大小
                bold                // 加粗
                underline           // 下划线
                color               // 处理颜色
                    argb                // 带透明度颜色
                    rgb                 // 颜色
            Fill                // 处理填充
                fillType            // 填充方式
                startColor          // 开始颜色(不清楚用处)
                endColor            // 结束颜色(不清楚用处)
                color           // 处理颜色
                    argb                // 带透明度颜色 背景色带透明
                    rgb                 // 颜色         背景色
            Borders
            Alignment
            NumberFormat
            Protection

    实例化

    之后的例子,将使用下面的变量

    $spreadsheet = new Spreadsheet();       // 实例化 excel 操作类,默认初始化 sheet 序号为 0
    
    $sheet = $spreadsheet->getActiveSheet(0);       // 拿到要操作的 sheet,必须是已存在的
    
    // 获取操作表格样式的类(全局样式)
    $defaultStyle = $spreadsheet->getDefaultStyle();        // PhpOffice/PhpSpreadsheet/Style/Style 实例

    使用示例

    设置表格样式

    操作文字对齐方式
    // 获取操作对齐方式 类
    $align = $defaultStyle->getAlignment();
    
    // 设置 Horizontal(水平) 和 Vertical(垂直) 都居中,一个类中的方法,可以连贯操作
    $align->setHorizontal(Alignment::HORIZONTAL_CENTER)->setVertical(Alignment::VERTICAL_CENTER)
    
    // 仅水平居中
    $align->setHorizontal(Alignment::HORIZONTAL_CENTER);
    // 仅垂直居中
    $align->setVertical(Alignment::VERTICAL_CENTER);
    操作边框
    // 获取操作对齐方式 类
    $border = $defaultStyle->getBorders();
    // 设置底部边框
    $border->getBottom()->setBorderStyle(Border::BORDER_THIN)
    操作字体
    // 获取字体操作类
    $font = $defaultStyle->getFont()
    
    // 设置字体 18, 加粗,加下划线
    $font->setSize(18)->setBold(true)->setUnderline(Font::UNDERLINE_SINGLE);
    // 操作颜色,需要先获取颜色操作 类
    $font->getColor()->setRGB('333333');
    操作列
    $column = $sheet->getColumnDimension('A')
    
    // 设置列宽
    $column->setWidth(7);

    完整可直接运行示例

    // 引入必要类
    use PhpOffice/PhpSpreadsheet/Spreadsheet;
    use PhpOffice/PhpSpreadsheet/Writer/Xlsx;
    use PhpOffice/PhpSpreadsheet/Style/Alignment;
    use PhpOffice/PhpSpreadsheet/Style/Fill;
    use PhpOffice/PhpSpreadsheet/Style/Border;
    
    $spreadsheet = new Spreadsheet();
    
    // 获取活动 sheet
    $sheet = $spreadsheet->getActiveSheet(0);
    // 设置表格全部上下居中
    $defaultStyle = $spreadsheet->getDefaultStyle();
    $defaultStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER)->setVertical(Alignment::VERTICAL_CENTER);
    $defaultStyle->getFont()->getColor()->setRGB('333333');
    
    // 设置列宽
    $sheet->getColumnDimension('A')->setWidth(7);
    $sheet->getColumnDimension('B')->setWidth(35);
    $sheet->getColumnDimension('C')->setWidth(11);
    $sheet->getColumnDimension('D')->setWidth(12);
    $sheet->getColumnDimension('E')->setWidth(12);
    $sheet->getColumnDimension('F')->setWidth(0);           // 预留列
    $sheet->getColumnDimension('G')->setWidth(14);
    
    $line = 1;
    // 大标题
    // 合并单元格
    $sheet->mergeCells('A'. $line .':G'. $line);            // 合并单元格
    $sheet->getRowDimension($line)->setRowHeight(40);       // 设置行高
    $ATitle = $sheet->getCell('A' . $line);                 // 获取单元格
    $ATitle->getStyle('A' . $line)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);        // 内容水平居中
    $ATitle->getStyle('A' . $line)->getFont()->setSize(22)->setBold(true);                              // 字体大小,加粗
    $ATitle->setValue('Smallnews - 门店订单');
    
    $line ++;
    // 店长信息
    $sheet->mergeCells('A' . $line . ':G' . $line);
    $sheet->getStyle('A' . $line . ':G' . $line)->getBorders()->getBottom()->setBorderStyle(Border::BORDER_THIN);       // 下边框样式
    $AStore = $sheet->getCell('A' . $line);
    $AStore->getStyle('A' . $line)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT);                          // 内容水平居左
    $AStore->getStyle('A' . $line)->getFont()->setSize(16)->setBold(true);                                              // 字体大小,加粗
    $AStore->setValue('Smallnews/157****1560');
    
    $line ++;
    // 门店地址
    $sheet->mergeCells('A' . $line . ':G' . $line);
    $AAddress = $sheet->getCell('A' . $line);
    $AAddress->getStyle('A' . $line)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT);
    $AAddress->getStyle('A' . $line)->getFont()->setSize(14);
    $AAddress->setValue('北京望京 SOHO');
    
    $line ++;
    // 运单统计
    $sheet->mergeCells('A' . $line . ':B' . $line);         // AB 合并
    $sheet->getRowDimension($line)->setRowHeight(40);       // 设置行高
    $ATotalOrder = $sheet->getCell('A' . $line);
    $ATotalOrder->getStyle('A' . $line)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT)->setVertical(Alignment::VERTICAL_BOTTOM);        // 内容水平居左,垂直居下
    $ATotalOrder->getStyle('A' . $line)->getFont()->setSize(12);
    $ATotalOrder->setValue('订单数量:5');
    
    $sheet->mergeCells('C' . $line . ':D' . $line);         // CD 合并
    $CTotalGoods = $sheet->getCell('C' . $line);
    $CTotalGoods->getStyle('C' . $line)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT)->setVertical(Alignment::VERTICAL_BOTTOM);        // 内容水平居左,垂直居下
    $CTotalGoods->getStyle('C' . $line)->getFont()->setSize(12);
    $CTotalGoods->setValue('商品总量:20');
    
    $sheet->mergeCells('E' . $line . ':G' . $line);         // EFG 合并
    $ESend = $sheet->getCell('E' . $line);
    $ESend->getStyle('E' . $line)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT)->setVertical(Alignment::VERTICAL_BOTTOM);             // 内容水平居左,垂直居下
    $ESend->getStyle('E' . $line)->getFont()->setSize(12);
    $ESend->setValue('发货时间:' . date('Y-m-d'));
    
    $line ++;
    // 增加一个空行,充当上下内容的 margin
    $sheet->mergeCells('A' . $line . ':G' . $line);
    $sheet->getRowDimension($line)->setRowHeight(6);
    
    $line ++;
    
    // 模拟订单数据
    $orders = [
        ['items' => [
            ['goods_title' => '这是个名字很长的商品,真的很长, 不信你看,肯定超过了表格宽度'],
            ['goods_title' => '这是个名字比较短的商品'],
        ]],
        ['items' => [
            ['goods_title' => '转向 卫衣秋季潮牌新款宽松时尚套头紫橘色橙色短款连帽卫衣女'],
            ['goods_title' => '芙清医美面膜医用男女淡化痘印抗菌敷料水光针术后修复皮炎祛痘'],
            ['goods_title' => '经典麻辣锅底'],
        ]]
    ];
    
    // 订单数据 
    foreach ($orders as $order) {
        // 购买信息
        $sheet->getRowDimension($line)->setRowHeight(30);
        $sheet->getStyle('A' . $line . ':G' . $line)->getFont()->setSize(14);
        $sheet->getStyle('A' . $line . ':G' . $line)->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB('CCCCCC');
        $sheet->mergeCells('A' . $line . ':B' . $line);
        $AUser = $sheet->getCell('A' . $line);
        $AUser->getStyle('A' . $line)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT);
        $AUser->getStyle('A' . $line)->getFont()->setSize(15)->setBold(true);
    
        // 模拟用户数据
        $user = [ 'nickname' => 'Smallnews', 'mobile' => '15788881560' ];
        $nickname = mb_strlen($user['nickname']) > 7 ? mb_substr($user['nickname'], 0, 6) . '**' : $user['nickname'];
        $AUser->setValue($nickname . ($user['mobile'] ?  ' /  ' .substr($user['mobile'], 0, 3) . '****' . substr($user['mobile'], 7) : ''));
    
        $sheet->mergeCells('C' . $line . ':G' . $line);
        $CTotal = $sheet->getCell('C' . $line);
        $CTotal->getStyle('C' . $line)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT);
        $CTotal->getStyle('C' . $line)->getFont()->setSize(14);
        $CTotal->setValue('共 2 种商品,共 3 件,实付 200 元');
    
        $line++;
        // 增加一个空行,充当上下内容的 margin
        $sheet->mergeCells('A' . $line . ':G' . $line);
        $sheet->getRowDimension($line)->setRowHeight(6);
    
        $line ++;
        // 订单商品信息
        $sheet->getStyle('A' . $line . ':G' . ($line + count($order['items'])))->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN);     // 根据商品数量, 设置区域的边框
    
        $sheet->setCellValue('A' . $line, '序号');
        $sheet->setCellValue('B' . $line, '商品名称');
        $sheet->setCellValue('C' . $line, '单价');
        $sheet->setCellValue('D' . $line, '优惠');
        $sheet->setCellValue('E' . $line, '数量');
        $sheet->setCellValue('F' . $line, '');
        $sheet->setCellValue('G' . $line, '是否提货');
    
        foreach ($order['items'] as $key => $item) {
            $line ++;
            $sheet->setCellValue('A' . $line, ($key + 1));
            $sheet->getStyle('B' . $line)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT);               // 商品名称 水平居左
            $goods_title = mb_strlen($item['goods_title']) > 16 ? mb_substr($item['goods_title'], 0, 14) . '**' : $item['goods_title'];
            $sheet->setCellValue('B' . $line, $goods_title);
            $sheet->setCellValue('C' . $line, '22.22');
            $sheet->setCellValue('D' . $line, '11.11');
            $sheet->setCellValue('E' . $line, 3);
            $sheet->setCellValue('F' . $line, '');
            $sheet->setCellValue('G' . $line, '');
        }
    
        $line++;
        $sheet->mergeCells('A' . $line . ':G' . $line);
        $sheet->getRowDimension($line)->setRowHeight(6);
        $line++;
    }
    
    ob_end_clean();
    header('pragma:public');
    header('Content-type:application/vnd.ms-excel;charset=utf-8;name="' . '门店面单' . '.xls"');
    header("Content-Disposition:attachment;filename=门店面单.xls"); //attachment新窗口打印inline本窗口打印
    $writer = /PhpOffice/PhpSpreadsheet/IOFactory::createWriter($spreadsheet, 'Xlsx');
    $writer->save('php://output');

    以上就是详解PhpOffice如何写一个漂亮的表格的详细内容,更多请关注吆喝资源网其它相关文章!

    本文转自PHP中文网,吆喝网(http://yaoohe.com)搜集整理,如有疑问请联系本站客服!

    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,默认解压密码为"yaoohe.com",如遇到无法解压的请联系管理员!
    8. 特别声明:本站源码除标明“已测试”外,其它都未测试,有BUG概本站概不负责。
    吆喝资源网 » 详解PhpOffice如何写一个漂亮的表格

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    吆喝资源网
    一个高级程序员模板开发平台

    发表评论

    • 6765会员总数(位)
    • 19292资源总数(个)
    • 60本周发布(个)
    • 0 今日发布(个)
    • 1823稳定运行(天)

    专业的网站源码网,提供精品php网站源码下载,小程序源码下载等!!

    小程序源码 了解详情
    升级SVIP尊享更多特权立即升级