You've already forked lazarus-ccr
fpspreadsheet: Fix biff2 reader failing to get correct xf record for locked cells. Fix biff2 reader if there are more than 62 xf records in a file.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3935 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -59,6 +59,7 @@ type
|
|||||||
private
|
private
|
||||||
// WorkBookEncoding: TsEncoding;
|
// WorkBookEncoding: TsEncoding;
|
||||||
FFont: TsFont;
|
FFont: TsFont;
|
||||||
|
FPendingXFIndex: Word;
|
||||||
protected
|
protected
|
||||||
procedure CreateNumFormatList; override;
|
procedure CreateNumFormatList; override;
|
||||||
procedure ReadBlank(AStream: TStream); override;
|
procedure ReadBlank(AStream: TStream); override;
|
||||||
@ -70,6 +71,7 @@ type
|
|||||||
procedure ReadFormat(AStream: TStream); override;
|
procedure ReadFormat(AStream: TStream); override;
|
||||||
procedure ReadFormula(AStream: TStream); override;
|
procedure ReadFormula(AStream: TStream); override;
|
||||||
procedure ReadInteger(AStream: TStream);
|
procedure ReadInteger(AStream: TStream);
|
||||||
|
procedure ReadIXFE(AStream: TStream);
|
||||||
procedure ReadLabel(AStream: TStream); override;
|
procedure ReadLabel(AStream: TStream); override;
|
||||||
procedure ReadNumber(AStream: TStream); override;
|
procedure ReadNumber(AStream: TStream); override;
|
||||||
procedure ReadRowColXF(AStream: TStream; out ARow, ACol: Cardinal; out AXF: Word); override;
|
procedure ReadRowColXF(AStream: TStream; out ARow, ACol: Cardinal; out AXF: Word); override;
|
||||||
@ -407,6 +409,7 @@ begin
|
|||||||
r := WordLEToN(rec.Row);
|
r := WordLEToN(rec.Row);
|
||||||
c := WordLEToN(rec.Col);
|
c := WordLEToN(rec.Col);
|
||||||
xf := rec.Attrib1 and $3F;
|
xf := rec.Attrib1 and $3F;
|
||||||
|
if xf = 63 then xf := FPendingXFIndex;
|
||||||
|
|
||||||
{ Create cell }
|
{ Create cell }
|
||||||
if FIsVirtualMode then begin
|
if FIsVirtualMode then begin
|
||||||
@ -539,6 +542,7 @@ begin
|
|||||||
INT_EXCEL_ID_FONTCOLOR : ReadFontColor(AStream);
|
INT_EXCEL_ID_FONTCOLOR : ReadFontColor(AStream);
|
||||||
INT_EXCEL_ID_FORMAT : ReadFormat(AStream);
|
INT_EXCEL_ID_FORMAT : ReadFormat(AStream);
|
||||||
INT_EXCEL_ID_INTEGER : ReadInteger(AStream);
|
INT_EXCEL_ID_INTEGER : ReadInteger(AStream);
|
||||||
|
INT_EXCEL_ID_IXFE : ReadIXFE(AStream);
|
||||||
INT_EXCEL_ID_NUMBER : ReadNumber(AStream);
|
INT_EXCEL_ID_NUMBER : ReadNumber(AStream);
|
||||||
INT_EXCEL_ID_LABEL : ReadLabel(AStream);
|
INT_EXCEL_ID_LABEL : ReadLabel(AStream);
|
||||||
INT_EXCEL_ID_FORMULA : ReadFormula(AStream);
|
INT_EXCEL_ID_FORMULA : ReadFormula(AStream);
|
||||||
@ -661,6 +665,7 @@ begin
|
|||||||
ARow := WordLEToN(rec.Row);
|
ARow := WordLEToN(rec.Row);
|
||||||
ACol := WordLEToN(rec.Col);
|
ACol := WordLEToN(rec.Col);
|
||||||
XF := rec.Attrib1 and $3F;
|
XF := rec.Attrib1 and $3F;
|
||||||
|
if XF = 63 then XF := FPendingXFIndex;
|
||||||
|
|
||||||
{ String with 8-bit size }
|
{ String with 8-bit size }
|
||||||
L := rec.TextLen;
|
L := rec.TextLen;
|
||||||
@ -715,6 +720,7 @@ begin
|
|||||||
ARow := WordLEToN(rec.Row);
|
ARow := WordLEToN(rec.Row);
|
||||||
ACol := WordLEToN(rec.Col);
|
ACol := WordLEToN(rec.Col);
|
||||||
XF := rec.Attrib1 and $3F;
|
XF := rec.Attrib1 and $3F;
|
||||||
|
if XF = 63 then XF := FPendingXFIndex;
|
||||||
value := rec.Value;
|
value := rec.Value;
|
||||||
|
|
||||||
{Create cell}
|
{Create cell}
|
||||||
@ -752,6 +758,7 @@ begin
|
|||||||
ARow := WordLEToN(rec.Row);
|
ARow := WordLEToN(rec.Row);
|
||||||
ACol := WordLEToN(rec.Col);
|
ACol := WordLEToN(rec.Col);
|
||||||
XF := rec.Attrib1 and $3F;
|
XF := rec.Attrib1 and $3F;
|
||||||
|
if XF = 63 then XF := FPendingXFIndex;
|
||||||
AWord := WordLEToN(rec.Value);
|
AWord := WordLEToN(rec.Value);
|
||||||
|
|
||||||
{ Create cell }
|
{ Create cell }
|
||||||
@ -772,6 +779,16 @@ begin
|
|||||||
Workbook.OnReadCellData(Workbook, ARow, ACol, cell);
|
Workbook.OnReadCellData(Workbook, ARow, ACol, cell);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{@@ ----------------------------------------------------------------------------
|
||||||
|
Reads an IXFE record. This record contains the "true" XF index of a cell. It
|
||||||
|
is used if there are more than 62 XF records (XF field is only 6-bit). The
|
||||||
|
IXFE record is used in front of the cell record using it
|
||||||
|
-------------------------------------------------------------------------------}
|
||||||
|
procedure TsSpreadBIFF2Reader.ReadIXFE(AStream: TStream);
|
||||||
|
begin
|
||||||
|
FPendingXFIndex := WordLEToN(AStream.ReadWord);
|
||||||
|
end;
|
||||||
|
|
||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
Reads the row, column and xf index from the stream
|
Reads the row, column and xf index from the stream
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
@ -783,7 +800,9 @@ begin
|
|||||||
ACol := WordLEToN(AStream.ReadWord);
|
ACol := WordLEToN(AStream.ReadWord);
|
||||||
|
|
||||||
{ Index to XF record }
|
{ Index to XF record }
|
||||||
AXF := AStream.ReadByte;
|
AXF := AStream.ReadByte and $3F; // to do: if AXF = $3F = 63 then there must be a IXFE record which contains the true XF index!
|
||||||
|
if AXF = $3F then
|
||||||
|
AXF := FPendingXFIndex;
|
||||||
|
|
||||||
{ Index to format and font record, cell style - ignored because contained in XF
|
{ Index to format and font record, cell style - ignored because contained in XF
|
||||||
Must read to keep the record in sync. }
|
Must read to keep the record in sync. }
|
||||||
|
Reference in New Issue
Block a user