Spreadsheet 在线文档 https://phpoffice.github.io/PhpSpreadsheet/
相关文档:https://www.cnblogs.com/zx-admin/p/11652187.html
听说PHPEXCEL已经不维护了,而且没有使用命名空间真的很蛋疼,
安装
composer require phpoffice/phpspreadsheet
用法
<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
function demo(): string
{
$spreadsheet = new Spreadsheet();
//获取活动工作薄
$sheet = $spreadsheet->getActiveSheet();
//获取单元格
//方法1
$cell = $sheet->getCell('A1');
//方法2
$cell = $sheet->getCellByColumnAndRow(1,1);
//设置文本格式
$sheet->getCell('A1')->setValueExplicit($val, DataType::TYPE_STRING);
//生成文件并保存到指定路径
$writer = new Xlsx($spreadsheet);
$filename = '/tmp/demo.xlsx';
$writer->save($filename);
return $filename;
}
封装
data数组里有表头和数据,如果包含isHead这个元素,表示当前数组是表头
$data=[
[
'id'
'name',
'age',
'sex'
],
[
'1'
'张三',
'18',
'男'
],
[
'2'
'李四',
'19',
'男'
],
];
$headerMap里定义表头的字段名和中文的键值对
$headerMap=[
'name'=>'姓名',
'age'=>'年龄,
'sex'=>'性别',
];
<?php
/**
*excel工具类
*/
namespace common\helper;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class SpreadsheetHelper
{
public static function formatArray(Worksheet $sheet, $arr, $headerMap)
{
try {
foreach ($arr as $y => $list) {
if (!empty($list['isHeader'])) {
unset($list['isHeader']);
$isHeader = true;
}
$list = array_values($list);
foreach ($list as $x => $v) {
$crd = self::getCrd($x, $y);
$val = !empty($isHeader) ? ($headerMap[$v] ?? $v) : $v;
$sheet->setCellValue($crd, $val);
if (is_numeric($val) && strlen($val) >= 11) {
$sheet->getCell($crd)->setValueExplicit($val, DataType::TYPE_STRING);
}
}
$isHeader = false;
}
} catch (\Exception $e) {
\Yii::error([
'errorTitle' => '生成表格失败',
'errorMsg' => $e->getMessage(),
'errorList' => $list ?? [],
'errorTrace' => $e->getTraceAsString(),
]);
throw $e;
}
}
/**
* 获取X轴坐标 A~Z
* @param int $index 下标
* @return string
*/
public static function getXCrd($index = 0)
{
$temp = '';
$c = floor($index / 26);
if ($c == 0 || $index == 25) {
$temp .= chr($index + 65);
} else {
$y = $index % 26;
$temp .= chr($c + 64) . chr($y + 65);
}
return $temp;
}
/**
* 获取Y轴下标 1~∞
* @param int $index
* @return int|mixed
*/
public static function getYCrd($index = 0)
{
return ++$index;
}
/**
* 获取坐标 X1~X∞
* @param $xIndex
* @param $yIndex
* @return string
*/
public static function getCrd($xIndex, $yIndex)
{
return self::getXCrd($xIndex) . self::getYCrd($yIndex);
}
}
使用封装好的工具类
function demo($data,$headerMap){
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$data[0]['isHeader'] = true;
SpreadsheetHelper::formatArray($sheet, $data, $headerMap);
$writer = new Xlsx($spreadsheet);
$filename = '/tmp/demo.xlsx';
$writer->save($filename);
return $filename;
}