文章不長,文章不長,文章不長
本表格是模仿橙心優選
團長面單來做的
先上表格
思路
- 確定總共有多少列,需要確定表頭要合併多少單元格,可以多預留 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');
本作品採用《CC 協議》,轉載必須註明作者和本文連結