FPSpreadsheet: Implements enough to write SUM(A1:A5) formulas in BIFF8

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1660 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat 2011-05-30 10:03:04 +00:00
parent f62592925f
commit c9280da776
4 changed files with 78 additions and 157 deletions

View File

@ -7,12 +7,12 @@
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<Title Value="test_write_formula"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<Icon Value="0"/>
<ActiveWindowIndexAtStart Value="0"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
@ -20,7 +20,7 @@
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="1" Active="Default">
<BuildModes Count="1">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
@ -39,152 +39,13 @@
<PackageName Value="laz_fpspreadsheet"/>
</Item1>
</RequiredPackages>
<Units Count="4">
<Units Count="1">
<Unit0>
<Filename Value="test_write_formula.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="test_write_formula"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="0"/>
<WindowIndex Value="0"/>
<TopLine Value="23"/>
<CursorPos X="42" Y="45"/>
<UsageCount Value="20"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
<Filename Value="../../fpspreadsheet.pas"/>
<UnitName Value="fpspreadsheet"/>
<EditorIndex Value="3"/>
<WindowIndex Value="0"/>
<TopLine Value="38"/>
<CursorPos X="13" Y="66"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit1>
<Unit2>
<Filename Value="../../xlsbiff8.pas"/>
<UnitName Value="xlsbiff8"/>
<EditorIndex Value="1"/>
<WindowIndex Value="0"/>
<TopLine Value="840"/>
<CursorPos X="10" Y="862"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit2>
<Unit3>
<Filename Value="../../xlscommon.pas"/>
<UnitName Value="xlscommon"/>
<EditorIndex Value="2"/>
<WindowIndex Value="0"/>
<TopLine Value="125"/>
<CursorPos X="1" Y="150"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit3>
</Units>
<JumpHistory Count="25" HistoryIndex="24">
<Position1>
<Filename Value="test_write_formula.pas"/>
<Caret Line="3" Column="1" TopLine="1"/>
</Position1>
<Position2>
<Filename Value="test_write_formula.pas"/>
<Caret Line="179" Column="1" TopLine="136"/>
</Position2>
<Position3>
<Filename Value="test_write_formula.pas"/>
<Caret Line="29" Column="17" TopLine="10"/>
</Position3>
<Position4>
<Filename Value="test_write_formula.pas"/>
<Caret Line="27" Column="24" TopLine="1"/>
</Position4>
<Position5>
<Filename Value="../../fpspreadsheet.pas"/>
<Caret Line="205" Column="64" TopLine="181"/>
</Position5>
<Position6>
<Filename Value="test_write_formula.pas"/>
<Caret Line="35" Column="22" TopLine="3"/>
</Position6>
<Position7>
<Filename Value="test_write_formula.pas"/>
<Caret Line="13" Column="42" TopLine="1"/>
</Position7>
<Position8>
<Filename Value="../../xlsbiff8.pas"/>
<Caret Line="524" Column="14" TopLine="493"/>
</Position8>
<Position9>
<Filename Value="../../fpspreadsheet.pas"/>
<Caret Line="1147" Column="27" TopLine="1123"/>
</Position9>
<Position10>
<Filename Value="../../xlsbiff8.pas"/>
<Caret Line="124" Column="25" TopLine="94"/>
</Position10>
<Position11>
<Filename Value="../../fpspreadsheet.pas"/>
<Caret Line="1072" Column="74" TopLine="1067"/>
</Position11>
<Position12>
<Filename Value="../../fpspreadsheet.pas"/>
<Caret Line="206" Column="70" TopLine="175"/>
</Position12>
<Position13>
<Filename Value="../../xlsbiff8.pas"/>
<Caret Line="850" Column="14" TopLine="831"/>
</Position13>
<Position14>
<Filename Value="../../xlsbiff8.pas"/>
<Caret Line="104" Column="35" TopLine="102"/>
</Position14>
<Position15>
<Filename Value="../../xlscommon.pas"/>
<Caret Line="81" Column="76" TopLine="49"/>
</Position15>
<Position16>
<Filename Value="../../xlscommon.pas"/>
<Caret Line="40" Column="1" TopLine="17"/>
</Position16>
<Position17>
<Filename Value="../../xlscommon.pas"/>
<Caret Line="145" Column="41" TopLine="129"/>
</Position17>
<Position18>
<Filename Value="../../xlscommon.pas"/>
<Caret Line="91" Column="40" TopLine="69"/>
</Position18>
<Position19>
<Filename Value="../../xlscommon.pas"/>
<Caret Line="149" Column="3" TopLine="128"/>
</Position19>
<Position20>
<Filename Value="../../xlsbiff8.pas"/>
<Caret Line="104" Column="35" TopLine="102"/>
</Position20>
<Position21>
<Filename Value="../../xlsbiff8.pas"/>
<Caret Line="857" Column="72" TopLine="835"/>
</Position21>
<Position22>
<Filename Value="test_write_formula.pas"/>
<Caret Line="52" Column="1" TopLine="18"/>
</Position22>
<Position23>
<Filename Value="test_write_formula.pas"/>
<Caret Line="42" Column="27" TopLine="20"/>
</Position23>
<Position24>
<Filename Value="test_write_formula.pas"/>
<Caret Line="45" Column="15" TopLine="23"/>
</Position24>
<Position25>
<Filename Value="test_write_formula.pas"/>
<Caret Line="46" Column="38" TopLine="23"/>
</Position25>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>
<Version Value="10"/>
@ -196,6 +57,9 @@
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Other>
<CompilerMessages>
<UseMsgFile Value="True"/>
</CompilerMessages>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>

View File

@ -42,12 +42,12 @@ begin
MyWorksheet.WriteFormula(1, 2, MyFormula); // C3
SetLength(MyRPNFormula, 2);
MyRPNFormula[0].ElementKind := fekOpSUM;
MyRPNFormula[1].ElementKind := fekCellRange;
MyRPNFormula[1].Row := 1;
MyRPNFormula[1].Row := 4;
MyRPNFormula[1].Col := 3;
MyRPNFormula[1].Col := 3;
MyRPNFormula[0].ElementKind := fekCellRange;
MyRPNFormula[0].Row := 1;
MyRPNFormula[0].Row2 := 4;
MyRPNFormula[0].Col := 3;
MyRPNFormula[0].Col2 := 3;
MyRPNFormula[1].ElementKind := fekOpSUM;
MyWorksheet.WriteRPNFormula(1, 2, MyRPNFormula); // C2
end;

View File

@ -860,18 +860,36 @@ begin
{ Additional data }
case TokenID of
{ Operand Tokens }
//fekCell: Result := INT_EXCEL_TOKEN_TREFR;
{ binary operation tokens }
INT_EXCEL_TOKEN_TAREA_R: { fekCellRange }
begin
{
Cell range address, BIFF8:
Offset Size Contents
0 2 Index to first row (065535) or offset of first row (method [B], -3276832767)
2 2 Index to last row (065535) or offset of last row (method [B], -3276832767)
4 2 Index to first column or offset of first column, with relative flags (see table above)
6 2 Index to last column or offset of last column, with relative flags (see table above)
}
AStream.WriteWord(WordToLE(AFormula[i].Row));
AStream.WriteWord(WordToLE(AFormula[i].Row2));
AStream.WriteWord(WordToLE(AFormula[i].Col));
AStream.WriteWord(WordToLE(AFormula[i].Col2));
Inc(RPNLength, 8);
end;
INT_EXCEL_TOKEN_TADD, INT_EXCEL_TOKEN_TSUB, INT_EXCEL_TOKEN_TMUL,
INT_EXCEL_TOKEN_TDIV, INT_EXCEL_TOKEN_TPOWER: begin end;
INT_EXCEL_TOKEN_TNUM:
INT_EXCEL_TOKEN_TNUM: { fekNum }
begin
AStream.WriteBuffer(AFormula[i].DoubleValue, 8);
Inc(RPNLength, 8);
end;
{ binary operation tokens }
INT_EXCEL_TOKEN_TADD, INT_EXCEL_TOKEN_TSUB, INT_EXCEL_TOKEN_TMUL,
INT_EXCEL_TOKEN_TDIV, INT_EXCEL_TOKEN_TPOWER: begin end;
INT_EXCEL_TOKEN_TREFR, INT_EXCEL_TOKEN_TREFV, INT_EXCEL_TOKEN_TREFA:
begin
AStream.WriteWord(AFormula[i].Row and MASK_EXCEL_ROW);
@ -879,6 +897,17 @@ begin
Inc(RPNLength, 3);
end;
{ Other operations }
INT_EXCEL_TOKEN_TATTR: { fekOpSUM }
begin
// Uniry SUM Operation
AStream.WriteByte($10);
AStream.WriteByte(0);
AStream.WriteByte(0);
Inc(RPNLength, 3);
end;
else
end;
end;
@ -1526,13 +1555,31 @@ var
Data: array [0..7] of BYTE;
Flags: WORD;
FormulaSize: BYTE;
i: Integer;
begin
{ BIFF Record header }
{ BIFF Record data }
{ Index to XF Record }
ReadRowColXF(AStream,ARow,ACol,XF);
{ Result of the formula in IEE 754 floating-point value }
AStream.ReadBuffer(Data,Sizeof(Data));
{ Options flags }
Flags:=WordLEtoN(AStream.ReadWord);
AStream.ReadDWord; //Not used.
FormulaSize:=AStream.ReadByte;
{ Not used }
AStream.ReadDWord;
{ Formula size }
FormulaSize := WordLEtoN(AStream.ReadWord);
{ Formula data, outputed as debug info }
{ Write('Formula Element: ');
for i := 1 to FormulaSize do
Write(IntToHex(AStream.ReadByte, 2) + ' ');
WriteLn('');}
//RPN data not used by now
AStream.Position:=AStream.Position+FormulaSize;

View File

@ -43,11 +43,21 @@ const
INT_EXCEL_TOKEN_FUNCVAR_R = $22;
INT_EXCEL_TOKEN_FUNCVAR_V = $42;
INT_EXCEL_TOKEN_FUNCVAR_A = $62;
INT_EXCEL_TOKEN_TAREA_R = $25;
{ Built-in functions }
INT_EXCEL_SHEET_FUNC_ABS = 24;
INT_EXCEL_SHEET_FUNC_ROUND = 27;
{ Control Tokens, Special Tokens }
// 01H tExp Matrix formula or shared formula
// 02H tTbl Multiple operation table
// 15H tParen Parentheses
// 18H tNlr Natural language reference (BIFF8)
INT_EXCEL_TOKEN_TATTR = $19; // tAttr Special attribute
// 1AH tSheet Start of external sheet reference (BIFF2-BIFF4)
// 1BH tEndSheet End of external sheet reference (BIFF2-BIFF4)
{ Built In Color Pallete Indexes }
BUILT_IN_COLOR_PALLETE_BLACK = $08; // 000000H
BUILT_IN_COLOR_PALLETE_WHITE = $09; // FFFFFFH
@ -148,7 +158,7 @@ begin
case AElementKind of
{ Operand Tokens }
fekCell: Result := INT_EXCEL_TOKEN_TREFR;
fekCellRange: Result := INT_EXCEL_TOKEN_TRANGE;
fekCellRange: Result := INT_EXCEL_TOKEN_TAREA_R;
fekNum: Result := INT_EXCEL_TOKEN_TNUM;
{ Basic operations }
fekAdd: Result := INT_EXCEL_TOKEN_TADD;
@ -159,7 +169,7 @@ begin
fekABS: Result := INT_EXCEL_SHEET_FUNC_ABS;
fekROUND: Result := INT_EXCEL_SHEET_FUNC_ROUND;
{ Other operations }
fekOpSUM: Result := 0;
fekOpSUM: Result := INT_EXCEL_TOKEN_TATTR;
else
Result := 0;
end;