fpspreadsheet: Add reading support for MULBLANK records (BIFF5 and BIFF8)

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3034 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2014-05-09 22:37:05 +00:00
parent 407b2f1288
commit e00fedff8b
5 changed files with 114 additions and 76 deletions

View File

@ -76,6 +76,11 @@ begin
MyWorksheet.WriteBorderStyle(5, 5, cbSouth, lsDotted, scRed);
MyWorksheet.WriteBorderLineStyle(5, 5, cbNorth, lsThick);
// F7, top border only, but different color
MyWorksheet.WriteBorderColor(6, 5, cbNorth, scGreen);
MyWorksheet.WriteUTF8Text(6, 5, 'top border green or red?');
// Excel shows it to be red --> the upper border wins
// H6 empty cell, all medium borders
MyWorksheet.WriteBorders(5, 7, [cbNorth, cbEast, cbSouth, cbWest]);
MyWorksheet.WriteBorderColor(5, 7, cbSouth, scBlack);

View File

@ -97,7 +97,6 @@
<RunParams>
<local>
<FormatVersion Value="1"/>
<CommandLineParams Value="&quot;D:\Prog_Lazarus\BIFF Explorer\sample data\Kommentar-ColWidth.xls&quot;"/>
</local>
</RunParams>
<RequiredPackages Count="2">
@ -148,7 +147,6 @@
<Unit3>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<UnitName Value="fpspreadsheetgrid"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="2"/>
<WindowIndex Value="0"/>
<TopLine Value="1007"/>
@ -267,8 +265,8 @@
<UnitName Value="xlsbiff8"/>
<EditorIndex Value="6"/>
<WindowIndex Value="0"/>
<TopLine Value="1658"/>
<CursorPos X="1" Y="1677"/>
<TopLine Value="1493"/>
<CursorPos X="1" Y="1514"/>
<UsageCount Value="60"/>
<Loaded Value="True"/>
</Unit17>
@ -292,18 +290,19 @@
<UnitName Value="xlscommon"/>
<EditorIndex Value="5"/>
<WindowIndex Value="0"/>
<TopLine Value="1269"/>
<CursorPos X="1" Y="1286"/>
<TopLine Value="20"/>
<CursorPos X="3" Y="51"/>
<UsageCount Value="56"/>
<Loaded Value="True"/>
</Unit20>
<Unit21>
<Filename Value="..\..\xlsbiff5.pas"/>
<UnitName Value="xlsbiff5"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="7"/>
<WindowIndex Value="0"/>
<TopLine Value="1319"/>
<CursorPos X="3" Y="1325"/>
<TopLine Value="1250"/>
<CursorPos X="60" Y="1273"/>
<UsageCount Value="43"/>
<Loaded Value="True"/>
</Unit21>
@ -547,123 +546,127 @@
<UsageCount Value="11"/>
</Unit52>
</Units>
<JumpHistory Count="29" HistoryIndex="28">
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1885" Column="1" TopLine="1865"/>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1653" Column="1" TopLine="1629"/>
</Position1>
<Position2>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1886" Column="1" TopLine="1865"/>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1654" Column="1" TopLine="1629"/>
</Position2>
<Position3>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1887" Column="1" TopLine="1865"/>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1666" Column="1" TopLine="1634"/>
</Position3>
<Position4>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1648" Column="1" TopLine="1629"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1905" Column="1" TopLine="1886"/>
</Position4>
<Position5>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1649" Column="1" TopLine="1629"/>
<Caret Line="1677" Column="1" TopLine="1658"/>
</Position5>
<Position6>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1650" Column="1" TopLine="1629"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1905" Column="1" TopLine="1886"/>
</Position6>
<Position7>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1651" Column="1" TopLine="1629"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1906" Column="1" TopLine="1886"/>
</Position7>
<Position8>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1653" Column="1" TopLine="1629"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1908" Column="1" TopLine="1886"/>
</Position8>
<Position9>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1654" Column="1" TopLine="1629"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1912" Column="1" TopLine="1886"/>
</Position9>
<Position10>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1666" Column="1" TopLine="1634"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1913" Column="1" TopLine="1886"/>
</Position10>
<Position11>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1905" Column="1" TopLine="1886"/>
<Filename Value="mainform.pas"/>
<Caret Line="404" Column="25" TopLine="404"/>
</Position11>
<Position12>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1677" Column="1" TopLine="1658"/>
<Filename Value="mainform.pas"/>
<Caret Line="286" Column="3" TopLine="282"/>
</Position12>
<Position13>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1905" Column="1" TopLine="1886"/>
<Filename Value="mainform.pas"/>
<Caret Line="364" Column="64" TopLine="356"/>
</Position13>
<Position14>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1906" Column="1" TopLine="1886"/>
<Caret Line="1913" Column="1" TopLine="1886"/>
</Position14>
<Position15>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1908" Column="1" TopLine="1886"/>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1677" Column="1" TopLine="1658"/>
</Position15>
<Position16>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1912" Column="1" TopLine="1886"/>
<Caret Line="1913" Column="1" TopLine="1886"/>
</Position16>
<Position17>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1913" Column="1" TopLine="1886"/>
</Position17>
<Position18>
<Filename Value="mainform.pas"/>
<Caret Line="404" Column="25" TopLine="404"/>
</Position18>
<Position19>
<Filename Value="mainform.pas"/>
<Caret Line="286" Column="3" TopLine="282"/>
</Position19>
<Position20>
<Filename Value="mainform.pas"/>
<Caret Line="364" Column="64" TopLine="356"/>
</Position20>
<Position21>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1913" Column="1" TopLine="1886"/>
</Position21>
<Position22>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1677" Column="1" TopLine="1658"/>
</Position22>
<Position23>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1913" Column="1" TopLine="1886"/>
</Position23>
<Position24>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="382" Column="62" TopLine="362"/>
</Position24>
<Position25>
</Position17>
<Position18>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="1104" Column="52" TopLine="1073"/>
</Position25>
<Position26>
</Position18>
<Position19>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="1379" Column="58" TopLine="1347"/>
</Position26>
<Position27>
</Position19>
<Position20>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="1384" Column="56" TopLine="1353"/>
</Position27>
<Position28>
</Position20>
<Position21>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="1395" Column="54" TopLine="1364"/>
</Position28>
<Position29>
</Position21>
<Position22>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="1401" Column="53" TopLine="1370"/>
</Position22>
<Position23>
<Filename Value="..\..\xlscommon.pas"/>
<Caret Line="1269" Column="46" TopLine="1269"/>
</Position23>
<Position24>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1659" Column="53" TopLine="1659"/>
</Position24>
<Position25>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position25>
<Position26>
<Filename Value="..\..\xlsbiff5.pas"/>
<Caret Line="1319" Column="3" TopLine="1319"/>
</Position26>
<Position27>
<Filename Value="..\..\xlsbiff5.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position27>
<Position28>
<Filename Value="..\..\xlscommon.pas"/>
<Caret Line="852" Column="22" TopLine="852"/>
</Position28>
<Position29>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1694" Column="3" TopLine="1690"/>
</Position29>
<Position30>
<Filename Value="..\..\xlsbiff5.pas"/>
<Caret Line="1610" Column="3" TopLine="1606"/>
</Position30>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>

View File

@ -1266,6 +1266,7 @@ begin
case RecordType of
INT_EXCEL_ID_BLANK : ReadBlank(AStream);
INT_EXCEL_ID_MULBLANK: ReadMulBlank(AStream);
INT_EXCEL_ID_NUMBER : ReadNumber(AStream);
INT_EXCEL_ID_LABEL : ReadLabel(AStream);
INT_EXCEL_ID_RSTRING : ReadRichString(AStream); //(RSTRING) This record stores a formatted text cell (Rich-Text). In BIFF8 it is usually replaced by the LABELSST record. Excel still uses this record, if it copies formatted text cells to the clipboard.

View File

@ -1510,6 +1510,7 @@ begin
case RecordType of
INT_EXCEL_ID_BLANK : ReadBlank(AStream);
INT_EXCEL_ID_MULBLANK: ReadMulBlank(AStream);
INT_EXCEL_ID_NUMBER : ReadNumber(AStream);
INT_EXCEL_ID_LABEL : ReadLabel(AStream);
INT_EXCEL_ID_FORMULA : ReadFormula(AStream);

View File

@ -48,6 +48,7 @@ const
{ RECORD IDs which did not change across versions 5-8 }
INT_EXCEL_ID_BOUNDSHEET = $0085; // Renamed to SHEET in the latest OpenOffice docs, does not exist before 5
INT_EXCEL_ID_MULRK = $00BD; // does not exist before BIFF5
INT_EXCEL_ID_MULBLANK = $00BE; // does not exist before BIFF5
INT_EXCEL_ID_XF = $00E0; // BIFF2:$0043, BIFF3:$0243, BIFF4:$0443
INT_EXCEL_ID_RSTRING = $00D6; // does not exist before BIFF5
INT_EXCEL_ID_BOF = $0809; // BIFF2:$0009, BIFF3:$0209; BIFF4:$0409
@ -394,6 +395,8 @@ type
procedure ReadDateMode(AStream: TStream);
// Read FORMAT record (cell formatting)
procedure ReadFormat(AStream: TStream); virtual;
// Read multiple blank cells
procedure ReadMulBlank(AStream: TStream);
// Read floating point number
procedure ReadNumber(AStream: TStream); override;
// Read palette
@ -851,6 +854,31 @@ begin
// to be overridden
end;
// Reads multiple blank cell records
procedure TsSpreadBIFFReader.ReadMulBlank(AStream: TStream);
var
ARow, fc, lc, XF: Word;
pending: integer;
begin
ARow := WordLEtoN(AStream.ReadWord);
fc := WordLEtoN(AStream.ReadWord);
pending := RecordSize - Sizeof(fc) - Sizeof(ARow);
while pending > SizeOf(XF) do begin
XF := AStream.ReadWord; //XF record (not used)
FWorksheet.WriteBlank(ARow, fc);
ApplyCellFormatting(ARow, fc, XF);
inc(fc);
dec(pending, SizeOf(XF));
end;
if pending = 2 then begin
//Just for completeness
lc := WordLEtoN(AStream.ReadWord);
if lc + 1 <> fc then begin
//Stream error... bypass by now
end;
end;
end;
// Reads a floating point number and seeks the number format
// NOTE: This procedure is valid after BIFF 3.
procedure TsSpreadBIFFReader.ReadNumber(AStream: TStream);