PhpSpreadsheet操作Excel的基本使用
# 安装依赖
composer require phpoffice/phpspreadsheet
1
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet(); // 获取当前激活的工作表
1
2
2
# 全局操作
# 全局垂直居中
$spreadsheet->getDefaultStyle()->getAlignment()->setVertical(Alignment::VERTICAL_CENTER);
1
# 全局水平居中
$spreadsheet->getDefaultStyle()->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
1
# 全局自动换行
$spreadsheet->getDefaultStyle()->getAlignment()->setWrapText(true);
1
# 设置Excel文档属性
$spreadsheet->getProperties()
->setCreator("mrcdh") // 作者
->setLastModifiedBy("mrcdh") // 最后修改者
->setTitle("Office 2007 XLSX Test Document") // 标题
->setSubject("Office 2007 XLSX Test Document") // 副标题
->setDescription("这是一一个用php构建的Excel文档。") // 描述
->setKeywords("office php excel") // 关键字
->setCategory("Test result file"); // 分类
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 工作表操作
# 创建新的工作表
try{
$spreadsheet->createSheet(1); // 传入索引,0代表第一个工作表
}catch(Exception $e){}
1
2
3
2
3
# 获取指定工作表
try{
$spreadsheet->getSheet(1); // 获取索引为1的工作表
}catch(Exception $e){}
1
2
3
2
3
# 设置当前工作表标题
$sheet->setTitle('Demo');
1
# 删除指定工作表
try{
$spreadsheet->removeSheetByIndex(0); // 删除第一个工作表
}catch(Exception $e){}
1
2
3
2
3
# 垂直居中
$sheet->getStyle('A1')->getAlignment()->setVertical(Alignment::VERTICAL_CENTER); // A1单元格垂直居中
$sheet->getStyle('A1:E3')->getAlignment()->setVertical(Alignment::VERTICAL_CENTER); // A1到E3单元格垂直居中
1
2
2
# 水平居中
$sheet->getStyle('A1')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); // A1单元格水平居中
1
# 行高
$sheet->getDefaultRowDimension()->setRowHeight(20); // 默认行高
$sheet->getRowDimension(4)->setRowHeight(30); // 设置第4行的行高
1
2
2
# 列宽
$sheet->getDefaultColumnDimension()->setWidth(20); // 默认单元格宽度
$sheet->getColumnDimension('A')->setWidth(30); // 设置A列的宽度为30
1
2
2
# 单元格内容
$sheet->setCellValue('A3', '商品编码');
$sheet->getCell('B3')->setValue('商品名称');
1
2
2
# 单元格背景色
// 设置A2到K2的背景色,也可以单独指定单元格
$sheet->getStyle('A2:K2')
->getFill()
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) // 设置填充样式
->getStartColor()
->setARGB('FFD8E4BC'); // 可以忽略透明,直接使用RGB
1
2
3
4
5
6
2
3
4
5
6
# 单元格边框
// BORDER_THIN 细边框
// BORDER_THICK 粗边框
$sheet->getStyle('A2:K2')->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN); // 所有边框
$sheet->getStyle('B2')->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // 上边框
$sheet->getStyle('B2')->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK);// 下边框
$sheet->getStyle('B2')->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // 左边框
$sheet->getStyle('B2')->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK); // 右边框
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 使用函数
使用SUM
计算B5
到C5
之间单元格的总和。其他函数同理:最大数(MAX
),最小数(MIN
),平均值(AVERAGE
)。
$sheet->setCellValue('A3', '=SUM(B5:C5)');
1
# 文本自动换行
$sheet->getCell('A4')->setValue("hello\nworld"); // 内容\n换行
$sheet->getStyle('A4')->getAlignment()->setWrapText(true); // 指定单元格自动换行
1
2
2
# 文字样式
$sheet->getStyle('A1:B7')->getFont()
->setBold(true) // 加粗
->setName('Arial') // 字体
->setSize(10); // 10号字
// 设置文字颜色为红色
$sheet->getStyle('A4')->getFont()->getColor()
->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 合并单元格
$sheet->mergeCells('A18:E22'); // 将A18到E22合并为一个单元格。
1
# 拆分单元格
$sheet->unmergeCells('A18:E22'); // 将合并后的单元格拆分
1
# 冻结窗格
$sheet->freezePane('A2');
1
A2
将冻结单元格A2
上方的行(即第1行)B1
将冻结单元格B1
左侧的列(即列A)B2
将冻结B2
单元格上方和左侧的行(即第1行和第A列)
# 添加单元格批注/注释
$sheet->getComment('E11')->setAuthor('mrcdh'); // 设置批注作者
$commentRichText = $sheet->getComment('E11')->getText()->createTextRun('mrcdh:'); // 设置批注内容
$commentRichText->getFont()->setBold(true); // 给上个批注内容加粗
$sheet->getComment('E11')->getText()->createTextRun("\r\n"); // 换行
$sheet->getComment('E11')->getText()->createTextRun('注释内容'); // 追加内容
1
2
3
4
5
2
3
4
5
# 时间处理
$cellVal= $workSheet->getCell('A1')->getValue();
$toTimestamp = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp($cellVal);
$date = date("Y-m-d", $toTimestamp);
// 获取时可能出现时间比表格时间快了8个小时
// 这是因为PHPExcel从文件中获取的时间,是以格林威治时间标准(GMT/UTC)格式
// 这时需要使用`gmdate`函数格式化格林威治时间,`date`格式化本地时间
$date = date("Y-m-d", $toTimestamp);
1
2
3
4
5
6
7
2
3
4
5
6
7
# 设置数据类型(可以解决科学计数法问题)
use PhpOffice\PhpSpreadsheet\Cell\DataType;
$str = '12345678912451';
$workSheet->setCellValueExplicit('A1', $str,DataType::TYPE_STRING);
$workSheet->setCellValueExplicitByColumnAndRow(col, row, $str,DataType::TYPE_STRING);
1
2
3
4
2
3
4
# 杂项
# 导出
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$writer = new Xlsx($spreadsheet);
$writer->save('demo.xlsx');
1
2
3
2
3
# 直接输出到浏览器
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="example.xlsx"');
header('Cache-Control: max-age=0');
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); //按照指定格式生成Excel文件
$writer->save('php://output');
1
2
3
4
5
2
3
4
5
# 导入
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
$reader = new Xlsx();
$spreadsheet = $read->load($url); // 加载xlsx文件
$sheet = $spreadsheet->getActiveSheet();
$rows = $sheet->getHighestRow(); // 总行数
$cols = $sheet->getHighestColumn(); // 总列数: B
$colsIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($cols); // 总列数: 2,将字母转换为索引值
$sheet->getCellByColumnAndRow(1, 2)->getValue(); // 获取第2行第1列单元格内容
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
上次更新: 2023/12/11, 14:49:49