amdev
amdev

Reputation: 3249

PHPExcel Protect a single column

I have issues with cell protection.

I would like to protect just one column, B for example.

So I tried:

$sheet->getProtection()->setSheet(true);   
$highestRow = $sheet->getHighestRow();

$sheet->getStyle('A1:J2000)->getProtection()->setLocked( PHPExcel_Style_Protection::PROTECTION_UNPROTECTED );

for($i=1;$i<=$highestRow;$i++)
{
  $sheet->getStyleByColumnAndRow(1,$i)->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_PROTECTED);
}

But it's really slow, and not good because if I need to open my sheet again $highestRow = $sheet->getHighestRow(); will return "J".

Another solution would be to get the last non-empty column, do you know how to do that? Because getHighestRow(Column) return the columns unprotected or empty.

Upvotes: 1

Views: 5461

Answers (2)

Muhammed Fayaz
Muhammed Fayaz

Reputation: 55

First you can protect complete sheet. After that you can uprotect others. This code will protect the first column and first

    $objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);
    $objPHPExcel->getActiveSheet()->getStyle('B2:Z400')->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);

Upvotes: 2

Mark Baker
Mark Baker

Reputation: 212412

The loop is slow because you're applying the style to each individual cell, rather than to the range of cells demonstrated in your

$sheet->getStyle('A1:J2000)->getProtection()->setLocked( PHPExcel_Style_Protection::PROTECTION_UNPROTECTED );

line : one call to set the style for a range of 1000 cells is more that 1000 times faster than applying it to each of 1000 cells individually.

$sheet->getHighestDataRow(); 

will return the highest row in the worksheet that contains actual data values

$sheet->getHighestDataColumn(); 

is the column equivalent

Upvotes: 3

Related Questions