文章不长,文章不长,文章不长本表格是模仿橙心优选团长面单来做的
先上表格
思路确定总共有多少列,需要确定表头要合并多少单元格,可以多预留 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如何写一个漂亮的表格的详细内容。
