pyExcelerator - Protecting Cells

John Machin sjmachin at lexicon.net
Fri Feb 9 10:28:02 EST 2007


On 9/02/2007 6:36 PM, Chris wrote:
> I'm sitting with a bit of an issue with pyExcelerator and creating an
> Excel file with certain cells protected while the rest of the
> spreadsheet is password protected.
> 
> The Protection class under Formatting has 2 variables for cell_locked
> and formula_hidden, tbh I only need to alter cell_locked to 0 to make
> those cells writable but changing that on a global scale ends up with
> everything I write being "writeable" if you re-open the file after it
> has been produced.
> 

"tbh" means what?
"changing that on a global scale" means what??

Please write a small *test* script (along the lines of those in 
pyExcelerator's examples directory, without 
irrelevant/private/otherwise_inappropriate code from your app) which 
tries to set some cells to locked and some to unlocked. If you can't get 
it to work:
(1) ensure that you have checked the bug register on Sourceforge and 
applied any patch that seems relevant to your problem
(2) come back here with a copy/paste of the actual code that you have run.

> I decided to import Formatting into the Worksheet module like this:

Why? What made you think that this would achieve your goal?

>         import Formatting
>         self.Formatting = Formatting.Protection
> 
>         self.__cell_protect = 1
>         self.__formula_hidden = 0
> 
> which is the defaults in the Protection class anyway but now when I do
> my create file routine when I try to change the cell_protect variable
> to 0 it makes absolutely no effect.

Of course it would have no effect. You appear to have given Worksheet 
objects a gratuitous __cell_protect attribute -- but no code to use it.

Protection is like a pattern or a font -- you have to cram it into an 
XFStyle object which you use as the style arg of the Worksheet.write() 
method. You will need of course at least 2 different XFStyle objects: 
one locked, another unlocked.

>  The code has been written as
> such:
> 
>             if protection:
>                 work_sheet.set_protect(protection)
>                 work_sheet.set_password(password)
>             else:
>                 pass

What induced you to write the above two statements?

> 
>             for each_heading in each_work_sheet[1]:
>                 work_sheet.write(7, heading_cnt, str(each_heading),
> header_style)
>                 heading_cnt += 1
> 
>             vert_cnt = 8
> 
>             for each_set in each_work_sheet[2]:
>                 horiz_cnt = 0
> 
>                 for data_set in each_set:
>                     work_sheet.cell_protect = 1

Now the Worksheet object has *TWO* useless attributes, one named 
__cell_protect and one named cell_protect ...

>                     work_sheet.formula_hidden = 1
> 
>                     if len(str(data_set)) < 1:
>                         work_sheet.cell_protect = 0
>                         work_sheet.formula_hidden = 0
>                         work_sheet.write(vert_cnt, horiz_cnt, ' ')
>                         horiz_cnt += 1
>                     else:
>                         work_sheet.write(vert_cnt, horiz_cnt,
> str(data_set), data_style)
>                         horiz_cnt += 1
> 
>                 vert_cnt += 1
> 
> As you can see I only want to be able to write to cells that have a
> string '' which is parsed correctly through to data which was
> originally extracted from a database.  The problem is that I can only
> seem to set it to protect all written cells or not.
> 

HTH,
John



More information about the Python-list mailing list