PhpSpreadsheet 版本 1.29.0
使用以下功能要注意文件格式是否支持该功能 查询文件格式支持的功能
冻结窗格 (Frozen Panes)
要使用冻结窗口,需要先理解在Excel中是如何冻结行和列的。
如上图,选择了D7单元格,然后选择冻结窗体,可以看到冻结了1-6行和ABC列,即冻结窗体会冻结选中单元格上方所有行和左侧所有列。
此时可以得出以下冻结方法:
// 冻结第一行
$spreadsheet->getActiveSheet()->freezePane('A2');
// 冻结第一列
$spreadsheet->getActiveSheet()->freezePane('B1');
保护工作表 (Protection)
向Excel文件设置密码,可以防止文件内容被修改。
保护工作簿
不能新增、修改、删除工作表,但不会影响工作表中的内容。
$security = $spreadsheet->getSecurity();
$security->setLockWindows(true);
$security->setLockStructure(true);
// 设置工作簿密码
$security->setWorkbookPassword("PhpSpreadsheet");
保护工作表
已存在的工作表内容无法新增、编辑、删除。但不影响操作工作表(可以新增、修改、删除),新增的工作表可以编辑里面的内容,可以删除内容已被锁定的工作表。
// 获取当前激活的工作表的安全信息
$protection = $spreadsheet->getActiveSheet()->getProtection();
$protection->setPassword('PhpSpreadsheet');
// 锁定内容
$protection->setSheet(true);
// 不能排序
$protection->setSort(false);
// 不能新增行
$protection->setInsertRows(false);
// 不能设置格式
$protection->setFormatCells(false);
如何只锁定部分单元格
现在新建的xlsx表格(其他格式没有测试过)都是默认锁定所有单元格。若直接设置保护工作表,将会锁定所有的单元格。
要实现只锁定部分单元格,则需要先全选所有单元格,然后单击“锁定单元格”取消锁定,然后再选择需要锁定的单元格,并锁定,最后再“保护工作表”,此时就能实现这个功能了。
在Excel表格里面是可以这样子实现的,但是在程序中,如果取消所有单元格的锁定,需要先框选所有单元格(A1:XFD1048576),这样会占用较大的内存,最后可能会报内存不足的错误。
曲线救国的方法:先选择一个大的范围,取消里面的单元格锁定,然后再选择需要锁定的单元格,并锁定。此时需要考虑生成的表格文件是否可以编辑,并且可编辑的范围需要在已解锁的单元格里面。
// 锁定A1到A10单元格
$spreadsheet->getActiveSheet()->getStyle('A1:A10')
->getProtection()
->setLocked(\PhpOffice\PhpSpreadsheet\Style\Protection::PROTECTION_UNPROTECTED);