Subject: | Problem with use Spreadsheet::ParseExcel::SaveParser; |
Date: | Tue, 29 Mar 2011 13:43:01 +0200 |
To: | bug-Spreadsheet-ParseExcel [...] rt.cpan.org |
From: | Florian Heyer <info [...] heyer-it.de> |
Hello,
i've got the following problem with SaveParser:
There are some cases where cells are blacked, e.g. the cells are filled
with black and thus aren't readable (black font on black background).
This is the case when viewed in Excel 2010 and LibreOffice.
I'm afraid i can't provide test files as they contain sensitive
information. After editing out sensitive data the bug disappears.
I tracked the problem down to following code:
- Spreadsheet::ParseExcel::SaveParser::Workbook::SaveAs copies
foreground and background of all cells in the editied excel document
- during processing get_xf() is called in
Spreadsheet::WriteExcel::Format with the following code snippet
(starting in line 240):
# The following 2 logical statements take care of special cases in
relation
# to cell colours and patterns:
# 1. For a solid fill (_pattern == 1) Excel reverses the role of
foreground
# and background colours.
# 2. If the user specifies a foreground or background colour without a
# pattern they probably wanted a solid fill, so we fill in the
defaults.
#
if ($self->{_pattern} <= 0x01 and
$self->{_bg_color} != 0x41 and
$self->{_fg_color} == 0x40 )
{
$self->{_fg_color} = $self->{_bg_color};
$self->{_bg_color} = 0x40;
$self->{_pattern} = 1;
}
if ($self->{_pattern} <= 0x01 and
$self->{_bg_color} == 0x41 and
$self->{_fg_color} != 0x40 )
{
$self->{_bg_color} = 0x40;
$self->{_pattern} = 1;
}
As i unterstand it these rules are applied with direct use of
Spreadsheet::WriteExcel in mind. Though with SaveParser sometimes colors
are swapped because the source excel contains cells without fill pattern
(_pattern == 0) but with colors set.
I changed the conditions above
($self->{_pattern} <= 0x01) to ($self->{_pattern} == 0x01) and the
problem disappears.
As is see it when used with SaveParser the 2 rules above should be
completely disabled as we want a 1:1 copy of the edited excel file.
Please correct if i'm wrong.
Please keep up the good work with SpreadSheet::*, i like it a lot!
Best regard
--
Florian Heyer - info@heyer-it.de
My environment:
Perl version : 5.012002
OS name : MSWin32
Module versions: (not all are required)
Spreadsheet::ParseExcel 0.58
Scalar::Util 1.23
Unicode::Map (not installed)
Spreadsheet::WriteExcel 2.37
Parse::RecDescent 1.965001
File::Temp 0.22
OLE::Storage_Lite 0.19
IO::Stringy 2.110