记录下常用的方法
- 数字转字符:
Coordinate::stringFromColumnIndex(27);
输出 AA - 字符转数字:
Coordinate::columnIndexFromString('AA');
输出27 - 设置单元格式 eg:(设置为保留两位小数点)
$sheet->getStyle($columnLetter)->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_NUMBER_00);
$columnLetter
可以按照上面的数字转字符获取。也可以直接设置单元列 - 设置样式
$endColumn = Coordinate::stringFromColumnIndex(count($headers));
$endRow = count($data);
// 设置区域内的格式:eg:(添加边框,水平居中,上下居中)
$sheet->getStyle("A1:$endColumn" . $endRow)->applyFromArray([
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN,
],
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER,
],
]);
- 重新判断类型,数字改为文本类型,取消科学技术法 【CustomValueBinder() 这个类需手动创建】
Cell::setValueBinder(new CustomValueBinder());
<?php
namespace extend\common\helpers;
use \PhpOffice\PhpSpreadsheet\Cell\{DefaultValueBinder, DataType};
use PhpOffice\PhpSpreadsheet\RichText\RichText;
/**
* @descirption 改类是为了解决 phpSpreadsheet 中dataTypeForValue 的返回类型不正确
* 导致导出的文件中出现科学计数法
*/
class CustomValueBinder extends DefaultValueBinder
{
public static function dataTypeForValue($value): string
{
//只重写dataTypeForValue方法,去掉一些不必要的判断
if (is_null($value)) {
return DataType::TYPE_NULL;
} elseif ($value instanceof RichText) {
return DataType::TYPE_INLINE;
} elseif ($value && $value[0] === '=' && strlen($value) > 1) {
return DataType::TYPE_FORMULA;
} elseif (is_bool($value)) {
return DataType::TYPE_BOOL;
} elseif (is_float($value) || is_int($value)) {
return DataType::TYPE_NUMERIC;
}
return DataType::TYPE_STRING;
}
}