Home  >  Article  >  Backend Development  >  Detailed explanation of how to write a beautiful form in PhpOffice

Detailed explanation of how to write a beautiful form in PhpOffice

藏色散人
藏色散人forward
2021-01-25 12:03:145413browse

Recommended: "PHP Video Tutorial"

The article is not long, the article is not long, the article is not long

This form It is made by imitating the Orange Heart Selection group leader’s face sheet

First enter the form

PhpOffice 写一个漂亮的表格

Idea

  • To determine how many columns there are in total, you need to determine how many cells to merge in the header. You can reserve 1~2 more columns. If they are not used, finally set the width to 0
  • The rest is to merge cells and set cell styles

excel partial class structure

Note that the columns inside Some of what comes out are method names, and some are class attributes, and only the attributes used in this article are listed. For details, you have to look at the corresponding class file

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

Instantiation

The following examples will use the following variables

$spreadsheet = new Spreadsheet();       // 实例化 excel 操作类,默认初始化 sheet 序号为 0

$sheet = $spreadsheet->getActiveSheet(0);       // 拿到要操作的 sheet,必须是已存在的

// 获取操作表格样式的类(全局样式)
$defaultStyle = $spreadsheet->getDefaultStyle();        // PhpOffice\PhpSpreadsheet\Style\Style 实例

Usage examples

Set the table style

Operation text alignment
// 获取操作对齐方式 类
$align = $defaultStyle->getAlignment();

// 设置 Horizontal(水平) 和 Vertical(垂直) 都居中,一个类中的方法,可以连贯操作
$align->setHorizontal(Alignment::HORIZONTAL_CENTER)->setVertical(Alignment::VERTICAL_CENTER)

// 仅水平居中
$align->setHorizontal(Alignment::HORIZONTAL_CENTER);
// 仅垂直居中
$align->setVertical(Alignment::VERTICAL_CENTER);
Operation border
// 获取操作对齐方式 类
$border = $defaultStyle->getBorders();
// 设置底部边框
$border->getBottom()->setBorderStyle(Border::BORDER_THIN)
Operation font
// 获取字体操作类
$font = $defaultStyle->getFont()

// 设置字体 18, 加粗,加下划线
$font->setSize(18)->setBold(true)->setUnderline(Font::UNDERLINE_SINGLE);
// 操作颜色,需要先获取颜色操作 类
$font->getColor()->setRGB('333333');
Operation column
$column = $sheet->getColumnDimension('A')

// 设置列宽
$column->setWidth(7);

Complete and directly runable example

// 引入必要类
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');

The above is the detailed content of Detailed explanation of how to write a beautiful form in PhpOffice. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:learnku.com. If there is any infringement, please contact admin@php.cn delete