-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathExcel.php
107 lines (99 loc) · 3.92 KB
/
Excel.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<?php
namespace app\common\library;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
/**
* Excel处理
*/
class Excel
{
/**
* excel表格导出
* @param string $fileName 文件名称 $name='测试导出';
* @param array $headArr 表头名称 $header=['表头A','表头B'];
* @param array $data 要导出的数据 $data=[['测试','测试'],['测试','测试']]
* @param bool $auto 是否开启根据表头自适应宽度 默认开启
*/
public static function excelExport($fileName = '', $headArr = [], $data = [], $auto = true)
{
$fileName .= '-' . time() . ".xlsx";
$objPHPExcel = new Spreadsheet();
$objPHPExcel->getProperties();
$key = ord("A"); // 设置表头
$key2 = ord("@"); // 超过26列会报错的解决方案
// 居中
$objPHPExcel->getDefaultStyle()->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
$objPHPExcel->getDefaultStyle()->getAlignment()->setVertical(Alignment::VERTICAL_CENTER);
// 设置表头
foreach ($headArr as $v) {
// 超过26列会报错的解决方案
if ($key > ord("Z")) {
$key2 += 1;
$key = ord("A");
$colum = chr($key2) . chr($key); //超过26个字母时才会启用
} else {
if ($key2 >= ord("A")) {
$colum = chr($key2) . chr($key);
} else {
$colum = chr($key);
}
}
// 写入表头
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum . '1', $v);
// 自适应宽度
if ($auto) {
$len = strlen(iconv('utf-8', 'gbk', $v));
$objPHPExcel->getActiveSheet()->getColumnDimension($colum)->setWidth($len + 5);
}
$key += 1;
}
$column = 2;
$objActSheet = $objPHPExcel->getActiveSheet();
// 写入行数据
foreach ($data as $key => $rows) {
$span = ord("A");
$span2 = ord("@");
// 按列写入
foreach ($rows as $keyName => $value) {
// 超过26列会报错的解决方案
if ($span > ord("Z")) {
$span2 += 1;
$span = ord("A");
$tmpSpan = chr($span2) . chr($span); //超过26个字母时才会启用
} else {
if ($span2 >= ord("A")) {
$tmpSpan = chr($span2) . chr($span);
} else {
$tmpSpan = chr($span);
}
}
// 写入数据
$objActSheet->setCellValue($tmpSpan . $column, $value);
$span++;
}
$column++;
}
// 自动加边框
// $styleThinBlackBorderOutline = array(
// 'borders' => array(
// 'allborders' => array( //设置全部边框
// 'style' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN //粗的是thick
// ),
// ),
// );
// $objPHPExcel->getActiveSheet()->getStyle('A1:' . $colum . --$column)->applyFromArray($styleThinBlackBorderOutline);
// 重命名表
$fileName = iconv("utf-8", "gbk", $fileName);
// 设置活动单指数到第一个表,所以Excel打开这是第一个表
$objPHPExcel->setActiveSheetIndex(0);
ob_end_clean();
ob_start();
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Disposition: attachment;filename=$fileName");
header('Cache-Control: max-age=0');
$writer = new Xlsx($objPHPExcel);
$writer->save('php://output'); // 文件通过浏览器下载
exit();
}
}