Dai Chong's blog

初识phpSpreadsheet

 PHPSpreadsheet是由老外使用纯PHP编写的Excel文件处理扩展,他使用的是最新写法,相比PHPExcel(已不再维护)性能提升巨大,使用方法和函数基本相同,可以完全的替代PHPExcel。使用PhpSpreadsheet可以轻松读取和写入Excel文档,支持Excel的所有操作。

软件依赖
  • PHP5.6或更高版本,推荐PHP7
  • php_zip扩展
  • php_gd2扩展
PHPSpreadsheet 特性
  • 支持导入和导出.xls,.xlsx,.html,.csv,.pdf等格式文件。

  • 提供丰富的API,提供单元格样式设置、Excel表格属性设置、图表设置等等诸多功能。使用PhpSpreadsheet完全可以生成一个外观结构都满足你的Excel表格文件。

  • 卓越的性能,尤其在PHP7上表现优异,比PHPExcel强大很多。

安装
1
composer require phpoffice/phpspreadsheet

实战

 下面咱们来做一个通用的导出Excel表格类。

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<?php

namespace app\common\library;

use app\common\exception\BusiException;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

/**
* 导出excel class
* @author daichongweb
*/
class Export
{
// 表格坐标
private $cellIndex = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ'];

// 默认配置
public $config = [
'bold' => true, // 加粗
'size' => 12, // 文字大小
'column' => 4, // 设置列数
'title' => '默认导出', // 表格标题
'name' => '特抱抱', // 文件名
'type' => 'Xls', // 导出格式
];

// 默认表头
public $tableHeader = [
'php',
'vue',
'java',
'go',
];

// 默认数据
public $tableDefaultData = [
[
'天下第一',
'Vue牛逼',
'java牛逼',
'go牛逼',
],
];

/**
* @param array $tableHeader 表头
* @param array $tableDefaultData 需要导出数据
*/
public function __construct($tableHeader, $tableDefaultData)
{
if (empty($tableHeader)) {
throw new BusiException('export error', '请设置表头');
}

if (empty($tableDefaultData)) {
throw new BusiException('export error', '请设置导出数据');
}

$this->tableHeader = $tableHeader;
$this->config['column'] = count($tableHeader);
$this->tableDefaultData = $tableDefaultData;
}

/**
* 创建表格 createTable
*/
public function createTable()
{
$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();

//居中
$styleArray = [
'alignment' => [
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
],
];

// 设置基本属性
$worksheet->setTitle($this->config['title']);
$worksheet->getStyle($this->getColumn())->applyFromArray($styleArray)
->getFont()
->setBold($this->config['bold'])
->setName('Verdana')
->setSize($this->config['size']);

foreach ($this->tableHeader as $index => $name) {
$worksheet->setCellValue($this->cellIndex[$index] . '1', $name);
}

$baseRow = 2;
foreach ($this->tableDefaultData as $index => $data) {
$i = $index + $baseRow;
for ($k = 0; $k <= $this->config['column'] - 1; $k++) {
$item = $data[$k];
$worksheet->setCellValue($this->cellIndex[$k] . $i, ' ' . $item);
// 中文设置表格宽度
if (preg_match("/[\x7f-\xff]/", $data[$k])) {
$worksheet->getColumnDimension($this->cellIndex[$k])->setWidth(strlen($item));
} else {
// 非中文自动设置宽度
$worksheet->getColumnDimension($this->cellIndex[$k])->setAutoSize(true);
}
}
}
$worksheet->calculateColumnWidths();
self::downloadExcel($spreadsheet, $this->config['name'], 'Xls');
}

/**
* 文件下载 downloadExcel
*
* @param data $spreadsheet
* @param string $filename
* @param string $format
* @return void
*/
private function downloadExcel($spreadsheet, $filename, $format)
{
// $format只能为 Xlsx 或 Xls
if ($format == 'Xlsx') {
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
} elseif ($format == 'Xls') {
header('Content-Type: application/vnd.ms-excel');
}

header("Content-Disposition: attachment;filename="
. urlencode($filename) . '.' . strtolower($format)); //. date('Y-m-d')
header('Cache-Control: max-age=0');
$objWriter = IOFactory::createWriter($spreadsheet, $format);
$objWriter->save('php://output');
exit;
}

private function getColumn($row = 1)
{
$index = $this->cellIndex[$this->config['column']];
return 'A' . $row . ':' . $index . $row;
}

private function autoFitColumnWidthToContent($sheet, $fromCol, $toCol)
{
if (empty($toCol)) { //not defined the last column, set it the max one
$toCol = $sheet->getColumnDimension($sheet->getHighestColumn())->getColumnIndex();
}
for ($i = $fromCol; $i <= $toCol; $i++) {
$sheet->getColumnDimension($i)->setAutoSize(true);
}
$sheet->calculateColumnWidths();
}
}
使用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
use helper\Export;
...
// 设置表头
$export = new Export(
[
'测试标题',
'测试标题2',
'时间',
],
[
['11111111111111', '测试数据2', '2020-04-30'],
['测试数据1-1', '测试数据2-2', '2020-04-30'],
]
);
echo $export->createTable();
exit;

效果


 评论